Cara menggunakan SearchView di Toolbar Android

124

Kode tempat saya bekerja, menggunakan a Toolbardan memekarkan a menu.

Ini kodenya

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 ()
    {
    ..........
    }
}

Tapi sekarang, mereka membutuhkan Searchtombol di tool_bar. Saya berhasil meletakkannya, saya mengikuti panduan di sini Ketika saya mencoba menulis sesuatu untuk dicari, roti panggang yang telah saya uji listenertidak pernah ditampilkan. yang menunjukkan listenertidak berfungsi

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

Jawaban:

205

Anda harus menggunakan Appcompatperpustakaan untuk itu. Yang digunakan seperti di bawah ini:

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>

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

File aktivitas (di 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)
}

file manifes:

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

file xml yang dapat dicari:

<?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" />

Dan terakhir, SearchResultsActivitykode kelas Anda . untuk menampilkan hasil pencarian Anda.

Sagar Maiyad
sumber
18
Perhatikan bahwa sekarang Anda harusimport android.support.v7.widget.SearchView
Joaquin Iurchuk
Terima kasih, ada ide tentang cara menangani klik "Mulai"? itu akan membantu
Bala Vishnu
2
Saya hanya akan menautkan dokumentasi resmi tempat Anda juga dapat menemukan cara bereaksi terhadap kueri developer.android.com/training/search/setup.html
koesclem
2
Perhatikan aplikasi: actionViewClass, bukan android: actionViewClass
DragonT
1
Jika Anda telah bermigrasi ke penggunaan androidX:androidx.appcompat.widget.SearchView
Daniil
169

Jika Anda ingin mengatur fasilitas pencarian di dalam Anda Fragment, cukup tambahkan beberapa baris berikut:

Langkah 1 - Tambahkan bidang pencarian untuk Anda 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"/>

Langkah 2 - Tambahkan logika ke fileonCreateOptionsMenu()

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
sumber
29
Jawaban ini jauh lebih berguna jika Anda tidak ingin membuat / pindah ke aktivitas baru ketika pengguna telah mengirimkan permintaan pencarian. Ini akan memungkinkan Anda untuk tetap pada aktivitas / fragmen yang sama dan hanya memperbarui tampilan berdasarkan masukan pengguna. Barang bagus.
Nick. D
3
UserFeedback ... adalah metode serupa Toast saya.
tm1701
Masukan keyboard tidak diambil dalam tampilan penelusuran
Saravanan
Apa R.menu.main?
Alston
public void onCreateOptionsMenu (menu Menu @NonNull, @NonNull MenuInflater inflater) {} Anda bisa langsung memanggil metode ini di sini Anda bisa menyusup ke menu sendiri, dan menangani directoly ini dari fragmen tanpa menggunakan aktivitas. terima kasih yang baik
Amar Singh
40

Jika Anda ingin menambahkannya langsung di toolbar.

<?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
sumber
2
Jika Anda menggunakan dukungan SearchView, jangan lupa untuk mendeklarasikannya juga android.support.v7.widget.SearchViewdalam XML.
Keranjang Terbengkalai
jangan lupa untuk menambahkan gradleimplementation 'com.android.support:design:$latest_version'
Ali
Apa yang diikonkan ?
IgorGanapolsky
¨Jika Anda ingin bidang pencarian selalu terlihat, panggil setIconifiedByDefault (false) ¨ dari dokumen
noe
16

Mengintegrasikan SearchView dengan RecyclerView

1) Tambahkan Item SearchView di Menu

SearchViewdapat ditambahkan seperti actionViewpada menu menggunakan

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) Terapkan SearchView.OnQueryTextListener di Aktivitas Anda

SearchView.OnQueryTextListenermemiliki dua metode abstrak. Jadi kerangka aktivitas Anda sekarang akan terlihat seperti ini setelah menerapkan pemroses teks SearchView.

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3) Siapkan teks SerchView Hint, pendengar, dll

@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) Terapkan SearchView.OnQueryTextListener

Ini adalah bagaimana Anda bisa mengimplementasikan metode abstrak pendengar.

@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) Tulis metode filter di Adaptor RecyclerView Anda.

Anda dapat membuat logika Anda sendiri berdasarkan kebutuhan Anda. Berikut adalah contoh cuplikan kode untuk menampilkan daftar Nama yang berisi teks yang diketik di 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();
}

Sampel kode yang berfungsi lengkap dapat ditemukan> DI SINI
Anda juga dapat melihat kode di SearchView dengan database SQLite di Aplikasi Musik ini

Rohit Singh
sumber
Mengapa menu itu penting?
IgorGanapolsky
1

Menerapkan SearchView tanpa menggunakan menu.xmlfile dan tombol buka melalui

Di Anda, Activitykami perlu menggunakan metode onCreateOptionsMenumetode di mana kami secara terprogram akan mengembangkan fileSearchView

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

Dan di kelas Aktivitas Anda, Anda dapat membuka SearchViewklik tombol apa saja pada toolbar seperti di bawah ini

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
Ravindra Kushwaha
sumber