Может ли Android <selector>основываться на состоянии объекта вместо состояния представления? - PullRequest
1 голос
/ 03 августа 2010

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

Я занимаюсь разработкой приложения для Android (в настоящее время разрабатывается для API v1.5), и в одном из упражнений используется ListView. Я хочу иметь возможность устанавливать свойства каждого элемента списка на основе состояния объекта в памяти, а не состояния представления или элемента списка.

Вот простой пример .... скажем, у меня есть класс Person, публичные члены которого определены следующим образом:

public class Person {       
    public string getName() {...}

    public boolean isYoung() {...}        
    public boolean isMiddleAged() {...}
    public boolean isOld() {...}
}

Так же, как в примере, приведенном выше, свойства в моем классе являются взаимоисключающими (поэтому только одно из трех логических значений может быть истинным). Теперь скажите, что каждый элемент списка в моем ListView создан из объекта Person. В настоящее время я использую пользовательский класс ArrayAdapter для привязки объектов Person к представлению списка (не уверен, имеет ли это значение или нет, но думал, что упомяну это).

Я хочу иметь возможность устанавливать различные свойства элемента списка (цвет текста, стиль и цвет фона) на основе значений каждого объекта Person, который связан в представлении списка. Как, возможно, сделать фоновый цвет всех молодых людей зеленым, людей среднего возраста оранжевым, а стариков черным. Как мне достичь этих результатов?

ОБНОВЛЕНИЕ: Спасибо за ваш быстрый ответ Кристиан С. Я пытался реализовать ваше решение и продолжаю получать это исключение:

Причина: org.xmlpull.v1.XmlPullParserException: строка двоичного XML-файла # 6: <item> тег требует атрибут «drawable» или дочерний тег, определяющий drawable

... каждый раз, когда setBackgroundResource () выполняется:

public View getView(int index, View convertView, ViewGroup parent) {
    //...stuff here...

   if(person.isYoung())
      view.setBackgroundResource(R.drawable.green);
}

Где селектор 'green.xml' определяется следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:background="@color/green" />
</selector>

Видите ли вы какие-либо вопиющие ошибки в том, что я пытаюсь сделать?

Спасибо за ваши ответы!

1 Ответ

0 голосов
/ 03 августа 2010

Вам придется делать это программно.Предположим, вы определили все эти селекторы в XML-файле;тогда у вас будет что-то вроде этого:

private class YourAdapter extends ArrayAdapter<Person>{
    // foo bar baz
    //...

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

        // more foo bar baz

        if( person.isYoung() )
            view.setBackgroundResource(R.drawable.green);
        else if( person.isMiddledAge() )
            view.setBackgroundResource(R.drawable.orange);
        else if( person.isOld() )
            view.setBackgroundResource(R.drawable.black);// are you racist?  Just kidding

        return view;
    }
}

Вы можете определить свой селектор следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:drawable="@drawable/green" />
</selector>

Зеленый может быть изображением в папке для рисования с именем green.png.Вы также можете сделать это, используя сплошные цвета, которые вы определили в файле colors.xml (каталог values):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="orange">#FF5721</color>
</resources>

Затем вы должны сделать:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:drawable="@color/orange" />
</selector>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...