隐藏ActionBar菜单时,SearchView会聚焦

时间:2011-09-30 00:52:48

标签: android search android-actionbar

我有一个带有SearchView的ActionBar。选择菜单按钮时,隐藏/溢出菜单项将显示在下拉列表的右侧。隐藏下拉菜单时,SearchView会聚焦并显示键盘。有没有办法阻止键盘显示(触摸SearchView的情况除外)?

此致 朱利。

编辑以下添加的代码: 以下是我如何初始化它:

        SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
        ((SearchView) mSearchView).setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));

        mSearchView.setIconifiedByDefault(mIconified);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnCloseListener(this);
        mSearchView.setFocusable(false);
        mSearchView.setFocusableInTouchMode(false);

        if(null!=mQuery)
            mSearchView.setQuery(mQuery, false);

编辑2:

以下是用户想要开始搜索时的操作:

    @Override
    public boolean onQueryTextSubmit(String query) {
        // Hide keyboard
        InputMethodManager imm = (InputMethodManager) mActivity.getSystemService(
                FragmentActivity.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);

...

        mSearchView.setFocusable(false);
        mSearchView.setFocusableInTouchMode(false);

        return true;
    }

6 个答案:

答案 0 :(得分:31)

尝试在初始化searchView时调用mSearchView.clearFocus()。当我遇到类似的问题时,这对我有用。

答案 1 :(得分:7)

尝试在SearchView上调用setFocusable(false)。

答案 2 :(得分:2)

我在片段中创建选项菜单时实例化了搜索视图,但上述方法都不适用于我。

但是,我能够通过保持对SearchView的引用来解决问题,而不是在onCreateOptionsMenu()中设置SearchView的图标化设置,而是在片段恢复时将其设置在帖子上,如下所示:

@Override
public void onResume() {
    super.onResume();
    getView().post(new Runnable() {
        public void run() {
            if (mFilterView.isIconfiedByDefault()) {
                mFilterView.setIconifiedByDefault(false);
                mFilterView.clearFocus();
            }
        }
    });
}

答案 3 :(得分:1)

为另一个视图调用requestFocus(),理想情况下是结果视图,例如

_resultsFragment.getView().requestFocus();

答案 4 :(得分:1)

我刚刚在同一个问题上拔头发。

我试过android:focusable =“false”。我尝试了InputMethodManager。我尝试创建一个虚拟视图来获得焦点,但没有任何效果。

我终于使用onCreateOptionsMenu()中的以下代码解决了它:

final ViewTreeObserver observer = mSearchView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
    @Override
    public void onGlobalLayout() {
        observer.removeOnGlobalLayoutListener(this);
        mSearchView.clearFocus();
    }
});

问题是,在片段生命周期的每个点上,菜单尚未创建。 onCreateOptionsMenu()方法是在onResume()之后调用的,但只在我测试过的某些设备上调用,这真的很奇怪。

上述代码确保在创建页面期间任何焦点更改后清除焦点。

我希望这可以帮助别人,从一开始我就可以节省很多时间来了解这一点。

答案 5 :(得分:0)

在XML布局文件中设置SearchView时(如果您使用的是),只需使用:

android:focusable="false"

使用这种方法,在您触摸它之前,您的SearchView将无法获得焦点...无论您在何处或是否在代码中“初始化”它,或隐藏您的菜单或任何其他可能未发生的活动在你的调试中。这也消除了跟踪调用位置的可能性

  

setFocusable(false)//基本上做同样的事情

在您的代码中多次,如接受的答案所示。