2012年10月11日木曜日

Android TextView で文字列を選択する

Android 3.0 (API Level 11) から文字列選択の API がちょっとかわって、TextView でも(EditText でなくても)文字列選択を簡単に実装できるようになりました。

android:textIsSelectable 属性

もしくは

setTextIsSelectable() メソッド

を使います。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/editText1"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="This is an Android Phone!"  
  11.         android:textIsSelectable="true" />  
  12.   
  13. </RelativeLayout>  
編集できないので、ActionMode には「全体を選択」と「コピー」しか出てきません。



setTextIsSelectable() の中をみるとこんな感じです。
  1. 4650     public void setTextIsSelectable(boolean selectable) {  
  2. 4651         if (mTextIsSelectable == selectable) return;  
  3. 4652   
  4. 4653         mTextIsSelectable = selectable;  
  5. 4654   
  6. 4655         setFocusableInTouchMode(selectable);  
  7. 4656         setFocusable(selectable);  
  8. 4657         setClickable(selectable);  
  9. 4658         setLongClickable(selectable);  
  10. 4659   
  11. 4660         // mInputType is already EditorInfo.TYPE_NULL and mInput is null;  
  12. 4661   
  13. 4662         setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);  
  14. 4663         setText(getText(), selectable ? BufferType.SPANNABLE : BufferType.NORMAL);  
  15. 4664   
  16. 4665         // Called by setText above, but safer in case of future code changes  
  17. 4666         prepareCursorControllers();  
  18. 4667     }  
Android 3.0 から mTextIsSelectable というフィールドが新しく追加されています。
mTextIsSelectable はデフォルトでは false になっています。もちろん EditText でも false ですが、こちらは別の条件でテキスト選択が開始されます(具体的には editable かどうか)。
結構 2.3 のときと TextView のコード変わってて、なかなか面白いです。



0 件のコメント:

コメントを投稿