Android拦截editText粘贴\ copy \ cut

我怎样拦截这种事件?

我需要添加一些逻辑,当用户试图粘贴一些文本到我的EditText我知道我可以使用TextWatcher但这个入口点不好,因为我只需要拦截的情况下粘贴,而不是每次用户按下我的EditText

Solutions Collecting From Web of "Android拦截editText粘贴\ copy \ cut"

似乎没有太多可以通过使用API​​: Android粘贴事件

源读解救!

我深入研究了TextView的Android Source( EditText是一个带有一些不同configuration的TextView ),并发现用于提供剪切/复制/粘贴选项的菜单只是一个修改过的ContextMenu ( source )。

至于正常的上下文菜单,View必须创build菜单( source ),然后在callback方法( source )中处理交互。

由于处理方法是public ,我们可以简单地通过扩展EditText和覆盖方法来对不同的动作做出反应。 这是一个示例实现:

 import android.content.Context; import android.util.AttributeSet; import android.widget.EditText; import android.widget.Toast; /** * An EditText, which notifies when something was cut/copied/pasted inside it. * @author Lukas Knuth * @version 1.0 */ public class MonitoringEditText extends EditText { private final Context context; /* Just the constructors to create a new EditText... */ public MonitoringEditText(Context context) { super(context); this.context = context; } public MonitoringEditText(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public MonitoringEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } /** * <p>This is where the "magic" happens.</p> * <p>The menu used to cut/copy/paste is a normal ContextMenu, which allows us to * overwrite the consuming method and react on the different events.</p> * @see <a href="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/widget/TextView.java#TextView.onTextContextMenuItem%28int%29">Original Implementation</a> */ @Override public boolean onTextContextMenuItem(int id) { // Do your thing: boolean consumed = super.onTextContextMenuItem(id); // React: switch (id){ case android.R.id.cut: onTextCut(); break; case android.R.id.paste: onTextPaste(); break; case android.R.id.copy: onTextCopy(); } return consumed; } /** * Text was cut from this EditText. */ public void onTextCut(){ Toast.makeText(context, "Cut!", Toast.LENGTH_SHORT).show(); } /** * Text was copied from this EditText. */ public void onTextCopy(){ Toast.makeText(context, "Copy!", Toast.LENGTH_SHORT).show(); } /** * Text was pasted into the EditText. */ public void onTextPaste(){ Toast.makeText(context, "Paste!", Toast.LENGTH_SHORT).show(); } } 

现在,当用户使用剪切/复制/粘贴, Toast显示(当然,你也可以做其他事情)。

整洁的事情是, 这适用于Android 1.5 ,你不需要重新创build上下文菜单(如上面提到的链接问题),这将保持不变的外观平台 (例如与HTC Sense )。

有一个更简单的方法,虽然不是100%可靠的。

将TextChangedListener添加到您的编辑框中:

 EditText et = (EditText) mView.findViewById(R.id.yourEditText); et.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (count > 2) toast("text was pasted"); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { } }); 

如果文本更改超过2个字符,则可以认为它已粘贴(某些表情符号占用两个字符)。

当用户粘贴1个或2个字符时,当然不会检测粘贴,如果文本的改变是由其他东西触发的,则会错误地报告粘贴。

但是对于大多数目的而言,它完成了工作。