如何在Android WebView中选择文本时覆盖上下文操作栏?

4
我已经搜索了很多内容,也在stackoverflow上找到了一些教程和答案,但我仍然遇到了一些困难来解决这个问题。
我有一个带有WebView的片段,并且当用户选择我的 WebView 中的某些文本时,我想显示我的自定义上下文操作栏。 这里有两个主要问题:
1.目前,当用户在 WebView 的任何部分执行长按时,会显示我的自定义 CAB。 2.当用户在我的 WebView 中的某些文本上执行长按时,文本未被选中。
以下是我的一些目前的代码:
自定义接口:
public class SelectActionModeCallback implements ActionMode.Callback {

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
    }
}

Custom WebView

public class CustomWebView extends WebView {

    private SelectActionModeCallback actionModeCallback;

    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public ActionMode startActionMode(Callback callback) {
        actionModeCallback = new SelectActionModeCallback();
        return super.startActionMode(actionModeCallback); 
    }

在我的片段中,有以下内容:
@Override
public void onResume() {
    super.onResume();

    myWebView.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View view) {
            if (mActionMode != null) {
                Toast.makeText(getActivity(), "test", Toast.LENGTH_SHORT).show();
                return false;
            }

            mActionMode = getActivity().startActionMode(mActionModeCallback);
            view.setSelected(true);
            return true;
        }
    });
}

private SelectActionModeCallback mActionModeCallback = new SelectActionModeCallback() {

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.custom, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_sustom:
                customMethod();
                mode.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};
1个回答

3
有更好的解决方式!请参考以下答案:https://dev59.com/TGEh5IYBdhLWcg3wfzpE#22391169
简而言之,在WebView中你不能使用OnLongClickListener并保持选定文本。 Android在WebViews中选择文本时会进行一些奇怪的操作。 如果你重写OnLongClickListener以调用startActionMode,则会失去文本的选择,就像你发现的那样。
相反,你应该重写片段中的startActionMode,而不是其父View(在你的情况下是CustomWebView)。
我没有修改权限将此问题标记为重复,但实际上是重复的。
请查看我的问题以获取更多信息:Use a custom contextual action bar for WebView text selection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接