有个需求就是一个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) {
}
}
);
可以看到这个回调中有四个方法,onCreateActionMode,onPrepareActionMode,onActionItemClicked,onDestroyActionMode,顾名思义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>
网友评论