1.首先设置textview可选:
2.为textview设置监听
4.要想获取所选中的内容,从callback2接口中看只有menu和menuitem,无法获取,但系统自带的有复制和剪切的功能,这时候就看一看系统是如何实现的。从设置监听的方法开始,见下面源码;监听事件被交由Edit这和类的mCustomSelectionActionModeCallback属性。
android:textIsSelectable="true"
2.为textview设置监听
textView.setCustomSelectionActionModeCallback(callback2);
3.这个时候我们只要重写ActionMode.Callback2接口(需要判断sdk版本是否大于23,小于使用callback接口
private ActionMode.Callback2 callback2 = new ActionMode.Callback2()
{
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu)
{
MenuInflater inflater = actionMode.getMenuInflater();
inflater.inflate(R.menu.text_selected, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu)
{// 此方法用于清楚系统自带的meneitem(例如复制分享)
// MenuInflater menuInflater = actionMode.getMenuInflater();
// menu.clear();
// menuInflater.inflate(R.menu.text_selected,menu);
// return true;
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem)
{
switch (menuItem.getItemId())
{
case R.id.toast:
{
Toast.makeText(MainActivity.this, "toast:" , Toast.LENGTH_SHORT).show();
break;
}
case R.id.finish:
{
MainActivity.this.finish();
break;
}
default:return false;
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode actionMode)
{
}
};
4.要想获取所选中的内容,从callback2接口中看只有menu和menuitem,无法获取,但系统自带的有复制和剪切的功能,这时候就看一看系统是如何实现的。从设置监听的方法开始,见下面源码;监听事件被交由Edit这和类的mCustomSelectionActionModeCallback属性。
public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
createEditorIfNeeded();
mEditor.mCustomSelectionActionModeCallback = actionModeCallback;
}
再看Editor这个类,对
mCustomSelectionActionModeCallback属性操作的是getCustomCallback()方法,
private Callback getCustomCallback() {
return mHasSelection
? mCustomSelectionActionModeCallback
: mCustomInsertionActionModeCallback;
}
再看有哪些地方用到这个方法:
Editor的内部类TextActionModeCallback
private class TextActionModeCallback extends ActionMode.Callback2 {
private final Path mSelectionPath = new Path();
private final RectF mSelectionBounds = new RectF();
private final boolean mHasSelection;
private int mHandleHeight;
public TextActionModeCallback(boolean hasSelection) {
mHasSelection = hasSelection;
if (mHasSelection) {
SelectionModifierCursorController selectionController = getSelectionController();
if (selectionController.mStartHandle == null) {
// As these are for initializing selectionController, hide() must be called.