我有一个带有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;
}
答案 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)//基本上做同样的事情
在您的代码中多次,如接受的答案所示。