前回記事で、なかなか思い通りにならなかったSpinnerだが、色々試行錯誤してとりあえずプロンプトとチェックマークの表示に成功した。
チェックマークの表示
これはドロップダウン表示用のリソースXMLにandroid:checkMarkの項目を追加するだけでOKだった。
spinner_dropdown_item.xml
1 2 3 4 5 6 7 8 9 10 | <?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
1 2 3 4 5 6 | <? xml version = "1.0" encoding = "utf-8" ?> < resources > : < string name = "SelCatPrompt" >カテゴリを選択</ string > < string name = "SelSubCatPrompt" >サブカテゴリを選択</ string > </ resources > |
ActivityのOnCreateメソッド
上記のsetPromptIdメソッドが増えている以外は変わっていないが、OnCreateメソッドは以下。
EditActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | @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を作るしかないだろうが、ひとまずアプリの完成を優先させることにする。
コメント