1. 程式人生 > >TextView實現長按複製

TextView實現長按複製

前段時間因為專案需求實現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,自定義TextView
public 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){ }