So verwenden Sie SearchView in der Symbolleiste Android

124

Der Code, an dem ich arbeite, verwendet a Toolbarund bläst a auf menu.

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 einen SearchKnopf in der tool_bar. Ich habe es geschafft, ich habe hier eine Anleitung befolgt. Wenn ich versuche, etwas zu schreiben, um zu suchen, den Toast, den ich zum Testen des listenernie gezeigten gesetzt hatte. was anzeigt listener, funktioniert nicht

@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;

}
Shudy
quelle

Antworten:

205

Sie müssen dafür die AppcompatBibliothek 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="androidx.appcompat.widget.SearchView"
        android:title="Search"/>
</menu>

Aktivitätsdatei (in Java):

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);
}

Aktivitätsdatei (in Kotlin):

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_search, menu)

    val searchItem: MenuItem? = menu?.findItem(R.id.action_search)
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView: SearchView? = searchItem?.actionView as SearchView

    searchView?.setSearchableInfo(searchManager.getSearchableInfo(componentName))
    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" />

Und endlich Ihren SearchResultsActivityKlassencode. um das Ergebnis Ihrer Suche anzuzeigen.

Sagar Maiyad
quelle
18
Beachten Sie, dass Sie jetzt solltenimport android.support.v7.widget.SearchView
Joaquin Iurchuk
Vielen Dank, eine Idee, wie man mit dem "Go" -Klick umgeht? es würde helfen
Bala Vishnu
2
Ich werde nur die offizielle Dokumentation verlinken, in der Sie auch erfahren, wie Sie auf die Abfrage developer.android.com/training/search/setup.html
koesclem
2
Beachten Sie die App: actionViewClass anstelle von android: actionViewClass
DragonT
1
Wenn Sie auf AndroidX migriert sind, verwenden Sie:androidx.appcompat.widget.SearchView
Daniil
169

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

Schritt 1 - Fügen Sie 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ügen Sie die Logik zu Ihrem hinzuonCreateOptionsMenu()

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;
}
tm1701
quelle
29
Diese Antwort ist weitaus hilfreicher, wenn Sie keine neue Aktivität erstellen / verschieben möchten, wenn ein Benutzer die Suchabfrage gesendet hat. Auf diese Weise können Sie bei derselben Aktivität / demselben Fragment bleiben und nur eine Ansicht basierend auf den Benutzereingaben aktualisieren. Tolles Zeug.
Nick.D
3
UserFeedback ... ist meine Toast-ähnliche Methode.
tm1701
Tastatureingabe nicht in
Suchansicht
Was ist R.menu.main?
Alston
public void onCreateOptionsMenu (Menü @NonNull Menu, @NonNull MenuInflater inflater) {} Sie können diese Methode direkt aufrufen. Hier können Sie ein eigenes Menü infiltrieren und diese Direktolyse von Fragment aus verarbeiten, ohne Aktivität zu verwenden. netter Dank
Amar Singh
39

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>

Ali
quelle
2
Wenn Sie die Unterstützung SearchView verwenden, vergessen Sie nicht, sie auch wie android.support.v7.widget.SearchViewin XML zu deklarieren .
Verlassener Wagen
Vergessen Sie nicht, in gradle hinzuzufügenimplementation 'com.android.support:design:$latest_version'
Ali
Was ist symbolisiert ?
IgorGanapolsky
"Wenn das Suchfeld immer sichtbar sein soll, rufen Sie setIconifiedByDefault (false) aus den Dokumenten auf
noe
16

Integration von SearchView in RecyclerView

1) Fügen Sie das SearchView-Element im Menü hinzu

SearchViewkann wie actionViewim Menü mit 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.OnQueryTextListenerhat zwei abstrakte Methoden. Nach der Implementierung des SearchView-Textlisteners würde Ihr Aktivitätsskelett nun so aussehen.

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3) Richten Sie SerchView Hint-Text, Listener usw. Ein

@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 der Namen anzuzeigen, die den in das Feld eingegebenen Text enthält SearchView.

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();
}

Ein vollständiges Beispiel für einen funktionierenden Code finden Sie> HIER.
Sie können den Code in SearchView auch mit einer SQLite-Datenbank in dieser Musik-App überprüfen

Rohit Singh
quelle
Warum ist ein Menü notwendig?
IgorGanapolsky
1

Implementieren der SearchView ohne Verwendung der menu.xmlDatei und Öffnen durch Schaltfläche

In Ihrem ActivityFall müssen wir die Methode der onCreateOptionsMenuMethode verwenden, mit der wir die programmgesteuert aufblasenSearchView

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;
    }

Und in Ihrer Aktivitätsklasse können Sie die SearchViewSchaltfläche auf eine beliebige Schaltfläche wie unten klicken

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
Ravindra Kushwaha
quelle