15

文書化されていますが、を使用する"%s"と、選択した値を要約として表示できますが、期待どおりに機能しません。

http://developer.android.com/reference/android/preference/ListPreference.html#getSummary%28%29

私は以下を持っていますpreferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:title="@string/preference_xxx_category">
        <CheckBoxPreference
            android:title="@string/preference_xxx_mode_title"
            android:defaultValue="false"
            android:summary="@string/preference_xxx_mode_summary"
            android:key="xxxModePreference" />
    </PreferenceCategory>

    <PreferenceCategory
        android:title="@string/preference_yyy_category">
        <ListPreference
           android:title="@string/preference_yyy_mode_title"
           android:defaultValue="0"
           android:entries="@array/yyy"
           android:entryValues="@array/yyy_values"
           android:summary="%s"
           android:key="yyyModePreference" />         
    </PreferenceCategory>

</PreferenceScreen>

そしてここに私のarrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="yyy">
        <item>Display value 0</item>
        <item>Display value 1</item>
    </string-array>

    <string-array name="yyy_values">
        <item>0</item>
        <item>1</item>
    </string-array>    
</resources>

次のJavaコードを使用して、チェックボックスとリスト設定を使用して完全な設定アクティビティを構築することで期待していることですが、選択を実行するたびに、リスト設定の要約テキストを自動的に更新できます。要約テキストは、表示値0表示値1の間で切り替わります。

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

ただし、リスト設定の要約テキストは自動的に更新されないことに気付きました。チェックボックスをオン/オフにした場合にのみ、アクティビティ全体が無効になり、リスト設定の概要テキストのみが更新されます。

したがって、コードを次のように修正する必要がありますが、これはより面倒に見えます。

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume() {
        super.onResume();

        // Cumbersome way to make sure list preference's summary text is being updated.
        final String key = "yyyModePreference";
        ListPreference listPreference = (ListPreference)findPreference(key);
        final String value = PreferenceManager.getDefaultSharedPreferences(this).getString(key, key);
        final int index = listPreference.findIndexOfValue(value);
        if (index >= 0) {
            final String summary = (String)listPreference.getEntries()[index];         
            listPreference.setSummary(summary);
        }
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences options, String key) {
        // Cumbersome way to make sure list preference's summary text is being updated.
        if (key.equals("yyyModePreference")) {
            ListPreference listPreference = (ListPreference)findPreference(key);
            final String value = options.getString(key, key);
            final int index = listPreference.findIndexOfValue(value);            
            if (index >= 0) {
                final String summary = (String)listPreference.getEntries()[index];         
                listPreference.setSummary(summary);
            }
        }
    }
}

これは正しい方法ですか?選択に変更があるたびにListPreferenceの要約テキストが常に自動的に更新されるようにするための、簡略化された方法はありますか。

4

3 に答える 3

25

これは、KITKATより前のプラットフォーム(つまり、android-4.4_r0.7)に存在していたバグであり、commit94c02a1によって修正されています。

@ilomamboの解決策は機能しますが、最善の解決策ではない可能性があります。私はのソースを読み、ListPreferenceこの解決策を思いついた:

ファイル:ListPreferenceCompat.java

package com.example.yourapplication;

import android.content.Context;
import android.os.Build;
import android.preference.ListPreference;
import android.text.TextUtils;
import android.util.AttributeSet;

public class ListPreferenceCompat extends ListPreference {

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ListPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ListPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public ListPreferenceCompat(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ListPreferenceCompat(Context context) {
        super(context);
    }

    // NOTE:
    // The framework forgot to call notifyChanged() in setValue() on previous versions of android.
    // This bug has been fixed in android-4.4_r0.7.
    // Commit: platform/frameworks/base/+/94c02a1a1a6d7e6900e5a459e9cc699b9510e5a2
    // Time: Tue Jul 23 14:43:37 2013 -0700
    //
    // However on previous versions, we have to work around it by ourselves.
    @Override
    public void setValue(String value) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            super.setValue(value);
        } else {
            String oldValue = getValue();
            super.setValue(value);
            if (!TextUtils.equals(value, oldValue)) {
                notifyChanged();
            }
        }
    }
}

xmlで使用する必要がある場合はListPreference、タグをに置き換えるだけcom.example.yourapplication.ListPreferenceCompatです。

これは、Android4.3を実行しているSamsungS4デバイスと、本番アプリの1つでうまく機能します。

于 2014-02-08T05:35:16.417 に答える
6

Android 2.3.3を実行しているエミュレーターでテストしたところ、機能しなかったため、ある種の奇妙なバグだと思いますが、 4.0.3でテストした場合は機能しました。私がしたことはListPreferenceandroid:summary="%s"のxmlで、それだけです。

于 2012-04-12T09:00:52.643 に答える
1

私見それはバグです。ListPreference.java#builder.setSingleChoiceItems()で定義されたonClickListener()は呼び出しませんnotifyChanged()

私はたまたまそのコードに基づいて自分のListPreferenceをコーディングしていて、OPと同じ問題に遭遇しました、と私は付け加えましたnotifyChanged()

            ...
            dialog.dismiss();
            notifyChanged(); // <<<<<<<<<<
        }
});

そして今、私がそれを選択するとすぐに設定の要約が更新されます。これはAndroidのバージョンに依存せず、ListPreferenceはこれまでこのようにコーディングされています。

于 2013-12-29T12:46:10.477 に答える