2

我正在构建一个包含搜索视图的 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();并且应用程序将退出。

有什么问题?

4

1 回答 1

0

Well, to remove the query from your SearchView you must do:

searchView.setQuery("", false);

To close your SearchView then you must do:

MenuItem menuItem = menu.findItem(R.id.menu_perfil_search);
MenuItemCompat.collapseActionView(menuItem);

Don't forget that when you call invalidateOptionsMenu() Android will trigger the onPrepareOptionsMenu()!

于 2014-12-02T10:57:48.593 回答