为了账号安全,请及时绑定邮箱和手机立即绑定

使用自定义上下文操作栏进行WebView文本选择

使用自定义上下文操作栏进行WebView文本选择

慕尼黑的夜晚无繁华 2019-11-12 10:35:03
我使用了Google的指南和本教程来制作自己的上下文操作栏。private ActionMode.Callback mActionModeCallback = new 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.annotation_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) {        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.custom_button:                // do some stuff                break;            case R.id.custom_button2:                // do some other stuff                break;            default:                // This essentially acts as a catch statement                // If none of the other cases are true, return false                // because the action was not handled                return false;        }        finish(); // An action was handled, so close the CAB        return true;    }    // Called when the user exits the action mode    @Override    public void onDestroyActionMode(ActionMode mode) {        mActionMode = null;    }};此菜单旨在在用户选择文本时显示,因此它会覆盖本机复制/粘贴菜单。现在我要解决我的问题。因为我要覆盖用于文本选择的功能,所以我还向中添加了LongClickListenera WebView并实现了该onLongClick(View v)方法,以便可以检测用户何时进行选择。长按时,我看到我的自定义菜单出现,但是没有突出显示文本。我需要文本选择功能;没有它,我的菜单毫无意义。如何覆盖onLongClick(View v),但保持Android提供的文本选择?如果无法实现,我可以打到startActionMode(mActionModeCallback)其他地方以便正常选择文本,但是我的自定义菜单也会出现吗?如果这些都不可行,请帮助。
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

我执行类似操作的方法是仅重写onTouchListener并调用GestureDetector来检测何时长按WebView并从中执行所需操作。这是一些示例代码,使您可以捕获长按事件,而无需牺牲WebView中的文本选择。希望这会有所帮助。


@Override

protected void onCreate(Bundle savedInstanceState) {

    WebView mWebView = (WebView) findViewById(R.id.myWebView);

    GestureDetector mGestureDetector = new GestureDetector(this, new CustomGestureListener());

    mWebView.setOnTouchListener(new OnTouchListener(){

        @Override

        public boolean onTouch(View view, MotionEvent arg1) {


            //Suggestion #1 - this just lets the touch to be handled by the system but allows you to detect long presses

            mGestureDetector.onTouchEvent(arg1);

            return false;


            //Suggestion #2 - this code will only let the touch be handled by the system if you don't detect a long press

            return mGestureDetector.onTouchEvent(arg1);

        }

    });

}


private class CustomGestureListener extends SimpleOnGestureListener {


    @Override

    public void onLongPress(MotionEvent e) {

        //do stuff

    }


}


查看完整回答
反对 回复 2019-11-12
?
狐的传说

TA贡献1804条经验 获得超3个赞

您的建议没有错;确实允许长时间按下其他功能。但是,它无法完成我想做的事情。即使我打startActionMode(mActionModeCallback)onLongPress电话,本地上下文菜单仍然会出现。我想覆盖所述菜单,同时保持文本选择。

查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 535 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信