2014年3月7日金曜日

Android CheckedTextViewでチェック状態を保持させる

CheckBoxやRadioButtonはチェック状態を保持するけどCheckedTextViewはしてくれません。

CheckBoxやRadioButtonはCompoundButtonを継承しているのですが、このコードを見ると以下のようにonSaveInstanceState()とonRestoreInstanceState()できちんと処理されています。

http://tools.oesf.biz/android-4.4.2_r1.0/xref/frameworks/base/core/java/android/widget/CompoundButton.java#364
  1. 364     @Override  
  2. 365     public Parcelable onSaveInstanceState() {  
  3. 366         // Force our ancestor class to save its state  
  4. 367         setFreezesText(true);  
  5. 368         Parcelable superState = super.onSaveInstanceState();  
  6. 369   
  7. 370         SavedState ss = new SavedState(superState);  
  8. 371   
  9. 372         ss.checked = isChecked();  
  10. 373         return ss;  
  11. 374     }  
  12. 375   
  13. 376     @Override  
  14. 377     public void onRestoreInstanceState(Parcelable state) {  
  15. 378         SavedState ss = (SavedState) state;  
  16. 379   
  17. 380         super.onRestoreInstanceState(ss.getSuperState());  
  18. 381         setChecked(ss.checked);  
  19. 382         requestLayout();  
  20. 383     }  
一方、CheckedTextViewではそのような処理は見あたりません。
http://tools.oesf.biz/android-4.4.2_r1.0/xref/frameworks/base/core/java/android/widget/CheckedTextView.java

なのでCheckedTextViewを継承して上記の処理を移植すれば、チェック状態を保持してくれるようになります。
  1. public class CheckedTextView2 extends CheckedTextView {  
  2.   
  3.     public CheckedTextView2(Context context) {  
  4.         super(context);  
  5.     }  
  6.   
  7.     public CheckedTextView2(Context context, AttributeSet attrs) {  
  8.         super(context, attrs);  
  9.     }  
  10.   
  11.     public CheckedTextView2(Context context, AttributeSet attrs, int defStyle) {  
  12.         super(context, attrs, defStyle);  
  13.     }  
  14.   
  15.     static class SavedState extends BaseSavedState {  
  16.         boolean checked;  
  17.   
  18.         /** 
  19.          * Constructor called from {@link CompoundButton#onSaveInstanceState()} 
  20.          */  
  21.         SavedState(Parcelable superState) {  
  22.             super(superState);  
  23.         }  
  24.   
  25.         /** 
  26.          * Constructor called from {@link #CREATOR} 
  27.          */  
  28.         private SavedState(Parcel in) {  
  29.             super(in);  
  30.             checked = (Boolean) in.readValue(null);  
  31.         }  
  32.   
  33.         @Override  
  34.         public void writeToParcel(Parcel out, int flags) {  
  35.             super.writeToParcel(out, flags);  
  36.             out.writeValue(checked);  
  37.         }  
  38.   
  39.         @Override  
  40.         public String toString() {  
  41.             return "CheckedTextView2.SavedState{"  
  42.                     + Integer.toHexString(System.identityHashCode(this))  
  43.                     + " checked=" + checked + "}";  
  44.         }  
  45.   
  46.         public static final Parcelable.Creator<SavedState> CREATOR  
  47.              = new Parcelable.Creator<SavedState>() {  
  48.             public SavedState createFromParcel(Parcel in) {  
  49.                 return new SavedState(in);  
  50.             }  
  51.   
  52.             public SavedState[] newArray(int size) {  
  53.                 return new SavedState[size];  
  54.             }  
  55.         };  
  56.     }  
  57.   
  58.     @Override  
  59.     public Parcelable onSaveInstanceState() {  
  60.         // Force our ancestor class to save its state  
  61.         setFreezesText(true);  
  62.         Parcelable superState = super.onSaveInstanceState();  
  63.   
  64.         SavedState ss = new SavedState(superState);  
  65.   
  66.         ss.checked = isChecked();  
  67.         return ss;  
  68.     }  
  69.   
  70.     @Override  
  71.     public void onRestoreInstanceState(Parcelable state) {  
  72.         SavedState ss = (SavedState) state;  
  73.   
  74.         super.onRestoreInstanceState(ss.getSuperState());  
  75.         setChecked(ss.checked);  
  76.         requestLayout();  
  77.     }  
  78. }  

0 件のコメント:

コメントを投稿