web-dev-qa-db-ja.com

androidスピナーのアイテムのテキストの色を変更する

特定の条件で一部のオプションを選択できないスピナーがあります。アイテムを選択できないようにするコードがありますが、アイテムが選択できないことを指定するためにテキストの色がグレー表示されません。無効にする必要があるスピナーのアイテムのテキストの色を変更するにはどうすればよいですか?コードは次のとおりです。

public class main extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PatchedSpinner pSpinner = (PatchedSpinner) findViewById(R.id.spinner2);
    ArrayList<String> testarray = new ArrayList<String>();
    testarray.add("item0");
    testarray.add("item1");
    testarray.add("item2");
    testarray.add("item3");

    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, 
            Android.R.layout.simple_spinner_dropdown_item, testarray) { 

        @Override
        public boolean isEnabled(int position) {
            return position != 1;
        }

        public boolean areAllItemsEnabled() { 
            return false; 
        } 
    };
    pSpinner.setAdapter(spinnerAdapter);
}

以下は、スピナー内の特定のアイテムを無効にできるスピナーを作成するために使用されるカスタムスピナークラスです。

public class PatchedSpinner extends Spinner {

    public PatchedSpinner(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 

    public PatchedSpinner(Context context) { 
        super(context); 
    } 

    public PatchedSpinner(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    }

    @Override 
    public boolean performClick() {
        // this line removed, we do not want to delegate the click to the spinner.
        // boolean handled = super.performClick(); 

        Context context = getContext();

        final DropDownAdapter adapter = new DropDownAdapter(getAdapter());

        CharSequence mPrompt = getPrompt();

        AlertDialog.Builder builder = new AlertDialog.Builder(context); 
        if (mPrompt != null) { 
            builder.setTitle(mPrompt); 
        } 
        builder.setSingleChoiceItems(adapter, getSelectedItemPosition(), this).show();

        return true; 
    }

    private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { 
        private SpinnerAdapter mAdapter;

        public DropDownAdapter(SpinnerAdapter adapter) { 
            mAdapter = adapter; 
        }

        public int getCount() { 
            return mAdapter == null ? 0 : mAdapter.getCount(); 
        }

        public Object getItem(int position) { 
            return mAdapter == null ? null : mAdapter.getItem(position); 
        }

        public long getItemId(int position) { 
            return mAdapter == null ? -1 : mAdapter.getItemId(position); 
        }

        public View getView(int position, View convertView, ViewGroup parent) { 
            return getDropDownView(position, convertView, parent); 
        }

        public View getDropDownView(int position, View convertView,ViewGroup parent) { 
            if (mAdapter == null) {
                return null;
            }
            mAdapter.getDropDownView(position, convertView, parent);
        }

        public boolean hasStableIds() { 
            return mAdapter != null && mAdapter.hasStableIds(); 
        }

        public void registerDataSetObserver(DataSetObserver observer){ 
            if (mAdapter != null) { 
                mAdapter.registerDataSetObserver(observer); 
            } 
        }

        public void unregisterDataSetObserver(DataSetObserver observer) { 
            if (mAdapter != null) { 
                mAdapter.unregisterDataSetObserver(observer); 
            } 
        }

        // PATCHED 
        public boolean areAllItemsEnabled() { 
            if (mAdapter instanceof BaseAdapter) { 
                return ((BaseAdapter) mAdapter).areAllItemsEnabled(); 
            } else { 
                return true; 
            } 
        }

        // PATCHED 
        public boolean isEnabled(int position) { 
            if (mAdapter instanceof BaseAdapter) { 
                return ((BaseAdapter) mAdapter).isEnabled(position); 
            } else { 
                return true; 
            } 
        }

        public int getItemViewType(int position) { 
            return 0; 
        }

        public int getViewTypeCount() { 
            return 1; 
        }

        public boolean isEmpty() { 
            return getCount() == 0; 
        } 
    }
}
12
Jonathan

これを機能させるには、メインアクティビティでArrayAdapterを設定するときにgetDropDownViewをオーバーライドする必要があることがわかりました。

public class main extends Activity {  
     @Override 
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);  

        PatchedSpinner pSpinner = (PatchedSpinner) findViewById(R.id.spinner2); 
        ArrayList<String> testarray = new ArrayList<String>();
        testarray.add("item0");
        testarray.add("item1");
        testarray.add("item2");
        testarray.add("item3");
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,Android.R.layout.simple_spinner_dropdown_item, testarray) {

           @Override      
           public boolean isEnabled(int position) {
               return position != 1;                             
           }

           @Override                
           public boolean areAllItemsEnabled() {
               return false;
           }

           @Override
           public View getDropDownView(int position, View convertView, ViewGroup parent){
               View v = convertView;
               if (v == null) {
                   Context mContext = this.getContext();
                   LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                   v = vi.inflate(R.layout.row, null);
               }

               TextView tv = (TextView) v.findViewById(R.id.spinnerTarget);
               tv.setText(testarray.get(position));

               switch (position) {
                   case 0:
                       tv.setTextColor(Color.RED);  
                       break; 
                   case 1:
                       tv.setTextColor(Color.BLUE);
                       break;
                   default:
                       tv.setTextColor(Color.BLACK);
                       break;
               }
               return v;  
           }              
        };

        pSpinner.setAdapter(spinnerAdapter); 
} 

膨らまされているレイアウトは、row.xmlと呼ばれるカスタムレイアウトです。ドロップダウンビューの表示を設定するために使用されます。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/spinnerTarget"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="14pt" />
26
Jonathan

オリジナルの提供されたAndroidスピナーを使用したい人のために。

public class main extends Activity { 

    private Spinner _spinnerMethod;

    String[] _methodStrings = new String[]{"Item A", "Item B:False","Item C:False","Last Item"};

    @Override 
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);     

        CreateSpinner();
    }

    public void CreateSpinner()
    {       
    _spinnerMethod = (Spinner) findViewById(R.id.spinner_edit_death_method);
    final ArrayList<String> reasonArray = new ArrayList<String>();
    for(int i = 0; i <_methodStrings.length;i ++)
    {
        reasonArray.add(_methodStrings[i]);
    }

    ArrayAdapter<String> methodAdapter = new ArrayAdapter<String>(this, Android.R.layout.simple_spinner_item, reasonArray)
        {

            @Override      
            public boolean isEnabled(int position) {
                String val = reasonArray.get(position);
                // In my case added :False to the end of strings I wanted effected for some call
                boolean isFalse = val.contains(":False");                   
                return !isFalse; 
            }

            @Override                
            public boolean areAllItemsEnabled() {
                return false;
            }

            @Override
            public View getDropDownView(int position, View convertView,Android.view.ViewGroup parent){
                View v = convertView;
                if (v == null) {
                    Context mContext = this.getContext();
                    LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    // Androids orginal spinner view item
                    v = vi.inflate(Android.R.layout.simple_spinner_dropdown_item, null);
                }
                // The text view of the spinner list view
                TextView tv = (TextView) v.findViewById(Android.R.id.text1);
                String val = reasonArray.get(position); 
                // remove the extra text here
                tv.setText(val.replace(":False", ""));

                boolean disabled = !isEnabled(position);
                if(disabled){tv.setTextColor(Color.GRAY);}
                else{tv.setTextColor(Color.BLACK);}

                return v;  
            }
        };
    methodAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
    _spinnerMethod.setAdapter(methodAdapter);
    }       
}
3
SatanEnglish