Список состояний для PreferenceScreen? - PullRequest
2 голосов
/ 02 мая 2011

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

Однако я замечаю, что если PreferenceScreen не включен, он затемняется.Есть ли способ, которым я мог бы также изменить используемый макет виджета или сделать его состоящим из состояния, чтобы я мог использовать блеклый значок, когда мой PreferenceScreen отключен?Аналогично тому, как можно нарисовать список состояний в качестве фона кнопки?

tl; dr: Как изменить значок, отображаемый, когда экземпляр PreferenceLayout отключен?

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Это можно сделать только с помощью XML за 3 шага.

Сначала создайте отрисовку с сохранением состояния, которая может изменяться в зависимости от того, включен ли виджет, использующий его, отключен и т. Д. Поэтому файл listlist_example.xml хранится впапка drawable:

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

Затем определите свой собственный макет, чтобы использовать его в папке раскладок.Это станет «widgetLayout» для предпочтения.Итак, layout_example.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/widget_frame"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
    android:id="@+id/icon"
    android:src="@drawable/statelist_example"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="6dip"
    android:layout_marginRight="6dip"
    android:layout_gravity="center" />
</LinearLayout>

В-третьих, укажите widgetLayout в каждом предпочтении, чтобы использовать этот макет:

        <Preference
        android:key="preference_example"
        android:title="@string/preference_title"
        android:widgetLayout="@layout/layout_example" />

Таким образом, в основном у вас есть предпочтения, ссылающиеся на Layout, который ссылается на рисующий состояние с возможностью рисования.

Документы Android в Statelist Drawable.

Документы Android в настройках widgetLayout.

1 голос
/ 02 июня 2011

Хороший метод

Лучший способ решить эту проблему - создать собственный класс, который расширяет Preference / PreferenceScreen. Требуемый ресурс макета вызывается при инициализации класса:

 setWidgetLayoutResource(R.layout.preference_color); 

Создает вид, отображаемый в области виджетов, который, я думаю, не выделяется серым цветом, когда предпочтение отключено.

Hacky / Ugly Method

Боюсь, что я только обдумал эту проблему, я не верю, что виджеты поддерживают состояния.

Просто измените виджет программно:

   Preference BGColor = findPreference("Setting_BG_Color"); 
   BGColor.setWidgetLayoutResource(R.layout.ic_custom);

Затем изменяйте компоновку виджета при каждом вызове зависимости (что-то вроде грязного).

pref1 = (Preference) findPreference("Setting_Pref1");
pref1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // Check what object returned (assume checkbox pref)
            if ((boolean)newValue){
                BGColor.setWidgetLayoutResource(R.layout.ic_custom2);
                }
            return true;
        }
    }); 
...