2011-04-29 93 views
11

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

回答

24

我发现要做到这一点,必须在设置主活动中的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" /> 
+0

我不能得到这个工作。 – user678392 2013-03-27 01:57:31

+0

干草家伙有没有一个原因,你没有使用原来的android微调项目,而不是使用自己的看法?我已经完成了原始文本视图,不必在两处编辑它。 – SatanEnglish 2014-02-19 01:24:09

+0

这很遗憾地重置默认材质设计,使其没有填充,错误的文字大小等。 – 2017-06-05 11:17:53

2

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

比接受的要好得多,但是有很多奇怪的变量名未被使用(curSlaughterVal?externalStatus?) – 2017-06-05 11:23:00

+0

@AbAppletic已更新建议不要有未使用的值。认为我有externalStatus,所以它可以在页面上设置其他的,但已经改变,以简化答案。 – SatanEnglish 2017-06-06 01:52:41

相关问题