TextView實現長按複製
阿新 • • 發佈:2018-11-20
前段時間因為專案需求實現TextView長按複製的功能,特意上百度差了一下有不少實現這個功能的方法,隔了好久也怕忘了,總結一下:
先推薦目前感覺最好用的方法:
在佈局檔案的TextView控制元件屬性中增加一句話:android:textIsSelectable="true",不過這個方法需要只有android sdk 11起才支援,v11以下則不行了。不過現在的版本這個應該也不成問題了
xml檔案中可以設定之外,在java程式碼上也可以一句話設定:
TextView tv = new TextView(context);
tv.setTextIsSelectable(true);
除了上面的方法之外還有其他可以實現功能的相關方法:
1、使用OnLongClickListener
使用TextView,,然後在程式碼裡給TextView新增OnLongClickListener事件,長按時彈出自定義 "複製" 選單(比如結合 PopupWindow做彈出選單)。 點選"複製" 就去獲取TextView的內容。(PS : 這裡是獲取內容,而我們還需要將內容放入貼上管理器還需要一個ClipboardManager 物件.它負責管理複製後貼上的這件事。目前的淘寶分享到微信使用的就是這個方法)
ClipboardManager cmb = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(content.trim()); //將內容放入貼上管理器,在別的地方長按選擇"貼上"即可
cm.getText();//獲取貼上資訊
2、使用EditText,和TextView一樣在xml裡面直接加一句話android:editable="false" 可以實現,不過需要注意,使用EditText的話需要設定一個背景色,或者設定空也行,缺點是不能在java程式碼中動態設定。
3、可以通過繼承EditText,自定義TextViewpublic class SelectCopyTextView extends EditText {
public SelectCopyTextView(Context context) {
super(context);
}
public SelectCopyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SelectCopyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected boolean getDefaultEditable() {
//禁止EditText被編輯
return false;
}
}
其中關鍵的一個方法是getDefaultEditable(),,return false;即禁止EditText被編輯,變成了不可編輯的EditText,但同時具有EditText的長按複製功能。如果查看了EditText原始碼,,也可以發現原始碼中有一個方法 protected void onCreateContextMenu(ContextMenu menu)
控制了EditText長按彈出的上下文選單, 可以自定義這個方法且實現為空
protected void onCreateContextMenu(ContextMenu menu){ }