我正在尝试按照此处的示例在现有应用中实施搜索:
http://www.materialdoc.com/search-filter/
该应用程序使用片段替换来更改显示,因此我尝试在另一个片段中显示结果,而不是创建另一个活动。问题是当输入搜索字符串并且放大类是它时,不会调用任何处理程序。
我认为主要问题出在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));
使用setSearchableInfo()
致电MainActivity.class
不会做任何事情,并使用SearchListFragment.class
调用它会导致NPE。
我在这里创建了一个SSCCE:
https://github.com/emnrd-ito/SearchFragmentTest
你能看到如何解决这个问题吗?
答案 0 :(得分:1)
以下内容可以帮助您完成大部分工作:
按以下方式更改您的清单:
<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>
这包括一个新的启动模式或&#34; singleTop&#34;,&#34;搜索&#34;意图,以及所需的meta-data
。
在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。
我认为这些都是修改。这不是一个完整的解决方案,但我希望它能帮助你找到剩下的工作。