选择手柄未出现在WebView中(Android 4.0-4.3)

选择手柄未出现在WebView中(Android 4.0-4.3),android,webview,selection,contextual-action-bar,android-actionmode,Android,Webview,Selection,Contextual Action Bar,Android Actionmode,我创建了一个自定义的ActionMode.Callback,以便在WebView中显示用于文本选择的自定义上下文操作栏。它在Android 4.4中运行得很好,但在4.1-4.3中,选择手柄没有出现。我仍然可以对高亮显示的单个单词执行自定义操作,但由于缺少句柄,无法更改选择 此外,当操作模式被破坏时,该选项不会从屏幕上清除。相反,如果用户点击其他位置以清除选择,则不会破坏操作模式 我甚至不确定clearFocus()是否是我应该调用的方法来尝试删除选择。我评论说4.4中的行和行为没有改变;它仍然

我创建了一个自定义的
ActionMode.Callback
,以便在
WebView
中显示用于文本选择的自定义上下文操作栏。它在Android 4.4中运行得很好,但在4.1-4.3中,选择手柄没有出现。我仍然可以对高亮显示的单个单词执行自定义操作,但由于缺少句柄,无法更改选择

此外,当
操作模式
被破坏时,该选项不会从屏幕上清除。相反,如果用户点击其他位置以清除选择,则不会破坏
操作模式

我甚至不确定
clearFocus()
是否是我应该调用的方法来尝试删除选择。我评论说4.4中的行和行为没有改变;它仍然完美无缺地工作

如何解决这些问题?
这是我当前的实现:

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;
            case R.id.button_2:
                // do stuff
                break;

            ... // cases for other buttons

            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 4.3 (and probably anything older).
            clearFocus(); // Remove the selection highlight and handles.

        }
    }
}

我从来没有弄清楚是什么原因导致了这种行为。幸运的是,我确实找到了一个适当显示车把并允许自定义操作的解决方案。该解决方案可在以下问题中找到:

简而言之,不要创建自己的
ActionMode
,而是删除默认的选择操作(复制、粘贴等),并使用
menu.xml
布局替换它们,使用
MenuInflater
覆盖
onActionModeStarted
。为菜单元素定义一个
onClick
,在
活动中实现该方法,就完成了