如何在 Android 工具栏中使用 SearchView

我正在研究的代码使用的是 Toolbarmenu

这是密码

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

但是现在,他们需要一个 Search按钮在 tool_bar。 我设法把它,我按照指南 给你 当我试图写一些东西来搜索时,我放在测试 listener的祝酒词从来没有显示出来。 这说明 listener不起作用

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


}
222994 次浏览

你必须使用 Appcompat库,它的使用方法如下:

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>

活动档案(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);
}

活动档案(科特林) :

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

清单文件:

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

可搜索的 xml 文件:

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

最后,您的 SearchResultsActivity类代码。显示您的搜索结果。

如果你想在你的 Fragment中设置搜索工具,只需添加以下几行:

步骤1 -添加搜索字段到你的 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"/>

步骤2 -将逻辑添加到 onCreateOptionsMenu()

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

如果要直接将其添加到工具栏中。

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

集成 SearchView 和侯赛因视图

1)在菜单中添加 SearchView 项

SearchView可以添加为菜单中的 actionView使用

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)在活动中实现 SearchView.OnQueryTextListener

SearchView.OnQueryTextListener有两个抽象方法。所以在实现 SearchView 文本侦听器之后,您的活动框架现在看起来应该是这样的。

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{


public boolean onQueryTextSubmit(String query)


public boolean onQueryTextChange(String newText)


}

3)设置 SerchView 提示文本、监听器等

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

这就是如何实现侦听器的抽象方法。

@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)在回收视图适配器中编写一个过滤器方法。

您可以根据自己的需求提出自己的逻辑。下面是显示 Name 列表的示例代码片段,其中包含在 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();
}

完整的工作代码示例可以找到 > 给你
您还可以使用此 音乐应用中的 SQLite 数据库在 SearchView 上查看代码

在不使用 menu.xml文件的情况下实现 SearchView 并通过按钮打开

在您的 Activity中,我们需要使用 onCreateOptionsMenu方法的方法,在这个方法中,我们将以编程方式充气 SearchView

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

在 Activity 类中,您可以在工具栏上的任何按钮上打开 SearchView,如下所示

YOUR_BUTTON.setOnClickListener(view -> {


searchMenu.expandActionView();


});

我搜索并实现了很多代码,但这对我来说不起作用。 然后在 XML 文件中实现自定义工具栏,然后在工具栏标记中使用 searchview 标记。 希望对你有用。