日韩精品中文字幕一区二区-日韩精品中文字幕一区-日韩精品中文字幕视频-日韩精品在线一区二区三区-第一页在线-第一福利视频

當前位置: 首頁IT技術 → 自定義可復制的textview

自定義可復制的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 }

  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進行了一次驗證66

   setCursorVisible(true);

  67 cursorStart = getSelectionStart();

  68 } else {

  69 setCursorVisible(false);

  70 cursorStart = -1;

  71 }

  72 }

  73 return flag;

  74 }75

  76 // 當按返回鍵取消文字復制時,使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的關鍵方法:可以選擇復制、剪切等等功能,視該textview的具體實現而定

  24 //如果希望不彈出這個menu界面,只要把這個方法返回空就ok

  25 @Override

  26 protected MovementMethod getDefaultMovementMethod() {

  27 // TODO Auto-generated method stub

  28 return super.getDefaultMovementMethod();

  29 }

  30 //點擊menu中的選定item的具體處理方法,捕捉點擊文本復制、剪切等按鈕的動作

  31 //如果要在點擊復制按鈕之后取消該textview的cursor可見性的具體監聽寫在這里

  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進行了一次驗證63

  setCursorVisible(true);

  64 cursorStart=getSelectionStart();

  65 }else{

  66 setCursorVisible(false);

  67 cursorStart=-1;

  68 }

  69 }

   70 return flag;

  71 }

  72 //當按返回鍵取消文字復制時,使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 }

熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
主站蜘蛛池模板: 姐妹微电影| 密室逃脱电影| 散文诗二首批注| 声入人心| 我妻子的一切 电影| 死神来了电影| 1988版绝代双骄国语免费观看| teach me墨西哥电影免费观看| 汪鹏| 削发| 那些年,那些事 电视剧| 邓为个人资料及简历| 浙江卫视今天全部节目表| 板谷由夏| 经典常谈周易第二读书笔记| 电影《追求》| 成人在线| 绿门背后| 浙江卫视在线直播 高清| land of the lost| 光荣之路| 楼下的女邻居| 沈月个人简介| 林佑星| 电视剧瞧这一家子演员表| 无籍者| 久久日韩成人影院绝色| 埃尔加他狼| 北京卫视电视节目单| 七年级下册英语书电子版| 正义回廊 电影| 恐龙图片大全| 诊所惊魂| 天狂传说之巴啦啦小魔仙合集 | 西尔扎提| 违规吃喝研讨发言材料| 啊啊视频| 春风不问路| 开创盛世电视剧全集免费观看| 护花使者歌词| 亲子血型对照表|