簡述
在我們的項(xiàng)目開發(fā)中只盹,有時會遇到這樣的需求:當(dāng)用戶在輸入框中進(jìn)行了粘貼操作,直接就使用粘貼的內(nèi)容進(jìn)行服務(wù)端接口的請求兔院,不需要用戶再點(diǎn)擊確認(rèn)后才去進(jìn)行接口請求殖卑。
對于這種情況,可以想到兩種方式實(shí)現(xiàn):
- 1.在復(fù)制或截切內(nèi)容時坊萝,記錄下復(fù)制剪切的內(nèi)容孵稽,在EditText的TextWatcher中判斷變更的文本是否與之前記錄的內(nèi)容一致,若一致則認(rèn)為是進(jìn)行了粘貼操作十偶。
但是這種方式存在問題菩鲜,那就是用戶沒有進(jìn)行粘貼操作,而是輸入惦积。當(dāng)輸入的內(nèi)容剛好與之前記錄的內(nèi)容一致時判斷為了粘貼接校。這是不對的。
- 2.在對文本框進(jìn)行粘貼操作是荣刑,獲取粘貼的內(nèi)容馅笙。
其實(shí)以上兩種業(yè)務(wù)實(shí)現(xiàn)方式都涉及到了監(jiān)聽復(fù)制伦乔、剪切、粘貼事件董习。
監(jiān)聽復(fù)制烈和、剪切、粘貼事件方式有兩種:
1 - 通過剪切板監(jiān)聽皿淋。
2 - 通過自定義EditText招刹,重寫onTextContextMenuItem() 方法實(shí)現(xiàn)監(jiān)聽。
監(jiān)聽復(fù)制窝趣、剪切事件的監(jiān)聽通過這兩種方式都可以實(shí)現(xiàn)疯暑,而粘貼事件只能通過第二種方式實(shí)現(xiàn)。
兩種方式的區(qū)別:
1.通過剪切板監(jiān)聽哑舒,其實(shí)是監(jiān)聽整個系統(tǒng)的復(fù)制妇拯、剪切操作。只要注冊了事件監(jiān)聽洗鸵,不管是App外的操作還是App內(nèi)部的操作都可以監(jiān)聽到越锈。而onTextContextMenuItem()方法是只針對某個EditText的。
2.剪切板只能監(jiān)聽復(fù)制膘滨、剪切事件甘凭,不能監(jiān)聽剪貼事件,因?yàn)锳ndroid沒提供監(jiān)聽粘貼事件的API火邓。而onTextContextMenuItem()既能監(jiān)聽到剪切復(fù)制事件丹弱,又能監(jiān)聽粘貼事件;
具體實(shí)現(xiàn)
-
剪切板(ClipboardManager)
剪切板的實(shí)現(xiàn)其實(shí)在官方文檔中找到相應(yīng)的內(nèi)容铲咨。
/**
* 注冊剪切板復(fù)制躲胳、剪切事件監(jiān)聽
*/
private void registerClipEvents() {
mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
mOnPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
if (mClipboardManager.hasPrimaryClip()
&& mClipboardManager.getPrimaryClip().getItemCount() > 0) {
// 獲取復(fù)制、剪切的文本內(nèi)容
CharSequence content =
mClipboardManager.getPrimaryClip().getItemAt(0).getText();
Log.d("TAG", "復(fù)制鸣驱、剪切的內(nèi)容為:" + content);
}
}
};
mClipboardManager.addPrimaryClipChangedListener(mOnPrimaryClipChangedListener);
}
/**
* 注銷監(jiān)聽泛鸟,避免內(nèi)存泄漏蝠咆。
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (mClipboardManager != null && mOnPrimaryClipChangedListener != null) {
mClipboardManager.removePrimaryClipChangedListener(mOnPrimaryClipChangedListener);
}
}
- 自定義EditText
在onTextContextMenuItem()方法中踊东,我們可以監(jiān)聽到剪切、復(fù)制和粘貼事件刚操。
我這里只監(jiān)聽了粘貼事件闸翅。如果有需要,可以自行拓展回調(diào)接口菊霜。
/**
* 可監(jiān)聽粘貼事件的EditText
*/
public class PasteEditText extends android.support.v7.widget.AppCompatEditText {
private OnPasteCallback mOnPasteCallback;
public interface OnPasteCallback {
void onPaste();
}
public PasteEditText(Context context) {
super(context);
}
public PasteEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTextContextMenuItem(int id) {
switch (id) {
case android.R.id.cut:
// 剪切
break;
case android.R.id.copy:
// 復(fù)制
break;
case android.R.id.paste:
// 粘貼
if (mOnPasteCallback != null) {
mOnPasteCallback.onPaste();
}
}
return super.onTextContextMenuItem(id);
}
public void setOnPasteCallback(OnPasteCallback onPasteCallback) {
mOnPasteCallback = onPasteCallback;
}
}
通過這種方法監(jiān)聽有點(diǎn)要注意坚冀,那就是你在回調(diào)中是獲取不到復(fù)制、剪切鉴逞、粘貼的文本內(nèi)容的记某。想要獲取到復(fù)制司训、剪切的文本還是需要通過監(jiān)聽剪切板去獲取。
粘貼的內(nèi)容的獲取其實(shí)可以在Activity中添加個標(biāo)記液南,在TextWatcher中判斷此標(biāo)記壳猜。這樣可以間接的獲取到粘貼內(nèi)容。因?yàn)樵趏nTextContextMenuItem()滑凉,自定義的回調(diào)先于super.onTextContextMenuItem(id)執(zhí)行统扳。這只加單寫了EditText中內(nèi)容為空的情況,如果有內(nèi)容畅姊,那么自己去進(jìn)行字符串的邏輯操作吧咒钟。我這里就不寫了。實(shí)測有效哦若未。
public class TestActivity extends AppCompatActivity {
// 是否點(diǎn)擊了粘貼
private boolean isClickPaste;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PasteEditText mEtInputLink = findViewById(R.id.et_input);
// 粘貼事件監(jiān)聽
mEtInputLink.setOnPasteCallback(new PasteEditText.OnPasteCallback() {
@Override
public void onPaste() {
isClickPaste = true;
}
});
mEtInputLink.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (isClickPaste) {
isClickPaste = false;
String content = mEtInputLink.getEditableText().toString();
// 做些你愛做的事情
}
}
});
}
}
OK朱嘴,本章內(nèi)容到此就結(jié)束了。如果大家有什么更好的方法粗合,或者覺得我的方法有啥可以改進(jìn)的地方腕够,歡迎評論留言哦。