2

私はAndroidアプリの開発にかなり慣れていないので、単純な初心者の間違いを犯しているかもしれませんが、ここに私の問題があります.2つの単純なアクティビティ、MainActivityとSettingActivityがあります。MainActivity には、SettingsActivity を表示するボタンがあります。SettingsActivity 内に PreferenceFragment SettingsFragment を含め、Activity の下部に ButtonBar を表示します。SettingsFragment 内に、次のように定義された MultiSelectListPreference があります。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory 
        android:title="@string/title_schedule_settings">

        <MultiSelectListPreference
            android:key="@string/key_list_schedule"
            android:title="@string/title_schedule_list"
            android:dialogTitle="@string/title_schedule_list"
            android:entries="@array/list_weekdays"
            android:entryValues="@array/list_weekdays"
            android:defaultValue="@array/empty_list"
            android:persistent="true"/>
    </PreferenceCategory>

</PreferenceScreen>

その設定を選択すると、配列で定義されているすべてのエントリを含むリストが表示されます。複数のエントリを選択でき、ダイアログを確認すると、値は実際には定義されたキーの下の SharedPreferences に保存されます。しかし、Preference を再度表示すると、以前に選択したアイテムが選択済みとして表示されますが、値は SharedPreferences 内に保存されなくなりました。ダイアログが表示されます。

私の質問は次のとおりです。これは通常の/意図した動作ですか、それともバグですか? そして、どうすればこれを回避できますか? 私はすでに MultiSelectListPreference の独自の実装を作成し、このように onPrepareDialogBu​​ilder メソッドをオーバーライドしようとしました

@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder)
{
    super.onPrepareDialogBuilder(builder);

    Log.i("mmslp", Arrays.deepToString(PreferenceManager.getDefaultSharedPreferences(getContext()).getStringSet(getKey(), new HashSet<String>()).toArray()));
    setValues(PreferenceManager.getDefaultSharedPreferences(getContext()).getStringSet(getKey(), new HashSet<String>()));
}

しかし、値は明らかにこの時点ですでに消去されています。

4

1 に答える 1

7

私は昨日これに時間を費やしましたが、そのように意図されたものではなく、実際には壊れていると確信しています-誰かがポインターと値による参照を混乱させました。;-)

ただし、Android の最新バージョン (4.1 以降) では修正されているようです: https://code.google.com/p/android/issues/detail?id=22807

以前のバージョンの Android で解決した方法は、MultiSelectListPreference の実装で setValues メソッドをオーバーライドし、値を新しいオブジェクトにコピーするだけです。

@Override
public void setValues( Set<String> values ) {

    //Workaround for https://code.google.com/p/android/issues/detail?id=22807
    final Set<String> newValues = new HashSet<String>();
    newValues.addAll( values );
    super.setValues( newValues );
}
于 2014-04-02T07:26:49.830 に答える