androidのSpinnerの文字色を変えるのが難しい件

androidアプリを作成していてSpinnreの文字色を変えたかったのですが、結構手間がかかりました。
ButtonやTextViewなら。**.setTextColor(**)とするだけで簡単ですが、Spinnreではできません。
ググるとsimple_spinner_item.xmlとsimple_spinner_item.xmlをカスタマイズする方法がすぐに見つかりましたが、 これだと色が固定されてしまいます。
自分がしたかったのは変数等で指定して色を変える処理だったのでこの方法は使えませんでした。
も少し調べてAdapterを自作すれば良いらしいと分かりました。

注意API 14 (android4.0) 以上では正常動作しません。
こちらをご参照ください。

作成

Eclipseを使用しました。
実行時のスナップショットです。



コードは以下の通りです。
Spinnerを2個配置しています。
上段は普通のSpinner、下段はadapterを自作してその中で色を変更しています。
simple_spinner_item.xmlとsimple_spinner_item.xmlは作成する必要はありません。


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>




SpinnerTestActivity,java
package spinner.test.namespace;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class SpinnerTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String[] s_items = {"RED", "BLUE", "BLACK", "YELLOW", "GREEN"};
        //普通のSpinner
        Spinner spinner1 = (Spinner)findViewById(R.id.spinner1);
        ArrayAdapter<String> adapter1 =
    		new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, s_items);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(adapter1);
        //カスタマイズSpinner
        Spinner spinner2 = (Spinner)findViewById(R.id.spinner2);
        IntentItemArrayAdapter adapter2 =
        	new IntentItemArrayAdapter(this, android.R.layout.simple_spinner_item, s_items);
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner2.setAdapter(adapter2);
    }
    
    private class IntentItemArrayAdapter extends ArrayAdapter<String> {
        private int resourceId;
        private int resourceId2;
        public IntentItemArrayAdapter(Context context, int resourceId, String[] items) {
            super(context, resourceId,items);
            this.resourceId = resourceId;
            this.resourceId2 = resourceId;
        }
        public void setDropDownViewResource(int resourceId2){
            this.resourceId2 = resourceId2;
        }
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) getContext()
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(resourceId2, null);
            }
            TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
            String cs=this.getItem(position);
            tv.setText(cs);
            tv.setTextColor(Color.parseColor(cs));//ここでリストの文字色を指定
            return convertView;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) getContext()
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(resourceId, null);
            }
            TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
            String cs=this.getItem(position);
            tv.setText(cs);
            tv.setTextColor(Color.parseColor(cs));//ここでスピナの文字色を指定
            return convertView;
        }
    }

}



【おまけ】
ついでだったのでサンプルではリストを1個ずつ色を変えましたが、最初の目的は全体を特定の色にすることだったので 他のViewの様にsetTextColor()で一発で変えられるようにして欲しかったというのが感想です。
TOPに戻る
2012/4/23