Spinnerへチェックマークとプロンプト表示を追加

前回記事で、なかなか思い通りにならなかった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を作るしかないだろうが、ひとまずアプリの完成を優先させることにする。

コメント