淺析Android中的復制粘貼控制

淺析Android中的復制粘貼控制

我們都知道在Android系統的WebView中或者EditText上長按可以實現復制粘貼的功能,但是我們如果想要復制粘貼更多東西而不僅僅是文本,或者在粘貼時對粘貼的對象進行處理過濾一些不希望粘貼出來的東西,在看完這篇文章後你會對Android的復制粘貼有一個更深刻的認識。

概述

當我們需要使用復制粘貼功能時,首先要獲得ClipboardManager對象

ClipboardManager mCM = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

接下來我們就可以利用這個對象進行復制和粘貼操作瞭,如果想把一段文字復制到剪切板

mCM.setPrimaryClip(ClipData.newPlainText(null, “Hello ClipBoard”));

我們就把Hello ClipBoard復制到瞭剪切板。

如果想要獲取剪切板的文本

ClipData data = mCM.getPrimaryClip();
ClipData.Item item = data.getItemAt(0);
String copyStr = item.getText().toString()

這樣就實現瞭最簡單的復制粘貼功能,當然,剪切板的功能可不止如此。

復制粘貼的類型

當使用ClipboardManager進行復制粘貼時,我們可以操作三種形式的數據,

Text:字符串

我們可以把字符串放入剪切板中嗎,就如上面所示。

URI:一個Uri對象

表示任何形式的URI。這種形式主要用於從一個content provider中復制復雜的數據。復制的時候把一個Uri 對象放在一個clip對象中,然後再放在剪貼板裡;粘貼的時候取出這個clip對象,得到Uri,把它解析為一個數據資源比如content provider,然後從資源中復制數據到應用存儲中。

Intent:Intent對象

復制的時候把Intent對象放在clip對象中,再放入剪貼板;粘貼數據時,從clip對象中得到Intent對象,放入應用存儲區域中。

剪切板隻在同一時間儲存一個剪切對象,當我們把一個剪切對象復制到剪切板時,剪切板中原有的剪切對象就會消失

剪切板相關的類

ClipboardManager

ClipboardManager代表瞭系統的剪貼板,我們不直接初始化這個類,而是通過getSystemService(CLIPBOARD_SERVICE)獲取。

ClipData, ClipData.Item 和 ClipDescription

我們需要創建一個ClipData對象來把數據復制到剪切板中,這個ClipData對象包含一個數據的描述ClipDescription和一個或多個數據對象ClipData.Item

其中ClipDescription是對剪切對象的描述,而ClipData.Item是要復制到剪切板的具體內容

而如何獲取這個ClipData對象呢,針對三種不同的剪切數據我們有三種不同的方法

newPlainText(CharSequence label, CharSequence text)

這個方法用於返回一個Text類型的ClipData對象,其中label為數據描述,text為數據,label的MIME類型是MIMETYPE_TEXT_PLAIN

newUri (ContentResolver resolver, CharSequence label, Uri uri)

這個方法用於返回一個URI類型的ClipData對象

newIntent (CharSequence label, Intent intent)

這個方法用於返回一個Intent類型的ClipData對象

URI和Intent的剪切板功能我們用的不多,這裡主要以文本對象為例說明其用法。

文本的復制與粘貼

1.要操作剪切板我們首先需要ClipboardManager對象

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

2.如果需要復制,我們首先需要獲取一個ClipData對象,對於文本來說,用

ClipData clip = ClipData.newPlainText("simple text", "Hello, World!");

獲取該對象。然後將該對象放入剪切板中clipboard.setPrimaryClip(clip);,就可以使用剪切板瞭。

3.如果需要粘貼,我們首先需要取出剪切板中的對象

ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

然後轉換為StringString pasteData = item.getText();就可以使用瞭

當然我們這裡要說的並不是這麼簡單,如果復制粘貼的時候需要屏蔽一些關鍵字,我們就需要去監聽復制粘貼的事件瞭,這裡以EditText為例說明如何監聽其復制粘貼事件。

EditText復制粘貼事件的監聽

要實現復制粘貼事件的監聽,我們需要繼承EditText,重寫它的onTextContextMenuItem方法,同時新建一個EditTextClipListener的接口,用於監聽的回調,具體代碼如下

/**
 * ClipControlEditText.java
 */
public class ClipControlEditText extends android.support.v7.widget.AppCompatEditText {

    //事件監聽器
    private ArrayList listeners;

    public ClipControlEditText(Context context) {
        super(context);
        listeners = new ArrayList<>();
    }

    public ClipControlEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        listeners = new ArrayList<>();
    }

    public ClipControlEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        listeners = new ArrayList<>();
    }

    public void addListener(EditTextClipListener listener) {
        try {
            listeners.add(listener);
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }


    @Override
    public boolean onTextContextMenuItem(int id) {
        switch (id){
            case android.R.id.cut: //剪切
                onTextCut();
                break;
            case android.R.id.paste: //復制
                onTextPaste();
                break;
            case android.R.id.copy: //粘貼
                onTextCopy();
                break;
        }
        return super.onTextContextMenuItem(id);
    }

    public void onTextCut(){
        if (listeners != null) {
            for (EditTextClipListener listener : listeners) {
                listener.onCut();
            }
        }
    }

    public void onTextCopy(){
        if (listeners != null) {
            for (EditTextClipListener listener : listeners) {
                listener.onCopy();
            }
        }
    }

    public void onTextPaste(){
        if (listeners != null) {
            for (EditTextClipListener listener : listeners) {
                listener.onPaste();
            }
        }
    }
}

EditTextClipListener接口有三個方法分別是onCut()、onCopy()和onPaste()

public interface EditTextClipListener {
    void onCut();
    void onCopy();
    void onPaste();
}

接下來就可以在需要的地方監聽瞭,在需要的地方調用

et.addListener(new EditTextClipListener(){
    @Override
    public void onCut() {

    }
    @Override
    public void onCopy() {

    }
    @Override
    public void onPaste() {

    }
});

就可以監聽EditText的復制粘貼同時處理一些其他的事情瞭,回到上文,如果我們想在復制粘貼時屏蔽某些字符,隻要在回調方法中拿到剪切板中的對象,然後對對象進行一系列處理,再把處理後的對象放回剪切板中,就可以在粘貼時屏蔽需要的內容瞭

ClipData data = mCM.getPrimaryClip();
ClipData.Item item = data.getItemAt(0);
if (item != null && !TextUtils.isEmpty(item.getText())) {
    String pasteStr = removeSomething(item.getText()) //刪除字符串中的關鍵字
    ClipData newData = ClipData.newPlainText(data.getDescription().getLabel(), pasteStr2);
    mCM.setPrimaryClip(newData);
}

至於如何處理URI和Intent對象的復制粘貼,可以參考谷歌官方文檔對於復制和粘貼的介紹。

You May Also Like