1. 程式人生 > >安卓監聽剪下複製貼上事件例項

安卓監聽剪下複製貼上事件例項

本文的剪下複製貼上事件只針對文字,URI 和 intent 不在討論範圍內。
例項程式碼實現了2個功能:

  • 監聽剪下複製貼上事件;
  • 獲取剪下複製或貼上的文字;

剪下複製

有2個方法監聽剪下複製事件:剪下板和 EditText 的 onTextContextMenuItem() 方法。

二者的主要區別是:

  • 剪下板是系統層面的全域性性質的監聽,而onTextContextMenuItem 只對某個 EditText 控制元件有效。
  • 剪下板只能監聽到剪下複製事件,而無法監聽到貼上事件,而 onTextContextMenuItem 能既能監聽到剪下複製事件,又能監聽貼上事件;

方法一:剪下板

在這裡囉嗦幾句關於 Clipboard 的知識點:

  • 剪下板不僅可以存文字,還可以存 URI 和 Intent;
  • 剪下板上只保持對 PrimaryClip 的引用,即最新一次的剪下資料;
  • OnPrimaryClipChangedListener 回撥只對剪下和複製操作有效,即只有剪下板資料增加時才呼叫 OnPrimaryClipChangedListener;
  • 剪下板上有多個 ClipData 構成,每次剪下和複製事件都會產生一個 ClipData,ClipData 包含 ClipDescprition 和 若干個儲存資料的 ClipData.Item;

監聽剪下和複製事件,如果是文字則儲存對應文字:

    private void registerClipEvents() {

        final ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

        manager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
            @Override
            public void onPrimaryClipChanged
() { if (manager.hasPrimaryClip() && manager.getPrimaryClip().getItemCount() > 0) { CharSequence addedText = manager.getPrimaryClip().getItemAt(0).getText(); if (addedText != null) { Log.d(TAG, "copied text: " + addedData); } } } }); }

注意,一定要在 onDestroy() 方法裡面去呼叫 addPrimaryClipChangedListener() 登出掉,否則會出現記憶體洩露。

方法二:EditText#onTextContextMenuItem

在該方法中,我們可以監聽到剪下、複製和貼上事件,但是需要繼承 EditText 重寫該方法:

