簡単にできると踏んでたのですがおお間違い。かなり苦労しましたが何とかなりました。
お助け頂いたのは以下なエントリです。Thx a lot!!
DialogPreference に仕込んだのですが onBindDialogView の定義が以下。
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
Spinner spinner = (Spinner)view.findViewById(R.id.spinner);
SpinnerArrayAdapter mSpinnerArrayAdapter = new SpinnerArrayAdapter(mContext, android.R.layout.simple_spinner_item, spinnerItem);
mSpinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinnerArrayAdapter.setItemPositionIsDisable(0,true);
mSpinnerArrayAdapter.setItemPositionIsDisable(1,false);
mSpinnerArrayAdapter.setItemPositionIsDisable(2,true);
spinner.setAdapter(mSpinnerArrayAdapter);
}
で、アダプタの定義が以下。ほぼ丸写し。微調整はしてますが、もう少し云々するかも。
private class SpinnerArrayAdapter extends ArrayAdapter<String>{
private int[] ItemPositionIsDisable;
public SpinnerArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public SpinnerArrayAdapter(Context context, int textViewResourceId, String[] objects) {
super(context, textViewResourceId,objects);
ItemPositionIsDisable = new int[objects.length];
}
public SpinnerArrayAdapter(Context context,String[] objects){
this(context, android.R.layout.simple_spinner_item,objects);
this.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
public SpinnerArrayAdapter(int stringArrayResourceId,Context context){
this(context, context.getResources().getStringArray(stringArrayResourceId));
}
public boolean isEnabled(int position) {
if (ItemPositionIsDisable[position]==0)
return false;
return true;
}
public void setItemPositionIsDisable(int position,boolean IsDisable) {
ItemPositionIsDisable[position] = (IsDisable) ? 1 : 0;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View mView = super.getDropDownView(position, convertView, parent);
TextView mTextView = (TextView) mView;
if (ItemPositionIsDisable[position] == 0) {
mTextView.setTextColor(Color.GRAY);
} else if (ItemPositionIsDisable[position] == 1) {
mTextView.setTextColor(Color.BLACK);
}
return mView;
}
いやはや。
追記
これで終わるのはいかにもアレなのでもうちょい確認。以下なドキュメントによると
以下の記述。
Returns true if the item at the specified position is not a separator. (A separator is a non-selectable, non-clickable item).
このメソドが true を戻せば選択可能、という事になるのか。ただ、これって ListAdapter のメソドなんですが、と思ったら superclass の BaseAdapter に isEnabled が定義されているようですね。成程。