我在我的Android应用程序中使用了ActionBarCompat和QuickAction(https://github.com/lorensiuswlt/NewQuickAction 也显示在 http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/)。
在操作栏的右侧有传统的搜索图标,用户触摸它,搜索视图展开,用户可以键入查询。
我有一个要求,弹出窗口将显示两个项目"在 foo 中搜索TYPED_TEXT"和"在栏中搜索TYPED_TEXT",而不是显示最近的搜索,因此,而不是使用默认的搜索弹出窗口(所以我不必处理内容提供商并模拟光标只是为了显示相同的两个项目)。
在我的SearchView.OnQueryTextListener
中,onQueryTextChange
被覆盖,因此当用户键入至少 3 个字符时,我设置了快速操作并显示它。
SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
Context context = MyActivity.this.getBaseContext();
LayoutInflater inflator = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rootView = inflator.inflate(R.layout.quickaction_popup, null);
rootView.measure(0, 0);
QuickActionList action = new QuickActionList(MyActivity.this,
QuickActionList.HORIZONTAL, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
action.addActionView(rootView);
action.show(mSearchView);
// [1]. I'll explain this comment line below.
return false; // I tried with return true as well to indicate I've consumed the event here.
}
}
问题是:显示快速操作后,我无法键入任何内容。我必须再次触摸搜索视图才能键入另一个字符。
在我用// [1]
评论的地方,我试图用setFocusable
+requestFocus
、setFocusableInTouchMode
+requestFocus
甚至setFocusable
+setFocusableInTouchMode
+requestFocus
来改变焦点,但根本没有成功。这是替换// [1]
的代码片段:
mSearchView.setFocusable(true);
mSearchView.setFocusableInTouchMode(true);
boolean gotFocus = mSearchView.requestFocus();
Log.d("DOUG", Boolean.toString(gotFocus));
日志显示gotFocus = true
,但我仍然无法输入。我看到一个蓝色条,显示它已准备好接受输入,但它没有闪烁。软键盘也不断显示,但是当我打字时,就像我在不可编辑的东西上打字一样。可能快速操作正在捕获软键事件,但我找不到避免这种情况的方法。
关于如何解决此问题或解决方法的任何想法?
谢谢
我最终在NewQuickAction中修改了PopupWindows.java,以便preShow
选择性地接受一个参数来判断弹出窗口是否可聚焦。然后它将参数传递给 mWindow.setFocusable(…)
。