12

我有一个带有 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;
    }
4

6 回答 6

31

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

于 2011-11-09T14:28:42.580 回答
7

初始化时尝试在 SearchView 上调用 setFocusable(false)。

于 2011-10-03T09:06:07.957 回答
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();
            }
        }
    });
}
于 2014-07-23T14:14:29.903 回答
1

我刚刚为同样的问题拉了头发。

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

我终于在 onCreateOptionsMenu() 中使用以下代码解决了这个问题:

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

问题在于,在 Fragment 生命周期的每一点,菜单还没有被创建。onCreateOptionsMenu() 方法在 onResume() 之后被调用,但只在我测试过的一些设备上被调用,这真的很奇怪。

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

我希望这对其他人有所帮助,从一开始就知道这一点会为我节省很多时间。

于 2014-05-22T19:56:46.980 回答
1

调用 requestFocus() 以获得另一个视图,理想情况下是您的结果视图,例如

_resultsFragment.getView().requestFocus();
于 2011-11-05T12:06:02.750 回答
0

当您在 XML 布局文件中设置 SearchView 时(如果您正在使用),只需使用以下命令:

android:focusable="false"

使用这种方法,您的 SearchView 在您触摸它之前不会获得焦点……无论您在代码中的何处或是否“初始化”它,或者您隐藏您的菜单,或在您的调试中可能没有发生的任何其他活动. 这也消除了跟踪您呼叫的位置的可能需要

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

正如接受的答案所暗示的那样,在您的代码中多次出现。

于 2013-07-10T01:33:54.930 回答