【问题标题】:SearchView focused when hiding the ActionBar menu隐藏 ActionBar 菜单时 SearchView 聚焦
【发布时间】:2011-11-28 03:05:36
【问题描述】:

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

【问题讨论】:

    标签: android search android-actionbar


    【解决方案1】:

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

    【讨论】:

    • lifesaver - 我的搜索视图正在调用一个进度对话框,一旦对话框关闭,它就会重新获得焦点并拉回键盘。在它上面调用 clearFocus() 得到了控制
    【解决方案2】:

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

    【讨论】:

    • 不幸的是,这不起作用。我已经添加了上面的代码。不过感谢您的发帖。
    • 它不起作用但您选择它作为接受的答案?
    • 它没有用。软键盘仍然弹出。接受答案的人可能有用,但对我不起作用。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      为另一个视图调用 requestFocus(),最好是你的结果视图,例如

      _resultsFragment.getView().requestFocus();
      

      【讨论】:

        【解决方案5】:

        我刚刚因为同样的问题而烦恼。

        我试过 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() 之后被调用,但只在我测试过的一些设备上被调用,这真的很奇怪。

        以上代码确保在页面创建过程中任何焦点更改后清除焦点。

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

        【讨论】:

          【解决方案6】:

          当你在你的 XML 布局文件中设置你的 SearchView 时(如果你正在使用一个),只需使用这个:

          android:focusable="false"
          

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

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

          按照接受的答案建议多次在您的代码中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-01
            • 1970-01-01
            相关资源
            最近更新 更多