我正在构建一个包含搜索视图的 SearchableActivity。
当用户提交搜索时,SearchableActivity
将显示结果,同时我将在选项菜单名称“到结果列表”中添加一项,该项目将重定向到 ResultListActivity,以列表布局显示搜索结果。
工作流程可以描述如下:
1 用户单击操作栏中的搜索图标并输入内容并提交。
2SearchableActivity
以新的意图接收查询,并执行搜索工作。
3 接收结果,显示它们。最重要的工作是通过使用包含“To Result List”项的新菜单布局文件扩展菜单来使选项菜单无效。
4 当用户点击“到结果列表”时,启动ResultListActivity
.
我几乎完成了这项工作:
public class SearchableActivity extends ActionBarActivity {
private TextView textView;
private SearchView searchView;
private int status = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_searchable);
textView = (TextView) findViewById(R.id.result);
handleIntent(getIntent());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
switch (status) {
case 0:
getMenuInflater().inflate(R.menu.home_default, menu);
break;
case 1:
getMenuInflater().inflate(R.menu.home_2, menu);
break;
}
setupSearchView(menu);
return super.onCreateOptionsMenu(menu);
}
private void setupSearchView(Menu menu) {
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.clearFocus();
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
performSearch(query);
}
}
private void performSearch(String query) {
textView.setText(query + " result \n");
status = 1;
searchView.clearFocus();
ActivityCompat.invalidateOptionsMenu(this);
}
}
home_default.xml:
...
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_menu_search"
com.demo:actionViewClass="android.support.v7.widget.SearchView"
com.demo:showAsAction="always|collapseActionView"/>
...
home_2.xml:
...
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_menu_search"
com.demo:actionViewClass="android.support.v7.widget.SearchView"
com.demo:showAsAction="always|collapseActionView"/>
<item
android:id="@+id/action_toResultList"
android:title="@string/action_toList"
com.demo:showAsAction="always"/>
...
但是,我遇到了一些问题:
1 在工作流程第 3 步中,我将取消选项菜单以添加新项目,但是我发现如果菜单再次膨胀,SerchView
则会聚焦并显示输入键盘,如下所示:
如代码所示,我已经调用了,searchView.clearFocus()
但它似乎不起作用。
如果我评论这条线
ActivityCompat.invalidateOptionsMenu(this);
搜索后,画面是这样的:
2 当我在搜索后更改屏幕方向时,我会得到一个NullPointException
at 行searchView.clearFocus();
并且应用程序将退出。
有什么问题?