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

Posted

技术标签:

【中文标题】在Android的WebView中选择文本时如何覆盖上下文操作栏?【英文标题】:How to override Contextual Action Bar when selecting text in a WebView in Android? 【发布时间】:2014-04-04 21:13:40 【问题描述】:

我在 Google 上搜索了很多,并在 *** 中找到了一些教程和答案,但我在解决这个问题时遇到了一些困难。

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

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

我当前的一些代码:

自定义界面:

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) 
    

自定义网页视图

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】:

还有更好的方法!请参阅以下答案:https://***.com/a/22391169/2608235


简而言之,您不能使用OnLongClickListener 并将选择保留在WebView 内。 android 在幕后做了一些奇怪的事情来选择WebViews 中的文本。如果您覆盖OnLongClickListener 以调用startActionMode,您将失去选择,正如您所发现的。

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

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

【讨论】:

以上是关于在Android的WebView中选择文本时如何覆盖上下文操作栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 webview 隐藏文本选择句柄:android

在Android的WebView中修改选择时文本选择菜单消失

Android:如何从 webview 中选择文本

覆盖Android中文本选择(在WebView中)的默认上下文操作栏

android webview 如何实现选择文本功能

如何在 Android 的 web 视图中禁用文本选择?