android更改微调器中项目的文本颜色

android更改微调器中项目的文本颜色,android,text,colors,spinner,Android,Text,Colors,Spinner,我有一个微调器,在某些情况下,一些选项不应该是可选的。我有代码,使项目不可选择,但它没有灰色的文本颜色,以指定该项目是不可选择的。如何更改微调器中应禁用的项目的文本颜色?代码如下: public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.

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

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

我发现,要实现这一点,在主活动中设置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); 
} 
public类主扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PatchedSpinner pSpinner=(PatchedSpinner)findViewById(R.id.spinner2);
ArrayList testarray=新的ArrayList();
增加(“第0项”);
增加(“第1项”);
增加(“第2项”);
增加(“第3项”);
ArrayAdapter spinnerAdapter=新的ArrayAdapter(此,android.R.layout.simple\u微调器\u下拉菜单\u项,testarray){
@凌驾
公共布尔值isEnabled(整型位置){
返回位置!=1;
}
@凌驾
公共布尔值areAllItemsEnabled(){
返回false;
}
@凌驾
公共视图getDropDownView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
Context mContext=this.getContext();
LayoutInflater vi=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=vi.充气(R.布局.行,空);
}
TextView tv=(TextView)v.findViewById(R.id.spinnerTarget);
tv.setText(testarray.get(position));
开关(位置){
案例0:
tv.setTextColor(颜色:红色);
打破
案例1:
tv.setTextColor(Color.BLUE);
打破
违约:
tv.setTextColor(Color.BLACK);
打破
}
返回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 spinner的人

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);
    }       
}
public类主扩展活动{
私人纺纱机-纺纱机法;
String[]_methodStrings=新字符串[]{“项目A”、“项目B:False”、“项目C:False”、“最后一项”};
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CreateSpinner();
}
public void CreateSpinner()
{       
_spinnerMethod=(Spinner)findViewById(R.id.Spinner\u edit\u death\u method);
最终ArrayList reasonArray=新ArrayList();

对于(int i=0;我想知道你为什么不使用原始的android spinner项目而不是使用自己的视图?我使用原始文本视图完成了这项工作,省得我在两个地方编辑它。这很遗憾地将默认材质设计重置为没有填充、错误的文本大小等。这比公认的要好得多,但是,我们有很多未使用的ird变量名(curSlaughterVal?externalStatus?@AbAppletic)已按建议更新为没有未使用的值。我想我有externalStatus,因此可以在页面上的其他位置进行设置,但已更改为简化答案。不幸的是,它看起来与普通微调器不同(下拉项更小、更近)。有没有办法让它看起来“正常”?@AlessandroF不确定之前写过这个。我猜android上使用的基本默认布局可能会改变。例如,android.R.Layout.simple_spinner_dropdown_项可能是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);
    }       
}