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

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

コメント