Android - ExpandableListView изменить фон для дочерних элементов - PullRequest
4 голосов
/ 15 декабря 2009

Я использую ExpandableListView в своем приложении, и одна из жалоб пользователей что при расширении элемента List трудно визуально определить, где находится ребенок пункт заканчивается, и начинается следующий элемент группы.

Поэтому я бы хотел изменить фон дочернего элемента List на другой оттенок.

Жестокие попытки, которые я предпринял до сих пор, основывались на непосредственном изменении цвета фона и текста элементов внутри дочернего элемента View, но это приводит к потере парения и бликов. Поэтому мой вопрос - что такое хорошая стратегия для достижения вышеизложенного?

Я пробовал styles и selectors, но что меня действительно огорчает, так это если я изменяю фон для дочернего элемента, тогда мне нужно добавить selectors для всех комбинаций фокусировки / включенного и т. Д. Когда все, что я пытаюсь сделать это переписать одну вещь.

Есть ли способ наследовать родительский style и устанавливать background только для не сфокусированного, включенного дочернего элемента с другими styles сохраненными?

Ответы [ 3 ]

5 голосов
/ 15 декабря 2009

Хорошо. Вот что сработало для меня:

  1. Создайте list_background.xml в каталоге res/drawable вашего проекта
  2. Установите фоновое значение макета верхнего уровня вашего дочернего элемента на рисунок выше. Если вы почесываете голову в этот момент - я имею в виду XML-файл макета, который используется при создании дочернего представления вашего расширяемого списка в ExpandableListAdapter#getChildView

Вот полный файл для рисования

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:state_enabled="true"
        android:drawable="@drawable/list_highlight_active" />
    <item android:state_enabled="true" android:state_selected="true" 
        android:state_window_focused="true"
    android:drawable="@drawable/list_highlight_inactive" />
    <item android:state_enabled="true" android:state_window_focused="true" 
        android:drawable="@color/item_body" />
    <item android:drawable="@color/item_body" />
</selector>

Мне пришлось скопировать list_highlight_active.xml и list_highlight_inactive.xml из /android-sdk-windows-1.6_r1/platforms/android-1.5/data/res/drawable в каталог для рисования моего проекта. @color/item_body это просто оттенок серого

0 голосов
/ 13 марта 2014

Я ищу подобное решение. Вы можете попробовать получить родительский вид для метода адаптера getChieldView. Я думаю, что этот родитель - родительский взгляд на все ваши шилды. И установить фон из ресурса для этого родителя. Я делаю это так:

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,  View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.fa_report_sub_item, null);
        View parentGroup=(View) convertView.getParent();
        parentGroup.setBackgroundResource(R.drawable.fa_summ_report_main_item);
    }
0 голосов
/ 06 апреля 2010

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

Как вы заметили, задание сплошного цвета фона стирает блики селектора, потому что новый цвет фона скрывает его. У Droidin есть то, что является нормальным решением: обеспечьте свой собственный фоновый селектор точными цветами, которые вы хотите. Это боль по меньшей мере.

Но если вам нужна только небольшая цветовая дифференциация, то есть более простой способ: альфа-смешение. Установите цвет фона с альфа-значением. Например, установите фоновое значение "#BBFFFFFF". Первые две цифры обозначают уровень альфа. Все будет смешиваться, поэтому фон не будет чисто белым, а выделение не будет обычным ярко-оранжевым, но дочерние элементы будут другого цвета, а выделение будет работать. Беспроигрышный.

...