Android : 更改下拉列表中微调项的文本颜色

Android : Change the text color of a spinner item inside the dropdown list

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

当我这样做时(在 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));

无效。

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

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调用它。

希望对您有所帮助。

我认为在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 方法的 Worling 示例

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

创建自定义微调器适配器

尝试创建自定义 Spinner 适配器

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>

使用Custom Spinner Adapter的工作示例:

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