3

私はカスタムDialogPreferenceを作成しており、ListPreferenceが必要とするのと同様に、entryentryValuesという名前の文字列の2つの配列を使用して設定を設定します。コンストラクターがAttributeSetパラメーターを使用して呼び出されたときに両方の配列が存在するように見えても、getstyledAttributesを介してスタイル付き配列をフェッチしようとするとnullが返され失敗します。

何が間違っているので、どうすればこれを修正できますか?

私のカスタムクラスコードは次のとおりです。

public class BackgroundPicker extends DialogPreference {    

    private CharSequence[] mEntries;
    private CharSequence[] mEntryValues;

    public BackgroundPicker(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        // Print all values in attrs AttributeSet:
        for (int i=0;i<attrs.getAttributeCount();i++) {
            String name = attrs.getAttributeName(i);
            Object value  = attrs.getAttributeValue(i);
            Log.d(TAG, name + " : " + value + " of type " + value.getClass().getSimpleName());
        }

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListPreference, 0, 0);

        // getIndexCount returns zero !
        for(int i=0; i<a.getIndexCount(); i++) {
            TypedValue v = a.peekValue(i);
            Log.d(TAG, "value[" + i + "] = " + v.toString());
        }

        // Both entries and entryValues are null.
        mEntries = a.getTextArray(R.styleable.ListPreference_entries);
        mEntryValues = a.getTextArray(R.styleable.ListPreference_entryValues);
    }
}

私のデバッグ出力は次のとおりです。

BackgroundPicker CTOR: IN
BackgroundPicker CTOR param attrs:
entries : @2131099650 of type String
title : @2131165247 of type String
key : BackgroundImage of type String
summary : @2131165248 of type String
defaultValue : back.png of type String
entryValues : @2131099651 of type String
BackgroundPicker CTOR param defStyle = 0
BackgroundPicker CTOR: OUT

styles.xmlの私のスタイル

<declare-styleable name="ListPreference">
    <attr name="entries" format="reference" />
    <attr name="entryValues" format="reference" />
</declare-styleable>    

array.xmlの私のデータ

<array name="Backgrounds">
    <item>back.png</item>
    <item>one.png</item>
</array>

と私の好みの設定:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory android:title="@string/generaloptions" >
        <BackgroundPicker
            android:defaultValue="back.png"
            android:entries="@+array/Backgrounds"
            android:entryValues="@+array/Backgrounds"
            android:key="BackgroundImage"
            android:summary="@string/backgroundImageSummary"
            android:title="@string/backgroundImage" />
    </PreferenceCategory>
 </PreferenceScreen>
4

1 に答える 1

3

+記号の付いた値は私には奇妙に思えます。設定で使用したことはありません。おそらく、これが誤った動作の主な理由です。android:entries="@array/Backgrounds"なしで使用するだけ+です。

また、私のコードを使用して値を取得してみてください。少なくとも整数型の属性では機能するため、他の型でも機能するはずです。

TypedArray a = context.obtainStyledAttributes(attrs, new int[] { R.attr.entries, R.attr.entryValues });
mEntries = a.getTextArray(0); // because R.attr.entries has index 0 in the passed array
mEntryValues = a.getTextArray(1);
于 2013-03-16T10:16:59.523 に答える