public final class Listen2PasteEditText extends android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "Listen2PasteEditText";

    private Context mContext;

    public Listen2PasteEditText(Context context) {
        super(context);
        mContext = context;
    }

    public Listen2PasteEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    @Override
    public boolean onTextContextMenuItem(int id) {

        switch (id) {
            case android.R.id.cut:
            if (mContext instanceof IClipCallback) {
                    ((IClipCallback) mContext).onCut(null);
                break;
            case android.R.id.copy:
            if (mContext instanceof IClipCallback) {
                    ((IClipCallback) mContext).onCopy(null);
                break;
            case android.R.id.paste:
                if (mContext instanceof IClipCallback) {
                    ((IClipCallback) mContext).onPaste(null);
                }
        }

        return super.onTextContextMenuItem(id);
    }
}

其中,IClipCallback 是個介面, Listen2PasteEditText 所在的 Activity 需要實現該介面。

IClipCallback 宣告如下:

public interface IClipCallback {
    void onCut(Object o);
    void onCopy(Object o);
    void onPaste(Object o);
}

注意,上述程式碼只是讓我們監聽到了剪下和複製事件,要想獲取文字,還是要藉助剪下板,具體見 registerClipEvents() 方法,此處不再贅述。

貼上

剪下板無法監聽到貼上事件,只能通過 EditText#onTextContextMenuItem() 方法實現。

至於得到貼上文字,還是需要通過剪下板獲得。

具體程式碼見方法二。

相關推薦

複製貼上事件例項

本文的剪下複製貼上事件只針對文字,URI 和 intent 不在討論範圍內。 例項程式碼實現了2個功能: 監聽剪下複製貼上事件; 獲取剪下複製或貼上的文字; 剪下複製 有2個方法監聽剪下複製事件:剪下板和 EditText 的 onText

和修改軟鍵盤右下角按鈕

前言:監聽軟鍵盤右下角按鈕在我們開發中經常遇到,下面我來說一下如何針對軟鍵盤右下角來進行操作。 監聽軟鍵盤右下角的按鈕很簡單,只需要重寫Activity中的dispatchKeyEvent(KeyEvent event)方法就好,比如想按右下角按鈕讓他消失。

網路視訊播放 卡頓

有兩種方式設定視訊監聽卡: 一、系統自帶的監聽卡物件 在視訊播放中,如果播放網路視訊出現卡頓,需要對卡頓的情況做出處理:監聽卡 在安卓4.2以後,MediaPlayer.OnInfoListener類用來監聽視訊的卡頓,並且將監聽卡封裝在了VideoView中,通過: v

Java實現複製貼上功能(含不同文字域的判斷)

通過焦點事件判斷不同的文字域 不同文字域焦點事件的處理 tp1.addFocusListener(new FocusListener(){ @Override public void focu

如何阻止複製貼上事件

     在一些應用中,有時我們提交表單內容如(密碼)重要資訊時,為了安全,需要阻止一些複製剪下和貼上事件,今天做了一個簡單的例子有關阻止複製剪下和貼上事件:        <!DOCT

angular輸入框內容複製貼上事件觸發

<!doctype html> <html ng-app="myApp1"> <head> <meta charset="UTF-8">

Linux檔案複製貼上

在home目錄下有wwwroot目錄,wwwroot下有sinozzz目錄,即/home/wwwroot/sinozzz 一、目錄建立 在/home/wwwroot目錄下新建一個sinozzz123的資料夾 mkdir /home/wwwroot/sinozzz12

鍵盤的開啟和關閉

看到網上說很多的偶去鍵盤狀態都是通過ViewTreeObserver.OnGlobalLayoutListener的onGlobalLayout來獲取變化的高度值通過差值來判斷獲取的。 但是實用性比較

專案實戰之:7.0優化的全域性網路連線狀態

須知:Android7.0起網路變化監聽隱式廣播被關閉 在 Android 7.0 版本中除了提供諸多多視窗支援、活動通知、後臺優化、訊息傳遞服務和Vulkan 等新特性和功能外,還對系統和 API 行為做出了各種變更,其中最重要的一點:Android7.0為了進行後臺的優化刪除了三

C# 複製貼上

1、複製,文字框中選定內容到剪下板: Clipboard.SetDataObject(textBox1.SelectedText); 2、剪下,文字框中當前選中的內容  textBox1.Cut(); 3、貼上,至文字框中 textBox1.Text = (

修改Delphi 10.1.2 edit控制元件在android的複製貼上樣式

Delphi 10.1.2 edit控制元件在android預設的複製、剪下和貼上樣式太醜,經悟能-DelphiTeacher的提示,用最簡單的程式碼修改後稍有改觀。 預設的樣式: 修改後的樣式: 修改FMX.Platform.Android.pas 找到procedure TWindowMa

Js實現——右鍵出現選單,選單中有新建,複製貼上,刪除

描述:    單擊右鍵出現選單,選單中有新建,複製,剪下,貼上,刪除    選擇新建時,建立第一個div,寬高50,顏色隨機,並且放在滑鼠點選的位置    點選div,div被選中,加邊線,如果被選中,div可以被拖動,當選擇別的d

Selenium+Python測試鍵盤操作---全選、複製貼上

''' 鍵盤操作--將百度搜索的關鍵字複製到必應中進行搜尋 --匯入模組from selenium.webdriver.common.keys import Keys --剪下 --複製 ''' from selenium import webdriver from sele

完整版文本框即時輸入數據拉顯示匹配數據

utl 監聽 title 本地 pre utf splay chang ace 1.前言 好多小童鞋,對以jq為主的前端並不是特別熟悉,但並不代表你是菜鳥,說不定你是其他方面的資深老司機,好吧,我才是菜鳥,今天主要寫一個完整的demo來看看怎樣文本框+下拉框即時匹配數據。

ubuntu在終端複製貼上的2種方法

       最近因為專案需要在ubuntu環境下開發(我是用的unbantu虛擬環境),經常要在終端下手動輸入很長的檔案路徑,覺得很麻煩,就谷歌了2種方法如下   你可能會問,什麼是ubuntu?   簡單來說就是一個基於Linux系統的開源桌面作業系統   詳情:https://bai

4g網絡訪問特別慢 APN為ipv4的時候可以訪問IPV6不可以訪問

獲得 2種 鏈接 follow 原來 不可 線上 域名解析 分別是 經過對比發現,TCP3次握手的過程沒有問題,不是重發導致的!但是在3次握手前停滯了16s,這很奇怪!不經想問,3次握手前做了什麽!由於個人水平有限,猜測是不是域名解析的問題呢!和後臺交流一下!發現公司線上服

各大android應用商店的展示權重 應用商店關鍵詞+載量+評價+其他這幾項佔的權重(僅供參考)

1、360手機助手 2、應用寶 應用寶權重最高的是評論,評論方面主要從評論質量與評論數量上下手,其它方面權重值較低,對APP排名影響度不大。 3、百度手機助手 在我對你百度手機助手的排名分析中,發現關鍵詞的權重很高,下載量等其它方面對其排名影響不大。而且這個市場的官方編輯可以直

貼上圖片上傳

一個需求:讓使用者使用剪下板來貼上圖片(而不是將圖片儲存到本地,然後再選取檔案上傳) fakepath是什麼鬼 今天做圖片上傳時發現,不論是什麼路徑上傳的檔案,路徑都變成了這種格式 “C:\fakepath\檔名”。 以前做圖片上傳時沒留意過這個f

Linux複製貼上快捷鍵

1. 在終端下:           複製命令:Ctrl + Shift + C  組合鍵.           貼上命令:Ctrl + Shift + V  組合鍵.  2. 在控制檯下:           複製命令:Ctrl + Insert  組合鍵  

Xshell複製貼上的快捷鍵設定

在Xshell下,設定了複製粘貼後,可以非常方便快捷地完成操作。下面是設定的步驟: 彈出框,選擇滑鼠和鍵盤選項如圖: 滑鼠按鈕依據習慣選擇,Paste the clipboard contenets. 將選擇區內的“將待定的文字自動複製到剪貼簿”前