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

时间:2014-04-04 21:13:40

标签: android webview contextual-action-bar android-actionmode

我已经搜索了很多内容,并在stackoverflow中找到了一些教程和答案,但我面临一些难以解决此问题。

我有一个带有WebView的片段,当用户选择我的Web视图的某些文本时,我想显示我的自定义上下文操作栏。我有两个主要问题:

  • 1目前,当用户在Web视图的任何部分执行长按时,都会显示我的自定义CAB。
  • 2当用户在我的网络视图的某些文本中执行长按时,未选中该文本。

我目前的一些代码:

自定义界面:

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) {
    }
}

自定义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 个答案:

答案 0 :(得分:3)

有一个更好的方式!请参阅以下答案:https://stackoverflow.com/a/22391169/2608235

<小时/> 简而言之,您无法使用OnLongClickListener并将选择保留在WebView内。 Android在WebViews内选择文本后,会在幕后做一些奇怪的事情。如果您覆盖OnLongClickListener以致拨打startActionMode,则您将失去选择,如您所知。

您应该做的是覆盖片段中的startActionMode,而不是其父View(在您的情况下为CustomWebView)。

我没有mod权限将此问题标记为副本,但确实如此 有关详细信息,请参阅我的问题:Use a custom contextual action bar for WebView text selection