Элементы предпочтений автоматически переустанавливаются?

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


/res/xml/prefs.xml (Просто куча настроек переключателя, достаточно, чтобы прокручивать настройки на экране):

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="my_prefs">
    <PreferenceCategory android:key="my_prefs_cat" android:title="Settings">
        <SwitchPreference android:key="p1" android:title="p1" android:defaultValue="false" />
        <SwitchPreference android:key="p2" android:title="p2" android:defaultValue="false" />
        <SwitchPreference android:key="p3" android:title="p3" android:defaultValue="false" />
        <SwitchPreference android:key="p4" android:title="p4" android:defaultValue="false" />
        <SwitchPreference android:key="p5" android:title="p5" android:defaultValue="false" />
        <SwitchPreference android:key="p6" android:title="p6" android:defaultValue="false" />
        <SwitchPreference android:key="p7" android:title="p7" android:defaultValue="false" />
        <SwitchPreference android:key="p8" android:title="p8" android:defaultValue="false" />
        <SwitchPreference android:key="p9" android:title="p9" android:defaultValue="false" />
        <SwitchPreference android:key="p10" android:title="p10" android:defaultValue="false" />
    </PreferenceCategory>
</PreferenceScreen>

/src/Prefs.java (Простой PreferenceFragment):

package com.example.preflistbug;

import android.os.Bundle;
import android.preference.PreferenceFragment;

public class Prefs extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }

}

/res/layout/main.xml (Размещено PreferenceFragment в макете активности):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.preflistbug.Prefs" 
        android:id="@+id/frg_prefs"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</LinearLayout>

/src/MyActivity.java (Демо-активность):

package com.example.preflistbug;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Проблема: Если вы измените предпочтение первого переключателя, прокрутите вниз, прокрутите резервную копию, переключатель reset. То же самое верно и для других настроек переключателя, которые прокручиваются вне поля зрения и посещаются позже. (особенно в горизонтальной ориентации)

Бывает и на эмуляторе. Я собираюсь на платформе 15, ICS. Как вы можете видеть в приведенном выше коде, это очень простая настройка, я ничего не могу найти в этом коде, что может объяснить, почему это происходит.

Update

Об ошибке сообщается как Проблема 26194.

Обновление 2

Предполагается, что он будет установлен в релизе android L.

Ответ 1

Я смог воспроизвести эту проблему. Я также нашел обходной путь, но я не знаю, почему он работает:)

Создайте производный класс из SwitchPreference следующим образом:

public class Pref extends SwitchPreference {
    public Pref(Context context) {
        super(context);
    }

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

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

Затем вместо использования этих параметров в файле prefs.xml:

<SwitchPreference ... />

Вместо этого вы можете использовать

<com.example.preflistbug.Pref ... />

Деривация каким-то образом устраняет проблему, когда рекурсия представления в списке предпочтений ListView -driven повторно использует элементы управления без "освобождения" их от предыдущего объекта Preference сначала (или так я думаю). Я уточню этот ответ, если узнаю больше.