ActionMode.Callback在TextView中的使用总结

有个需求就是一个TextView需要有我们自己的长按事件,并且还要带有系统自带的复制剪切的功能,最开始没用过 ActionMode.Callback,需要复制粘贴的功能都是直接在布局中加个android:textIsSelectable=”true”就好了,想到加上一个复制粘贴居然想自己实现一个.... 其实我们可以直接使用ActionMode.Callback 先直接上代码

mAutoLinkTextView.setCustomSelectionActionModeCallback(new  ActionMode.Callback() {
            private Menu mMenu;

            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                menu.clear();
                MenuInflater menuInflater = actionMode.getMenuInflater();
                menuInflater.inflate(R.menu.option_menu, menu);
                boolean reCall = (System.currentTimeMillis() - data.getSentTime() <= 120000) && data.getMessageDirection() == Message.MessageDirection.SEND;
                if (!reCall) {
                    menu.removeItem(R.id.it_recall);
                }
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                this.mMenu = menu;
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.it_copy:
                        getSelectText(mAutoLinkTextView);
                        ToastUtils.ToastShowCenter("已复制");
                        actionMode.finish();
                        mMenu.close();
                        break;
                    case R.id.it_delete:
                        showDeleteMessagePop(mAutoLinkTextView,data);
                        actionMode.finish();
                        mMenu.close();
                        break;
                    case R.id.it_recall:
                        RongIM.getInstance().recallMessage(data.getMessage());
                        actionMode.finish();
                        mMenu.close();
                        break;
                    case R.id.it_more:
                        EventBus.getDefault().post(new ChangeMessageListAdapterStatus(true));
                        actionMode.finish();
                        mMenu.close();
                        break;
                    default:

                        break;
                }
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode actionMode) {

            }
        }
        );

可以看到这个回调中有四个方法,onCreateActionModeonPrepareActionModeonActionItemClickedonDestroyActionMode,顾名思义onCreateActionMode是在ActionMode创建的时候会调用,onPrepareActionMode是在ActionMode创建完成准备好的时候会调用,onActionItemClicked会在一些点击事件触发的时候调用,而onDestroyActionMode会在ActionMode销毁的时候调用。

onCreateActionMode我们可以设置我们自定义Menu的布局,像实例代码当中,我们如果不想显示某个view,直接removeItem传入它的Id就好了。如果说你们的产品不想要原本的复制等一些系统自带的按钮,我们可以在前面调用menu.clear进行去除。

onPrepareActionMode我们可以获取menu的实例去进行自己的操作

onActionItemClicked进行你自己的点击事件,在TextView当中我只传一个menu.close()好像并不会消失,需要ActionMode.finish去关闭,等有时间再去看看里面的原因。当然ActionMode.Callback还有一些其他的用途,具体可以根据自己的需求去做,另外如果你要显示这个自定义的menu还是需要在布局中加上android:textIsSelectable=”true”
贴下布局的代码吧,这个menu布局需要你自己去layout同一层级去建一个menu的文件夹



    

    

    

    

 

你可能感兴趣的:(ActionMode.Callback在TextView中的使用总结)