效果图
在点击粘贴之后弹出了一个toast提示,既然可以做到弹出toast,那想干其他事情还不简单。比如,将用户粘贴的文本替换成其他文本,这才是研究实现这个功能的原因。
先说一下实现方式,需要继承EditText/AppCompatEditText,再重写onTextContextMenuItem方法,先直接上代码。
public class CustomEditText extends AppCompatEditText {
public CustomeEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTextContextMenuItem(int id) {
if (id == android.R.id.paste) {
paste();
return true;
}
return super.onTextContextMenuItem(id);
}
private void paste() {
//TODO 在这里实现想要实现的功能
Toast.makeText(getContext(),"paste",Toast.LENGTH_SHORT).show();
}
}
再稍微说一下思路吧
先说明一下,下面很多代码是根据猜代码去找的,而不是逐行阅读找到相应的代码,所以如果不能接受这种方式就没必要继续看(我也知道这不是一种好的方式,但看不懂源码只能靠猜代码)。
观察弹出粘贴菜单的过程,发现是通过长按输入框弹出来的,所以找了一下TextView内部setLongClickListener的调用,最后没有找到。所以搜索onTouchEvent方法,看到onTouch下面有这样一段代码。
if (mEditor != null) {
mEditor.onTouchEvent(event);
if (mEditor.mSelectionModifierCursorController != null
&& mEditor.mSelectionModifierCursorController.isDragAcceleratorActive()) {
return true;
}
}
所以就查看Editor是怎么实现这个功能的,在Editor的onTouch方法里面调用了这个方法:updateFloatingToolbarVisibility。这个方法没有注释,但从名称上看就已经知道了是更新长按EditText的弹窗的显示状态。
void onTouchEvent(MotionEvent event) {
final boolean filterOutEvent = shouldFilterOutTouchEvent(ev