Индивидуальный цвет фона для блесны - PullRequest
1 голос
/ 07 апреля 2020

Я бы хотел покрасить фон каждого предмета спиннера. Элементы задаются с помощью этого кода:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.duesentypen, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Шестнадцатеричные значения хранятся в массиве. Принимая во внимание, что индексное число относится к количеству пунктов. Например:

String[] hex = {"#886da8", "#ffc3cf","#ef9b00", "#2bb430", "#f7dc01", "#bc65a2", "#487ebf","#e00124","#b36634","#949494", "#ffffff","#000000","#4bbbd0", "#8b6d9f", "#8ccff4"};
//color for the first spinner item: hex[0]
//color for the second spinner item: hex[1]

Как я могу сделать это наилучшим образом?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вам необходимо создать пользовательский адаптер Spinner и переопределить getView(), чтобы установить цвет и текст каждого элемента.

Здесь я обертываю цвета вокруг массива цветов с помощью оператора модуля (% ) во избежание IndexOutOfBoundsExecption, если элементы больше доступных цветов.

Пользовательский адаптер

public class ColorAdapter extends BaseAdapter {

    private ArrayList<Integer> mColors;
    private String[] mItems;

    ColorAdapter2(String[] items) {
        mItems = items;
        String[] hex = {"#886da8", "#ffc3cf", "#ef9b00", "#2bb430", "#f7dc01", "#bc65a2", "#487ebf", "#e00124", "#b36634", "#949494", "#ffffff", "#000000", "#4bbbd0", "#8b6d9f", "#8ccff4"};

        mColors = new ArrayList<>();
        for (String color : hex) {
            mColors.add(Color.parseColor(color));
        }

    }

    @Override
    public int getCount() {
        return mItems.length;
    }

    @Override
    public Object getItem(int args) {
        return mColors.get(args);
    }

    @Override
    public long getItemId(int args) {
        return args;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, null);
            holder = new ViewHolder();
            holder.textView = convertView.findViewById(android.R.id.text1);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textView.setBackgroundColor(mColors.get(position % mColors.size()));
        holder.textView.setText( mItems[position]);
        return convertView;
    }

    /* Return spinner text of the item at particular position*/
    public String getItemAtPosition(int position) {
        if (position > -1 && position < mItems.length)
            return mItems[position];
        else
            return null;
    }

    static class ViewHolder {
        TextView textView;
    }

}

Использование

Spinner spinner = findViewById(R.id.spinner);
spinner.setAdapter(new ColorAdapter(getResources().getStringArray(R.array.myItems)));

строк. xml

<resources>
    <string name="app_name">Color Activity</string>
    <string-array name="myItems">
        <item>item1</item>
        <item>item2</item>
        <item>item3</item>
        <item>item4</item>
        <item>item5</item>
    </string-array>
</resources>

Результат

enter image description here

Редактировать

Как получить текст выбранного элемента? spinner.getItemAtPosition (spinner.getSelectedItemPosition ()). toString () больше не работает. Возвращаемое значение представляет собой большое число.

Теперь, когда мы создали собственный адаптер, вам нужно настроить любые связанные данные, и вы не можете полагаться на API адаптера Spinner по умолчанию; поэтому я добавил выше getItemAtPosition() метод в пользовательском адаптере, который принимает позицию и возвращает текст этого элемента.

Использование

String item = ((ColorAdapter)spinner.getAdapter()).getItemAtPosition(position));

И вы можете получить его, когда выбран предмет:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        Log.d(TAG, "onItemSelected: " + 
              ((ColorAdapter)spinner.getAdapter()).getItemAtPosition(position));

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
});
0 голосов
/ 07 апреля 2020

Попробуйте изменить цвет в соответствии с положением.

final List<String> plantsList = new ArrayList<>(Arrays.asList(plants));

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.duesentypen, android.R.layout.simple_spinner_item){
            @Override
            public View getDropDownView(int position, View convertView,
                                        ViewGroup parent) {
                View view = super.getDropDownView(position, convertView, parent);
                TextView tv = (TextView) view;

        switch(position) {
             case 0:
                tv.setTextColor(Color.parseColor("#FF7C7967"));
             case 1:
                tv.setTextColor(Color.parseColor("#FF7C7967"));
                   }

                return view;
            }
        };

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
...