wake-up-neo.com

So verwenden Sie SearchView in der Symbolleiste Android

Der Code, an dem ich arbeite, verwendet Toolbar und bläst ein menu auf.

Hier ist der Code

private Toolbar mToolbar;
mToolbar.inflateMenu(R.menu.chat_screen_menu);
setupMenu ();
private void setupMenu ()
   {
   mMenu = mToolbar.getMenu();
   if (mMenu != null)
      {
       if (mChatPager != null && mChatPager.getCurrentItem() > 0)
          {
          mMenu.setGroupVisible(R.id.menu_group_chats, true);
          mMenu.setGroupVisible(R.id.menu_group_contacts, false);
          }
       else
          {
           mMenu.setGroupVisible(R.id.menu_group_chats, false);
           mMenu.setGroupVisible(R.id.menu_group_contacts, true);
           mMenu.setGroupVisible(R.id.menu_group_otr_verified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_unverified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_off,false);
          }
    }
    mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener ()
    {
    ..........
    }
}

Aber jetzt benötigen sie eine Search-Taste im tool_bar. Ich habe es formuliert, ich folgte einer Anleitung hier Wenn ich versuche, etwas zu schreiben, habe ich den Toast, den ich testen wollte listener wurde nie gezeigt. was bedeutet, dass listener nicht funktioniert 

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.chat_screen_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_menu_search));
    final Toast toast = new Toast(mApp);

    if (mSearchView != null )
    {
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
        {
            public boolean onQueryTextChange(String newText)
            {
                mSearchString = newText;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
                return true;
            }

            public boolean onQueryTextSubmit(String query)
            {
                mSearchString = query;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();

                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);
    }

    return true;

}
104
Shudy

Dazu müssen Sie die Appcompat-Bibliothek verwenden. Welches wird wie folgt verwendet:

dashboard.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" 
      xmlns:tools="http://schemas.Android.com/tools"
      xmlns:app="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/action_search"
        Android:icon="@Android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="Android.support.v7.widget.SearchView"
        Android:title="Search"/>
</menu>

Aktivitätsdatei:

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.dashboard, menu);

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

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

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

Manifestdatei:

<meta-data 
      Android:name="Android.app.default_searchable" 
      Android:value="com.apkgetter.SearchResultsActivity" /> 

        <activity
            Android:name="com.apkgetter.SearchResultsActivity"
            Android:label="@string/app_name"
            Android:launchMode="singleTop" >
            <intent-filter>
                <action Android:name="Android.intent.action.SEARCH" />
            </intent-filter>
            <intent-filter>
                <action Android:name="Android.intent.action.VIEW" />
            </intent-filter>

            <meta-data
                Android:name="Android.app.searchable"
                Android:resource="@xml/searchable" />
        </activity>

durchsuchbare XML-Datei:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:hint="@string/search_hint"
    Android:label="@string/app_name" />

Zum Schluss noch Ihren SearchResultsActivity-Klassencode. für das Ergebnis Ihrer Suche.

185
Riser

Wenn Sie die Suchfunktion in Ihrer Fragment einrichten möchten, fügen Sie einfach die folgenden Zeilen hinzu: 

Schritt 1 - Füge das Suchfeld hinzu toolbar

<item
    Android:id="@+id/action_search"
    Android:icon="@Android:drawable/ic_menu_search"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    Android:title="Search"/>

Schritt 2 - Füge die Logik zu deiner onCreateOptionsMenu() hinzu

import Android.support.v7.widget.SearchView; // not the default !

@Override
public boolean onCreateOptionsMenu( Menu menu) {
    getMenuInflater().inflate( R.menu.main, menu);

    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    searchView = (SearchView) myActionMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // Toast like print
            UserFeedback.show( "SearchOnQueryTextSubmit: " + query);
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            myActionMenuItem.collapseActionView();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            // UserFeedback.show( "SearchOnQueryTextChanged: " + s);
            return false;
        }
    });
    return true;
}
149
tjm1706

Wenn Sie es direkt in der Symbolleiste hinzufügen möchten.

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.AppBarLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/app_bar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <SearchView
            Android:id="@+id/searchView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:iconifiedByDefault="false"
            Android:queryHint="Search"
            Android:layout_centerHorizontal="true" />

    </Android.support.v7.widget.Toolbar>

</Android.support.design.widget.AppBarLayout>

24
Ali

SearchView in RecyclerView integrieren

1) SearchView-Element im Menü hinzufügen

SearchView kann mit actionView im Menü hinzugefügt werden 

app: useActionClass = "Android.support.v7.widget.SearchView" . 

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="rohksin.com.searchviewdemo.MainActivity">
<item
    Android:id="@+id/searchBar"
    app:showAsAction="always"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    />
</menu>

2) Implementieren Sie SearchView.OnQueryTextListener in Ihrer Aktivität

SearchView.OnQueryTextListener hat zwei abstrakte Methoden. Nach der Implementierung des SearchView-Textlisteners würde Ihr Aktivitätsgerüst nun also so aussehen.

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3) Richten Sie den SerchView Hint - Text, den Listener etc

@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.searchBar);

    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setQueryHint("Search People");
    searchView.setOnQueryTextListener(this);
    searchView.setIconified(false);

    return true;
}

4) Implementieren Sie SearchView.OnQueryTextListener

So können Sie abstrakte Methoden des Listeners implementieren.

@Override
public boolean onQueryTextSubmit(String query) {

    // This method can be used when a query is submitted eg. creating search history using SQLite DB

    Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onQueryTextChange(String newText) {

    adapter.filter(newText);
    return true;
}

5) Schreiben Sie eine Filtermethode in Ihren RecyclerView-Adapter.

Sie können Ihre eigene Logik basierend auf Ihren Anforderungen entwickeln. Hier ist das Beispielcode-Snippet, um die Liste mit Name anzuzeigen, die den in SearchView eingegebenen Text enthält. 

public void filter(String queryText)
{
    list.clear();

    if(queryText.isEmpty())
    {
        list.addAll(copyList);
    }
    else
    {

        for(String name: copyList)
        {
            if(name.toLowerCase().contains(queryText.toLowerCase()))
            {
                list.add(name);
            }
        }

    }

    notifyDataSetChanged();
}

Das vollständige Arbeitscode-Beispiel finden Sie> HIER
Sie können den Code in SearchView auch mit einer SQLite-Datenbank in dieser Music App auschecken. 

11
Rohit Singh

Implementierung von SearchView ohne Verwendung der menu.xml-Datei und Öffnen über die Schaltfläche

In Ihrer Activity müssen wir die Methode der onCreateOptionsMenu-Methode verwenden, in der wir die Serchview programmgesteuert aufblasen werden.

private MenuItem searchMenu;
private String mSearchString="";

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

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


        SearchView mSearchView = new SearchView(getSupportActionBar().getThemedContext());
        mSearchView.setQueryHint(getString(R.string.Prompt_search)); /// YOUR HINT MESSAGE
        mSearchView.setMaxWidth(Integer.MAX_VALUE);

        searchMenu = menu.add("searchMenu").setVisible(false).setActionView(mSearchView);
        searchMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);


        assert searchManager != null;
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                mSearchString = newText;

                return true;
            }

            public boolean onQueryTextSubmit(String query) {
                mSearchString = query;

                searchMenu.collapseActionView();


                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);


        return true;
    }

In Ihrer Aktivitätsklasse können Sie die Variable SearchView auf jeder Schaltfläche öffnen, die Sie in der Symbolleiste wie unten klicken

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
0