我已经ActionMode.Callback
在WebView
. 我遇到的问题是选择和操作模式状态不匹配。
当我长按时,一切开始都很好。
当我与其中一个按钮或WebView
(不包括实际选择)交互时,ActionMode
应该销毁,并且选择应该消失。
在 Android 4.4 KitKat 中,这正是发生的情况。
但是,这不是 4.1.1 - 4.3,Jelly Bean 中发生的事情。当我单击其中一个按钮时,不会删除选择。
当我在选择之外点击时,会发生相反的情况。选择被删除,但上下文操作栏仍保留在屏幕上。
这是我的代码
CustomWebView
public class CustomWebView extends WebView {
private ActionMode.Callback mActionModeCallback;
@Override
public ActionMode startActionMode(Callback callback) {
ViewParent parent = getParent();
if (parent == null) {
return null;
}
mActionModeCallback = new CustomActionModeCallback();
return parent.startActionModeForChild(this, mActionModeCallback);
}
private class CustomActionModeCallback implements ActionMode.Callback {
// Called when the action mode is created; startActionMode() was called
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.contextual_menu, menu);
return true;
}
// Called each time the action mode is shown.
// Always called after onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// This method is called when the handlebars are moved.
loadJavascript("javascript:getSelectedTextInfo()");
return false; // Return false if nothing is done
}
// Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId() {
case R.id.button_1:
// do stuff
break;
...
default:
break;
}
mode.finish(); // Action picked, so close the CAB
return true;
}
// Called when the user exits the action mode
@Override
public void onDestroyActionMode(ActionMode mode) {
// TODO This does not work in Jelly Bean (API 16 - 18; 4.1.1 - 4.3).
clearFocus(); // Remove the selection highlight and handles.
}
}
}
正如上面的评论所示,我认为问题出在clearFocus()
方法上。当我删除该方法时,按下按钮会在 4.4 中留下选择,就像 Jelly Bean 中的行为一样。clearFocus()
给出了 4.4 中的预期行为,但没有转移到早期的 API。(请注意,这clearFocus()
对 KitKat 来说并不新鲜;它自 API 1 以来一直在 Android 中。)
如何解决这个问题?