自定義可復制的textview


   最近准備寫一款閱讀相關的應用,希望內部的文字都可以實現完整的可復制性,這對於信息分享的而言至關重要。類似人人網客戶端那樣內部文字完全不可復制,信息只能在站內共享的方式讓我很郁悶,所以我就想來實現一個類似uc網頁頁面內容皆可復制的textview。

在仔細看了一段時間textview和edittext的代碼之后,我發現其實如果要求不高的話,我們完全可以在edittext的基礎上來實現一個符合我所述要求的textview。具體實現過程不難,有兩大主要問題點。

  • 首先 ,edittext已經很好的實現了相關文本復制的操作,但是我希望不能在其內部輸入文字,不能對內部的文字進行刪減。
  • 其次,我們需要解決edittext游標cursor的問題,使其在我們需要的時候出現,不需要的時候gone去一邊。

第一個問題很簡單,我們只需要在應用到該edittext的地方屬性android: seteditable=”false”就可以了。關鍵難點在於第二點,我們如果想當然地認為只要設置setCursorVisible=”false”就能滿足需求的話就大錯特錯了。我們需要清晰地了解cursor什么時候會出現,什么時候不會消失。

實際測試過程我發現edittext中的代碼量很少,大部分的功能其實都在textview中被實現了,而導致,導致我們在長按edittext時彈出復制剪切選擇框的關鍵方法如下:

 

View Code
1 @Override
2 protected MovementMethod getDefaultMovementMethod() {
3 // TODO Auto-generated method stub
4 return super.getDefaultMovementMethod();
5 }

樹藤摸瓜,我們可以看到與復制相關的幾個關鍵類是:

ArrowKeyMovementMethod和Selection。

當然純粹為了實現我這兒的功能的話這兩個類都暫時不用去動。

我們只需要重寫幾個edittext里的方法就可以,具體代碼如下:

View Code
 1 package com.hebin.activity;
2
3 import android.content.Context;
4 import android.text.Selection;
5 import android.text.method.MovementMethod;
6 import android.util.AttributeSet;
7 import android.view.ContextMenu;
8 import android.view.KeyEvent;
9 import android.view.MotionEvent;
10 import android.widget.EditText;
11
12 /**
13 * @author heb
14 * @class_name MyTextView.java
15 * @date 2012-3-22
16 */
17 public class MyTextView extends EditText {
18
19 public MyTextView(Context context, AttributeSet attrs) {
20 super(context, attrs);
21 }
22
23 // 長按彈出文本選擇框menu的關鍵方法:可以選擇復制、剪切等等功能,視該textview的具體實現而定
24 // 如果希望不彈出這個menu界面,只要把這個方法返回空就ok
25 @Override
26 protected MovementMethod getDefaultMovementMethod() {
27 // TODO Auto-generated method stub
28 return super.getDefaultMovementMethod();
29 }
30
31 // 點擊menu中的選定item的具體處理方法,捕捉點擊文本復制、剪切等按鈕的動作
32 // 如果要在點擊復制按鈕之后取消該textview的cursor可見性的具體監聽寫在這里
33 @Override
34 public boolean onTextContextMenuItem(int id) {
35 setCursorVisible(true);
36 boolean flag;
37 if (id != android.R.id.switchInputMethod) {
38 flag = super.onTextContextMenuItem(id);
39 } else {
40 setCursorVisible(false);
41 return false;
42 }
43 if (id == android.R.id.copy) {
44 setCursorVisible(false);
45 cursorStart = -1;
46 }
47 return flag;
48 }
49
50 @Override
51 protected void onCreateContextMenu(ContextMenu menu) {
52 super.onCreateContextMenu(menu);
53 if (isInputMethodTarget()) {
54 menu.removeItem(android.R.id.switchInputMethod);
55 }
56 }
57
58 // textview的點擊捕捉
59 // 如果雙擊textview選中了具體文字,則使cursor可見
60 int cursorStart = -1;
61
62 @Override
63 public boolean onTouchEvent(MotionEvent event) {
64 boolean flag = super.onTouchEvent(event);
65 if (event.getAction() == MotionEvent.ACTION_DOWN && hasSelection()) {
66 if (cursorStart == -1) {// 由於點擊選中文字后,再點擊其他位置,第一次點擊時顯示的hasSelection依然為true,這樣一來cursor會依然還在,為了避免這種情況,我這里多對selectionStart進行了一次驗證
67 setCursorVisible(true);
68 cursorStart = getSelectionStart();
69 } else {
70 setCursorVisible(false);
71 cursorStart = -1;
72 }
73 }
74 return flag;
75 }
76
77 // 當按返回鍵取消文字復制時,使cursor再次不可見
78 @Override
79 public boolean onKeyDown(int keyCode, KeyEvent event) {
80 boolean flag = super.onKeyDown(keyCode, event);
81
82 setCursorVisible(false);
83 cursorStart = -1;
84 return flag;
85 }
86
87 }
88
89 }



                                            原創手打,有問題可以郵件聯系我:hisneric@gmail.com 希望大家一起學習共同提高 @x@




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM