美文网首页
ActionMode.Callback在TextView中的使用

ActionMode.Callback在TextView中的使用

作者: 学无止境的cy | 来源:发表于2019-04-28 15:07 被阅读0次

有个需求就是一个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的文件夹

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <item
        android:id="@+id/it_copy"
        android:title="复制" />

    <item
        android:id="@+id/it_delete"
        android:title="删除" />

    <item
        android:id="@+id/it_recall"
        android:title="撤回" />

    <item
        android:id="@+id/it_more"
        android:title="更多" />
</menu>
 

相关文章

网友评论

      本文标题:ActionMode.Callback在TextView中的使用

      本文链接:https://www.haomeiwen.com/subject/kuwknqtx.html