Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent activity to reload when clicking on SearchView

I have an activity with the new Toolbar. In this toolbar i have only one icon... my SearchView icon. When i click on that icon it opens an EditText in the Toolbar and im able to write what im looking for. The problem is that when i click on Search icon, the content of my Activity (FrameLayout with fragment) is reloaded.

EDIT:

plus: when click on icon, it reloads the activity and open EditText, after that the Activity SearchResult is called, and if i press the back button in that activity i return to the MainActivity and the searchview is still opened.

How to prevent that?

Thats my Manifest part of search (MainActivity has the icon):

<meta-data
            android:name="android.app.default_searchable"
            android:value=".activity.SearchResult_" />

        <activity
            android:name=".activity.MainActivity_"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activity.SearchResult_"
            android:label="@string/title_activity_search_result"
            android:screenOrientation="portrait" >
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />

            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
        </activity>

Thast my OnCreateOptionsMenu:

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);

        SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
        {
            public boolean onQueryTextChange(String newText)
            {
                Log.d("Query", newText);
                return true;
            }

            public boolean onQueryTextSubmit(String query)
            {
                Log.d("Search", query);
                SearchResult_.intent(MainActivity.this).extra("query", query).start();
                return true;
            }
        };

        SearchView searchView = null;
        if (searchItem != null) {
            searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        }
        if (searchView != null) {
            searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
        }

        return super.onCreateOptionsMenu(menu);
    }
like image 815
WitaloBenicio Avatar asked Apr 20 '15 20:04

WitaloBenicio


2 Answers

I know I am late to the thread, but here is the proper solution. The way the SearchView default behavior works is that it will automatically send an ACTION.SEARCH intent to the searchable activity declared in your manifest. Upon sending, it will create a new instance of that activity, so that the onCreate() method can be called and the intent can be handled.

In order to work around this behavior, simply declare the launchMode for the searchable activity as 'SingleTop'. android:launchMode="singleTop"

According to Android documentation for "singleTop" (https://developer.android.com/guide/components/activities/tasks-and-back-stack): "If an instance of the activity already exists at the top of the current task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity." If you declare your searchable activity as 'singleTop', make sure you override onNewIntent() and handle the ACTION.SEARCH intent data accordingly.

like image 102
qslabs Avatar answered Nov 09 '22 13:11

qslabs


In your onQueryTextSubmit method do: searchView.setQuery (query, false);

like image 22
Natan Avatar answered Nov 09 '22 13:11

Natan