2

特定のPreferenceScreenの背後にさらに多くの設定があることをユーザーに示すために、矢印アイコンを表示するウィジェットレイアウトを設定画面に追加しました。

ただし、PreferenceScreenが有効になっていないと、暗くなります。使用しているウィジェットのレイアウトを変更したり、ステートフルにしたりして、PreferenceScreenが無効になっているときに色あせたアイコンを使用できるようにする方法はありますか?状態リストドローアブルをボタンの背景として適用する方法と同様ですか?

tl; dr:PreferenceLayoutのインスタンスが無効になっているときに表示されるアイコンを変更するにはどうすればよいですか?

4

2 に答える 2

3

これは、3つのステップでXMLのみを使用して実行できます。

まず、それを使用するウィジェットが有効か無効かなどに応じて変更できるステートフルドローアブルを作成します。したがって、statelist_example.xmlはドローアブルフォルダに保持されます。

<?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>

次に、独自のレイアウトを定義して、layoutsフォルダーでこのドローアブルを使用します。これは、プリファレンスの「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>

3番目に、このレイアウトを使用するには、すべての設定でwidgetLayoutを指定します。

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

つまり、基本的には、ステートフルドローアブルを参照するレイアウトをプリファレンス参照する必要があります。

StatelistDrawableのAndroidドキュメント。

PreferencewidgetLayoutのAndroidドキュメント。

于 2011-06-02T12:55:26.660 に答える
1

いい方法

この問題に取り組むために私が見ることができる最善の方法は、Preference/PreferenceScreenを拡張する独自のクラスを作成することです。必要なレイアウトリソースは、クラスの初期化で呼び出されます。

 setWidgetLayoutResource(R.layout.preference_color); 

これにより、ウィジェット領域に表示されるビューが作成されます。これは、設定が無効になっているときにグレー表示されることはないと思います。

ハッキー/醜い方法

私はこの問題を回避するためのハックを思いついただけだと思います。ウィジェットが状態をサポートしているとは思いません。

プログラムでウィジェットを変更するだけです。

   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;
        }
    }); 
于 2011-06-01T20:29:55.393 に答える