【问题标题】:Android : Change the text color of a spinner item inside the dropdown listAndroid:更改下拉列表中微调器项目的文本颜色
【发布时间】:2017-01-28 01:28:56
【问题描述】:

如何更改下拉列表内部的微调器项目的文本颜色?

当我这样做时(在 onItemSelected 方法内):

((TextView) view).setTextColor(getResources().getColor(R.color.accent));

((TextView) spinner.getAdapter().getView(position, view, parent)).setTextColor(getResources().getColor(R.color.accent));

((TextView) spinner.getChildAt(position)).setTextColor(getResources().getColor(R.color.accent));

((TextView) spinner.getSelectedView()).setTextColor(getResources().getColor(R.color.accent));

它会更改微调器所选项目的颜色,但不会在下拉列表中。

然后这样做:

((TextView) spinner.getAdapter().getDropDownView(position, null, parent)).setTextColor(getResources().getColor(R.color.accent));

不起作用。

【问题讨论】:

    标签: android drop-down-menu colors textview spinner


    【解决方案1】:

    我认为在android中有两种方法可以实现这一点

    1. @Override ArrayAdapter 方法
    2. 创建自定义微调器适配器

    让我用例子解释每种方法:

    1. @Override ArrayAdapter 方法

    尝试 @Override getDropDownView(int position, View convertView, ViewGroup parent) 以根据您的要求自定义或设置 TextView 属性。

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
          TextView textView = (TextView) super.getDropDownView(position, convertView, parent);
          textView.setTextColor(Color.BLUE);
          return  textView;
    }
    

    尝试 @Override getView(int position, View convertView, ViewGroup parent) 以根据您的要求自定义或设置 TextView 属性。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
           TextView textView = (TextView) super.getView(position, convertView, parent);
           textView.setTextColor(Color.RED);
           return  textView;
    }
    

    使用 @Override ArrayAdapter 方法的工作示例

    spinnerList = new ArrayList<>();
    spinnerList.add("Spinner item 1");
    spinnerList.add("Spinner item 2");
    spinnerList.add("Spinner item 3");
    spinnerList.add("Spinner item 4");
    spinnerList.add("Spinner item 5");
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,spinnerList){
            @Override
            public View getDropDownView(int position, View convertView, ViewGroup parent) {
                TextView textView = (TextView) super.getDropDownView(position, convertView, parent);
                textView.setTextColor(Color.BLUE);
                return  textView;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView textView = (TextView) super.getView(position, convertView, parent);
                textView.setTextColor(Color.RED);
                return  textView;
            }
        };
    mSpinner.setAdapter(spinnerAdapter);
    

    创建自定义微调器适配器

    尝试创建自定义微调器适配器

    public class CustomSpinnerAdapter extends BaseAdapter {
    
    private Context context;
    private String[] data;
    private int selectedItemColor;
    private int itemColor;
    
    public CustomSpinnerAdapter(Context context, String[] data, int selectedItemColor, int itemColor) {
        this.context = context;
        this.data = data;
        this.selectedItemColor = selectedItemColor;
        this.itemColor = itemColor;
    }
    
    public CustomSpinnerAdapter(Context context, String[] data, String label, int selectedItemColor, int itemColor) {
        this.context = context;
        this.data = data;
        this.data = new String[data.length + 1];
        this.data[0] = label;
        for (int i = 1; i <= data.length; i++) {
            this.data[i] = data[i - 1];
        }
        this.selectedItemColor = selectedItemColor;
        this.itemColor = itemColor;
    }
    
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.spinner_selected_item, parent, false);
            holder.txtSpinnerSelected = (TextView) convertView.findViewById(R.id.txtSpinnerSelected);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.txtSpinnerSelected.setTextColor(itemColor);
        holder.txtSpinnerSelected.setText(data[position]);
        return convertView;
    
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.spinner_drop_down_item, parent, false);
            holder.txtSpinnerItem = (TextView) convertView.findViewById(R.id.txtSpinnerItem);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.txtSpinnerItem.setTextColor(selectedItemColor);
        holder.txtSpinnerItem.setText(data[position]);
        return convertView;
    }
    
    @Override
    public int getCount() {
        return data.length;
    }
    
    @Override
    public Object getItem(int position) {
        return data[position];
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    static class ViewHolder {
        TextView txtSpinnerSelected;
        TextView txtSpinnerItem;
    }
    }
    

    spinner_drop_down_item.xml

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/txtSpinnerItem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"></TextView>
    

    spinner_selected_item.xml

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/txtSpinnerItem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"></TextView>
    

    使用自定义微调器适配器的工作示例:

    String[] spinnerArray = new String[5];
    spinnerArray[0] = "Spinner item 1";
    spinnerArray[1] = "Spinner item 2";
    spinnerArray[2] = "Spinner item 3";
    spinnerArray[3] = "Spinner item 4";
    spinnerArray[4] = "Spinner item 5";
    CustomSpinnerAdapter customSpinnerAdapter = new      CustomSpinnerAdapter(this,spinnerArray,Color.RED,Color.BLUE);
    mSpinner.setAdapter(customSpinnerAdapter);
    

    【讨论】:

      【解决方案2】:

      您可以通过设置适配器来实现此目标。您应该创建一个自定义适配器,以简单的方式显示您的项目。

      this is the official reference for adapters。您可以参考这里的任何方法或变量。

      this SO link has the solution

      所以你要做的是:

      • 创建自定义适配器
      • 为适配器创建布局和 java 代码(您可以在 google 上轻松找到数千个示例
      • 从这里添加代码(您需要根据需要对其进行自定义。

      适配器

       class HighLightArrayAdapter extends ArrayAdapter<CharSequence> {
          private int mSelectedIndex = -1;
      
          public void setSelection(int position) {
              mSelectedIndex =  position;
              notifyDataSetChanged();
          }
      
          public HighLightArrayAdapter(Context context, int resource, CharSequence[] objects) {
              super(context, resource, objects);
          }
      
      
          @Override
          public View getDropDownView(int position, View convertView, ViewGroup parent) {
              View itemView =  super.getDropDownView(position, convertView, parent);
      
              if (position == mSelectedIndex) {
                  itemView.setBackgroundColor(Color.rgb(56,184,226));
              } else {
                  itemView.setBackgroundColor(Color.TRANSPARENT);
              }
      
              return itemView;
          }
      } 
      

      PS:

      由于setSelection方法不是原生的,需要从activity中的OnItemSelectedListener调用。

      希望这会有所帮助。

      【讨论】:

      • 最简单的解决方案的粉丝,我希望能够即时更改颜色,而无需使用自定义适配器。不过还是谢谢你。
      • @Denis 是的,我可以理解,但不幸的是,与基本布局不同的所有内容都可以实现,但需要一些代码。顺便说一句,创建适配器真的很容易。前段时间我也觉得这很烦人,我想尽一切办法避免它,但当我看到适配器的电源时我改变了主意。相信我,它真的很简单而且功能强大
      • 我习惯使用适配器,但像大多数开发人员一样,我很懒惰。顺便说一句,这次你真的帮我找到了需要的动力。谢谢你:)
      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多