當(dāng)前位置: 首頁IT技術(shù) → 自定義可復(fù)制的textview

自定義可復(fù)制的textview

更多

  最近準(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 }

熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)