Cách sử dụng SearchView trong Thanh công cụ Android


124

Mã mà tôi đang làm việc, đang sử dụng a Toolbarvà lạm phát a menu.

Đây là mã

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

Nhưng bây giờ, họ yêu cầu một Searchnút trong tool_bar. Tôi quản lý để đặt nó, tôi đã làm theo một hướng dẫn ở đây Khi tôi cố gắng viết một cái gì đó để tìm kiếm, bánh mì nướng tôi đã đặt để kiểm tra listenerkhông bao giờ được hiển thị. cho biết listenerkhông hoạt động

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

}

Câu trả lời:


205

Bạn phải sử dụng Appcompatthư viện cho điều đó. Được sử dụng như dưới đây:

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>

Tệp hoạt động (bằng 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);
}

Tệp hoạt động (trong 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)
}

tệp kê khai:

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

tập tin xml có thể tìm kiếm:

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

Và cuối cùng, SearchResultsActivitymã lớp của bạn . để hiển thị kết quả tìm kiếm của bạn.


18
Lưu ý rằng bây giờ bạn nênimport android.support.v7.widget.SearchView
Joaquin Iurchuk

Cảm ơn, có ý tưởng nào về cách xử lý nhấp chuột "Đi" không? nó sẽ giúp
Bala Vishnu

2
Tôi sẽ chỉ liên kết tài liệu chính thức nơi bạn cũng có thể tìm cách phản ứng với nhà phát triển
vấn.android.com/training/search/setup.html

2
Lưu ý ứng dụng: actionViewClass thay vì android: actionViewClass
DragonT

1
Nếu bạn đã di chuyển sang androidX, hãy sử dụng:androidx.appcompat.widget.SearchView
Daniil

169

Nếu bạn muốn thiết lập công cụ tìm kiếm bên trong mình Fragment, chỉ cần thêm một vài dòng sau:

Bước 1 - Thêm trường tìm kiếm cho bạn 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"/>

Bước 2 - Thêm logic vàoonCreateOptionsMenu()

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

29
Câu trả lời này hữu ích hơn nhiều nếu bạn không muốn tạo / chuyển sang một hoạt động mới khi người dùng đã gửi truy vấn tìm kiếm. Điều này sẽ cho phép bạn ở cùng một hoạt động / đoạn và chỉ cập nhật chế độ xem dựa trên đầu vào của người dùng. Công cụ tuyệt vời.
Nick.D

3
UserFeedback ... là phương pháp Toast-alike của tôi.
tm1701

Không nhập bàn phím trong chế độ xem tìm kiếm
Saravanan

Có gì R.menu.main?
Alston

public void onCreateOptionsMothy (menu Menu @NonNull, @NonNull MenuInflater) rất cảm ơn
Amar Singh

39

Nếu bạn muốn thêm nó trực tiếp trên thanh công cụ.

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


2
Nếu bạn đang sử dụng SearchView hỗ trợ, đừng quên khai báo nó như android.support.v7.widget.SearchViewtrong XML.
Giỏ hàng bị bỏ rơi

đừng quên thêm vào lớpimplementation 'com.android.support:design:$latest_version'
Ali

Biểu tượng là gì?
IgorGanapolsky

Nếu bạn muốn trường tìm kiếm luôn hiển thị, hãy gọi setIconifiedByDefault (false) từ các tài liệu
noe

16

Tích hợp SearchView với RecyclerView

1) Thêm mục SearchView trong Menu

SearchViewcó thể được thêm vào như actionViewtrong menu bằng cách sử dụng

ứng dụng: 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) Triển khai SearchView.OnQueryTextListener trong Hoạt động của bạn

SearchView.OnQueryTextListenercó hai phương pháp trừu tượng. Vì vậy, bộ xương hoạt động của bạn bây giờ sẽ trông như thế này sau khi triển khai trình nghe văn bản SearchView.

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3) Thiết lập văn bản Gợi ý SerchView, người nghe, v.v.

@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) Triển khai SearchView.OnQueryTextListener

Đây là cách bạn có thể thực hiện các phương thức trừu tượng của người nghe.

@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) Viết phương thức lọc trong Bộ điều hợp RecyclerView của bạn.

Bạn có thể đưa ra logic của riêng bạn dựa trên yêu cầu của bạn. Dưới đây là đoạn mã mẫu để hiển thị danh sách Tên chứa văn bản được nhập vào 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();
}

Có thể tìm thấy mẫu mã làm việc đầy đủ> TẠI ĐÂY
Bạn cũng có thể kiểm tra mã trên SearchView với cơ sở dữ liệu SQLite trong Ứng dụng Âm nhạc này


Tại sao thực đơn cần thiết?
IgorGanapolsky

1

Triển khai SearchView mà không sử dụng menu.xmltệp và mở qua nút

Theo bạn, Activitychúng ta cần sử dụng phương pháp của onCreateOptionsMenuphương thức mà chúng ta sẽ lập trình thổi phồngSearchView

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

Và trong lớp Activity của bạn, bạn có thể mở SearchViewnút bất kỳ, nhấp vào thanh công cụ như bên dưới

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.