2012年2月19日日曜日

AndroidのSpinner内のテキストってselector効かなくね?


上記のように条件によってSpinnerを選択不可にしたいパターンはよくあると思う。
ついでにSpinner内のテキストの色も選択 / 選択不可に応じて色を変えたい場合もあるだろう。
通常の例に沿って下記のようなセレクタとスタイルを用意してテキストカラー変更を試みてみた。
color/spinner_text.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item android:state_enabled="false" android:color="@android:color/darker_gray" />  
  4.     <item android:color="@android:color/black" />  
  5. </selector>  
values/styles.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <style name="Theme" parent="@android:style/Theme">  
  4.         <item name="android:spinnerItemStyle">@style/SpinnerItem</item>  
  5.     </style>  
  6.   
  7.     <style name="SpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">  
  8.         <item name="android:textColor">@color/spinner_text</item>  
  9.     </style>  
  10. </resources>  

だけど、なぜか選択不可状態の色が反映されず...
ということで代替案で対応させてみたのが下記。
SpinnerActivity.java
  1. public class SpinnerActivity extends Activity implements  
  2.         OnCheckedChangeListener {  
  3.   
  4.     private Spinner mSpinner;  
  5.     private RadioGroup mRadioGroup;  
  6.   
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.   
  12.         mSpinner = (Spinner) findViewById(R.id.spinner);  
  13.         String[] brands =  
  14.                 new String[] { "LARK""Seven Stars""MILD SEVEN""etc" };  
  15.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
  16.                 android.R.layout.simple_spinner_item, brands);  
  17.         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
  18.         mSpinner.setAdapter(adapter);  
  19.   
  20.         mRadioGroup = (RadioGroup) findViewById(R.id.group);  
  21.         mRadioGroup.setOnCheckedChangeListener(this);  
  22.     }  
  23.   
  24.     @Override  
  25.     public void onCheckedChanged(RadioGroup group, int checkedId) {  
  26.         RadioButton radioButton = (RadioButton) findViewById(checkedId);  
  27.         if (radioButton.isChecked()) {  
  28.             spinnerControl(checkedId);  
  29.         }  
  30.     }  
  31.   
  32.     /** 
  33.      * Spinnerの選択状態を制御する 
  34.      * @param checkedId 
  35.      */  
  36.     private void spinnerControl(int checkedId) {  
  37.   
  38.         int color = Color.BLACK;  
  39.         switch (checkedId) {  
  40.         case R.id.yes:  
  41.             mSpinner.setEnabled(true);  
  42.             break;  
  43.   
  44.         case R.id.no:  
  45.             mSpinner.setEnabled(false);  
  46.             color = Color.GRAY;  
  47.             break;  
  48.         }  
  49.         // SpinnerからTextViewを取り出してテキストカラーを設定  
  50.         TextView textView = (TextView) mSpinner.getChildAt(0);  
  51.         textView.setTextColor(color);  
  52.     }  
  53.   
  54.     @Override  
  55.     public void onWindowFocusChanged(boolean hasFocus) {  
  56.         super.onWindowFocusChanged(hasFocus);  
  57.   
  58.         int checkedId = mRadioGroup.getCheckedRadioButtonId();  
  59.         spinnerControl(checkedId);  
  60.     }  
  61. }  

はい完成。ポイントは50行目〜51行目。
誰かセレクタで出来た人いたらやり方おせ〜て〜。

0 件のコメント:

コメントを投稿