我正在尝试按照此处的示例在现有应用中实现搜索:
http://www.materialdoc.com/search-filter/
该应用程序使用 fragment 替换来更改显示,因此我没有创建另一个 Activity ,而是尝试在另一个 fragment 中显示结果。问题在于,当输入搜索字符串并且放大类就是它时,不会调用任何处理程序。
我认为主要问题在于 MainActivity.onCreateOptionsMenu()
中的这段代码:
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
ComponentName componentName = new ComponentName(this, MainActivity.class);
// ComponentName componentName = new ComponentName(this, SearchListFragment.class); // results in NPE
searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));
用 MainActivity.class
调用 setSearchableInfo()
什么都不做,用 SearchListFragment.class
调用它会导致 NPE。
我在这里创建了一个 SSCCE:
https://github.com/emnrd-ito/SearchFragmentTest
你能知道如何解决这个问题吗?
最佳答案
以下内容应该可以帮助您完成大部分工作:
如下更改您的 list :
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
这包括新的启动模式或“singleTop”、“搜索” Intent 和所需的元数据
。
在 MainActivity 中:
OnCreateOptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
// ComponentName componentName = new ComponentName(this, SearchListFragment.class);
// searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));
return true;
}
onNewIntent
@Override
public void onNewIntent(Intent intent) {
Log.d("onNewIntent", "here!");
}
您必须展开 onNewIntent
才能进行搜索。 Intent
包含搜索条件。参见 this了解详情。
我认为这些是所有的修改。这不是一个完整的解决方案,但我希望它能让您走上解决其余问题的道路。
关于android - 在 Fragment 而不是 Activity 中显示搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539590/