相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機銀行客戶端下載下載量:365699
-
快播手機版下載量:325855
最近準(zhǔn)備寫一款閱讀相關(guān)的應(yīng)用,希望內(nèi)部的文字都可以實現(xiàn)完整的可復(fù)制性,這對于信息分享的而言至關(guān)重要。類似人人網(wǎng)客戶端那樣內(nèi)部文字完全不可復(fù)制,信息只能在站內(nèi)共享的方式讓我很郁悶,所以我就想來實現(xiàn)一個類似uc網(wǎng)頁頁面內(nèi)容皆可復(fù)制的textview。
在仔細(xì)看了一段時間textview和edittext的代碼之后,我發(fā)現(xiàn)其實如果要求不高的話,我們完全可以在edittext的基礎(chǔ)上來實現(xiàn)一個符合我所述要求的textview。具體實現(xiàn)過程不難,有兩大主要問題點。
首先 ,edittext已經(jīng)很好的實現(xiàn)了相關(guān)文本復(fù)制的操作,但是我希望不能在其內(nèi)部輸入文字,不能對內(nèi)部的文字進(jìn)行刪減。
其次,我們需要解決edittext游標(biāo)cursor的問題,使其在我們需要的時候出現(xiàn),不需要的時候gone去一邊。
第一個問題很簡單,我們只需要在應(yīng)用到該edittext的地方屬性android: seteditable=”false”就可以了。關(guān)鍵難點在于第二點,我們?nèi)绻氘?dāng)然地認(rèn)為只要設(shè)置setCursorVisible=”false”就能滿足需求的話就大錯特錯了。我們需要清晰地了解cursor什么時候會出現(xiàn),什么時候不會消失。
實際測試過程我發(fā)現(xiàn)edittext中的代碼量很少,大部分的功能其實都在textview中被實現(xiàn)了,而導(dǎo)致,導(dǎo)致我們在長按edittext時彈出復(fù)制剪切選擇框的關(guān)鍵方法如下:
View Code
1 @Override
2 protected MovementMethod getDefaultMovementMethod() {
3 // TODO Auto-generated method stub
4 return super.getDefaultMovementMethod();
5 }
樹藤摸瓜,我們可以看到與復(fù)制相關(guān)的幾個關(guān)鍵類是:
ArrowKeyMovementMethod和Selection。
當(dāng)然純粹為了實現(xiàn)我這兒的功能的話這兩個類都暫時不用去動。
我們只需要重寫幾個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的關(guān)鍵方法:可以選擇復(fù)制、剪切等等功能,視該textview的具體實現(xiàn)而定
24 // 如果希望不彈出這個menu界面,只要把這個方法返回空就ok
25 @Override
26 protected MovementMethod getDefaultMovementMethod() {
27 // TODO Auto-generated method stub
28 return super.getDefaultMovementMethod();
29 }
30 31 // 點擊menu中的選定item的具體處理方法,捕捉點擊文本復(fù)制、剪切等按鈕的動作
32 // 如果要在點擊復(fù)制按鈕之后取消該textview的cursor可見性的具體監(jiān)聽寫在這里
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 }
46 return flag;
47 }
48 49 @Override
50 protected void onCreateContextMenu(ContextMenu menu) {
51 super.onCreateContextMenu(menu);
52 if (isInputMethodTarget()) {
53 menu.removeItem(android.R.id.switchInputMethod);
54 }
55 }
56 57 // textview的點擊捕捉
58 // 如果雙擊textview選中了具體文字,則使cursor可見
59 int cursorStart = -1;
60 61 @Override
62 public boolean onTouchEvent(MotionEvent event) {
63 boolean flag = super.onTouchEvent(event);
64 if (event.getAction() == MotionEvent.ACTION_DOWN && hasSelection()) {
65 if (cursorStart == -1) {// 由于點擊選中文字后,再點擊其他位置,第一次點擊時顯示的hasSelection依然為true,這樣一來cursor會依然還在,為了避免這種情況,我這里多對selectionStart進(jìn)行了一次驗證66
setCursorVisible(true);
67 cursorStart = getSelectionStart();
68 } else {
69 setCursorVisible(false);
70 cursorStart = -1;
71 }
72 }
73 return flag;
74 }75
76 // 當(dāng)按返回鍵取消文字復(fù)制時,使cursor再次不可見
77 @Override
78 public boolean onKeyDown(int keyCode, KeyEvent event) {
79 boolean flag = super.onKeyDown(keyCode, event);
80 if (!hasSelection()) {
81 setCursorVisible(false);
82 cursorStart = -1;
83 }
84 return flag;
85 }
86 87 }
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的關(guān)鍵方法:可以選擇復(fù)制、剪切等等功能,視該textview的具體實現(xiàn)而定
24 //如果希望不彈出這個menu界面,只要把這個方法返回空就ok
25 @Override
26 protected MovementMethod getDefaultMovementMethod() {
27 // TODO Auto-generated method stub
28 return super.getDefaultMovementMethod();
29 }
30 //點擊menu中的選定item的具體處理方法,捕捉點擊文本復(fù)制、剪切等按鈕的動作
31 //如果要在點擊復(fù)制按鈕之后取消該textview的cursor可見性的具體監(jiān)聽寫在這里
32 @Override
33 public boolean onTextContextMenuItem(int id) {
34 setCursorVisible(true);
35 boolean flag;
36 if(id!=android.R.id.switchInputMethod){
37 flag =super.onTextContextMenuItem(id);
38 }else{
39 setCursorVisible(false);
40 return false;
41 }
42 if(id==android.R.id.copy){
43 setCursorVisible(false);
44 }
45 return flag;
46 }
47 @Override
48 protected void onCreateContextMenu(ContextMenu menu) {
49 super.onCreateContextMenu(menu);
50 if (isInputMethodTarget()) {
51 menu.removeItem(android.R.id.switchInputMethod);
52 }
53 }
54 55 //textview的點擊捕捉
56 //如果雙擊textview選中了具體文字,則使cursor可見
57 int cursorStart=-1;
58 @Override
59 public boolean onTouchEvent(MotionEvent event) {
60 boolean flag = super.onTouchEvent(event);
61 if(event.getAction()==MotionEvent.ACTION_DOWN&&hasSelection()){
62 if(cursorStart==-1){//由于點擊選中文字后,再點擊其他位置,第一次點擊時顯示的hasSelection依然為true,這樣一來cursor會依然還在,為了避免這種情況,我這里多對selectionStart進(jìn)行了一次驗證63
setCursorVisible(true);
64 cursorStart=getSelectionStart();
65 }else{
66 setCursorVisible(false);
67 cursorStart=-1;
68 }
69 }
70 return flag;
71 }
72 //當(dāng)按返回鍵取消文字復(fù)制時,使cursor再次不可見
73 @Override
74 public boolean onKeyDown(int keyCode, KeyEvent event) {
75 boolean flag =super.onKeyDown(keyCode, event);
76 if(!hasSelection()){
77 setCursorVisible(false);
78 }
79 return flag;
80 }81
82 83 }