2016-09-20 2 views
0

Как изменить цвет текста элемента прядильника внутри выпадающий список?Android: измените цвет текста элемента прядильника в раскрывающемся списке

Когда я (внутри 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)); 

не работает.

ответ

1

Вы можете достичь этой цели, настроив адаптер. Вы должны создать пользовательский адаптер, показывающий ваши элементы простым способом.

this is the official reference for adapters. Вы можете ссылаться на это для любого метода или переменной.

this SO link has the solution.

Так что вы должны сделать, это:

  • Создание пользовательского адаптера
  • Создать макет и код Java для адаптера (вы можете легко найти на Google тысячи примеров
  • Добавьте код от этого (вам нужно будет настроить его для ваших нужд.

ADAPTER

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 не является родным, вам нужно вызвать его из OnItemSelectedListener в деятельности.

Надеюсь, это поможет.

+0

фанатом простое решение, мне бы хотелось изменить цвет «на лету», без необходимости используйте пользовательский адаптер. Но спасибо вам в любом случае. – Denis

+0

@ Denis да, я могу понять, но, к сожалению, все, что отличается от базовой компоновки, можно достичь, но требует некоторого кода. btw создание адаптера очень просто. Несколько раз назад я тоже думал, что это раздражает, и я пытался все, чтобы избежать этого, но я передумал, увидев силу адаптера. Поверьте, это очень легко и мощно –

+1

Я привык использовать адаптеры, но, как и большинство разработчиков, я довольно ленив. Кстати, на этот раз вы действительно помогли мне найти необходимую мотивацию. Спасибо :) – Denis

0

Я думаю, что есть два пути для достижения этой цели в андроида

  1. @Override ArrayAdapter методы
  2. Создание пользовательского Spinner адаптер

Позвольте мне объяснить каждый подход с примера:

  1. @Override ArrayAdapter метода

Попробуйте @Override getDropDownView (INT положения, Вид convertView, ViewGroup родителя) настроить или установить 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 положения, Вид convertView, ViewGroup родителя) настроить или установить 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; 
} 

Worling пример использования @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); 

Создание пользовательских спиннера адаптер

Попытка создать пользовательского 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> 

Работа пример использования пользовательского Spinner адаптер:

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); 
Смежные вопросы