android改变项目的文本颜色在旋转 [英] android change text color of items in spinner

查看:170
本文介绍了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){
返回位置!= 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(){
//此行已删除,我们不想将点击委托给微调器。
// boolean handled = super.performClick();

上下文上下文= 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实现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(BaseAdapter的mAdapter instance){
return )mAdapter).areAllItemsEnabled();
} else {
return true;
}
}

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

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

public int getViewTypeCount(){
return 1;
}

public boolean isEmpty(){
返回getCount()== 0;
}
}
}


解决方案>

我想出,为了使这项工作,你必须覆盖getDropDownView当在主活动中设置ArrayAdapter。

  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;
默认值:
tv.setTextColor(Color.BLACK);
break;
}
return v;
}
};

pSpinner.setAdapter(spinnerAdapter);
}

正在扩充的布局是一个名为row.xml的自定义布局。它用于设置下拉视图的显示。

 <?xml version =1.0encoding =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/>


I have a spinner where in certain conditions some options should not be selectable. I have the code to make items not selectable but it does not grey out text color to specify that the item is not selectable. How would I change the text color of the items in the spinner that should be disabled? Here is the code:

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

Below is the Custom Spinner Class used to create a spinner that is able to disable certain items in the spinner.

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

解决方案

I figured out that to make this work you have to override the getDropDownView when setting up the ArrayAdapter in the main activity.

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

The layout that is being inflated is a custom layout called row.xml. it is used to set the display for the dropdown view.

<?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改变项目的文本颜色在旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