前回記事で、なかなか思い通りにならなかったSpinnerだが、色々試行錯誤してとりあえずプロンプトとチェックマークの表示に成功した。
チェックマークの表示
これはドロップダウン表示用のリソースXMLにandroid:checkMarkの項目を追加するだけでOKだった。
spinner_dropdown_item.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinVal"
style="?android:attr/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="@android:drawable/btn_radio"
android:padding="10dp"
android:textSize="24sp" />
プロンプトの表示
リソースにテキストを追加したうえで、リソースIDをSpinnerクラスのsetPromptIdメソッドで指定すればよい。簡単に文字列で指定出来ないものかと思ったのだが、それは出来ないみたい。ってことは動的にプロンプトを変えることが出来ないわけで、Spinnerって色々イケてないよね…
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
:
<string name="SelCatPrompt">カテゴリを選択</string>
<string name="SelSubCatPrompt">サブカテゴリを選択</string>
</resources>
ActivityのOnCreateメソッド
上記のsetPromptIdメソッドが増えている以外は変わっていないが、OnCreateメソッドは以下。
EditActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
mContentResolver = getContentResolver();
Intent i = getIntent();
mRecID = i.getLongExtra("id", -1);
// レコードの取得
Cursor cursor = mContentResolver.query(MyContentProvider.RECORD_URI, null, "_id = " + mRecID, null, null);
cursor.moveToFirst();
((TextView)findViewById(R.id.date)).setText(cursor.getString(2)); // 日付
mCatID = cursor.getInt(7);
mSubCatID = cursor.getInt(8);
// Category Spinner
cursor = mContentResolver.query(MyContentProvider.CATEGORY_URI, null, null, null, null);
cursor.moveToFirst();
String[] from = {"Name"};
int[] to = {R.id.spinVal};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.spinner_item, cursor, from, to, 0);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
mCatSpinner = (Spinner)findViewById(R.id.category);
mCatSpinner.setAdapter(adapter);
selectSpinnerByID(mCatSpinner, mCatID);
mCatSpinner.setPromptId(R.string.SelCatPrompt);
mCatSpinner.setOnItemSelectedListener(this);
// SubCategory
cursor = mContentResolver.query(MyContentProvider.SUBCATEGORY_URI, null, "CatID = " + mCatID, null, null);
mSubCatAdapter = new SimpleCursorAdapter(this, R.layout.spinner_item, cursor, from, to, 0);
mSubCatAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
mSubCatSpinner = (Spinner)findViewById(R.id.subCategory);
mSubCatSpinner.setAdapter(mSubCatAdapter);
selectSpinnerByID(mSubCatSpinner, mSubCatID);
mSubCatSpinner.setPromptId(R.string.SelSubCatPrompt);
mSubCatSpinner.setOnItemSelectedListener(this);
}
実行結果
「カテゴリ」のSpinnerを選択状態にした時。チェックマークとしてラジオボタンが表示されており、先頭にプロンプトも表示されて殺風景な表示が改善された。
「サブカテゴリ」のSpinnerを選択状態にした時も同様。
というわけで表示は申し分ない状態になったが、前回記事で書いた通り素のSpinnerには「非選択状態に出来ない」という致命的な欠陥がある。これを解消するためには専用のAdapterを作るしかないだろうが、ひとまずアプリの完成を優先させることにする。
コメント