【问题标题】:android change text color of items in spinnerandroid更改微调器中项目的文本颜色
【发布时间】:2011-08-15 17:28:23
【问题描述】:

我有一个微调器,在某些情况下某些选项不应该是可选的。我有使项目不可选择的代码,但它不会使文本颜色变灰以指定该项目不可选择。如何更改微调器中应禁用的项目的文本颜色?代码如下:

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; 
        } 
    }
}

【问题讨论】:

    标签: android text colors spinner


    【解决方案1】:

    适用于任何想要使用原始提供的 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);
        }       
    }
    

    【讨论】:

    • 比公认的要好得多,但是,有很多奇怪的变量名称未使用(curSlaughterVal?externalStatus?)
    • @AbAppletic 已按照建议进行了更新,没有未使用的值。认为我有 externalStatus ,因此可以在页面上进行其他设置,但已更改以简化答案。
    • 不幸的是,它看起来与普通的 Spinner 不同(下拉项目越来越小)。有没有办法让它看起来“正常”?
    • @AlessandroF 不确定之前写过这个。我猜我会说android上使用的底层默认布局可能会改变。例如android.R.layout.simple_spinner_dropdown_item 也许在 android 默认库中有一个新的默认值。如果是这样,您只需要更新布局值
    【解决方案2】:

    我发现要完成这项工作,您必须在主活动中设置 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" />
    

    【讨论】:

    • 嘿伙计们,你们有没有理由不使用原始的 android 微调器项目而不是使用自己的视图?我已经用原始文本视图完成了它,我不必在两个地方进行编辑。
    • 这可悲地将默认材料设计重置为没有填充、错误的文本大小等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多