上記のように条件によってSpinnerを選択不可にしたいパターンはよくあると思う。
ついでにSpinner内のテキストの色も選択 / 選択不可に応じて色を変えたい場合もあるだろう。
通常の例に沿って下記のようなセレクタとスタイルを用意してテキストカラー変更を試みてみた。
color/spinner_text.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="false" android:color="@android:color/darker_gray" />
<item android:color="@android:color/black" />
</selector>
values/styles.xml<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme" parent="@android:style/Theme">
<item name="android:spinnerItemStyle">@style/SpinnerItem</item>
</style>
<style name="SpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
<item name="android:textColor">@color/spinner_text</item>
</style>
</resources>
だけど、なぜか選択不可状態の色が反映されず...
ということで代替案で対応させてみたのが下記。
SpinnerActivity.java
public class SpinnerActivity extends Activity implements
OnCheckedChangeListener {
private Spinner mSpinner;
private RadioGroup mRadioGroup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSpinner = (Spinner) findViewById(R.id.spinner);
String[] brands =
new String[] { "LARK", "Seven Stars", "MILD SEVEN", "etc" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, brands);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
mRadioGroup = (RadioGroup) findViewById(R.id.group);
mRadioGroup.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton radioButton = (RadioButton) findViewById(checkedId);
if (radioButton.isChecked()) {
spinnerControl(checkedId);
}
}
/**
* Spinnerの選択状態を制御する
* @param checkedId
*/
private void spinnerControl(int checkedId) {
int color = Color.BLACK;
switch (checkedId) {
case R.id.yes:
mSpinner.setEnabled(true);
break;
case R.id.no:
mSpinner.setEnabled(false);
color = Color.GRAY;
break;
}
// SpinnerからTextViewを取り出してテキストカラーを設定
TextView textView = (TextView) mSpinner.getChildAt(0);
textView.setTextColor(color);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
int checkedId = mRadioGroup.getCheckedRadioButtonId();
spinnerControl(checkedId);
}
}
はい完成。ポイントは50行目〜51行目。
誰かセレクタで出来た人いたらやり方おせ〜て〜。


0 件のコメント:
コメントを投稿