Android 首选项在PreferenceActivity中自行停用

Android 首选项在PreferenceActivity中自行停用,android,preferences,Android,Preferences,我的Android应用程序中有一个PreferenceActivty,由于兼容性原因,我通过getPreferenceScreen()方法使用它,还有一些我在代码中创建的首选项对象,主要是CheckBoxPreference和SwitchPreference 在我的应用程序的前一个版本中,总共有8个首选项,一切都很好,但现在我又增加了2个首选项,我遇到了一个非常奇怪的问题 屏幕上的第二个首选项是SwitchPreference。当我打开活动时,它会被选中。如果我向下滚动屏幕而不实际更改任何内容,

我的Android应用程序中有一个PreferenceActivty,由于兼容性原因,我通过getPreferenceScreen()方法使用它,还有一些我在代码中创建的首选项对象,主要是CheckBoxPreference和SwitchPreference

在我的应用程序的前一个版本中,总共有8个首选项,一切都很好,但现在我又增加了2个首选项,我遇到了一个非常奇怪的问题

屏幕上的第二个首选项是SwitchPreference。当我打开活动时,它会被选中。如果我向下滚动屏幕而不实际更改任何内容,则其值会突然自动设置为OFF。我尝试向首选项添加OnChangeListener并实现OnSharedPreferenceChangeListener,但结果是一样的:一旦该特定首选项从屏幕上消失,它就会被关闭。如果设置为OFF,则保持其值,并且不调用更改侦听器

有人知道为什么会发生这种情况吗?我完全迷路了

提前谢谢


我的首选项代码基本上是这样的,在onCreate方法上针对5种不同的设置重复5次:

controlWifiPreference = new CheckBoxPreference(this);
controlWifiPreference.setKey(Constants.PREF_1_KEY);
getPreferenceScreen().addPreference(controlWifiPreference);

wifiPreference = new SwitchPreference(this);
wifiPreference.setKey(Constants.PREF_2_KEY);
getPreferenceScreen().addPreference(wifiPreference);
由于首选项位于TabActivity中,因此在onResume方法上,我为每个首选项调用setChecked()以再次设置其值,尽管我不确定这是否完全必要

最后,我有一个onSharedPreferenceChanged方法,它可以在其他人被单击时激活/停用首选项,因为我无法让setDependency方法工作。是这样的(再次重复五次):


您是如何在TabActivity中实现首选项的?我在PreferenceActivity中检查了您自己的IDE中的代码,它的工作方式很有魅力。如果您需要在活动中包含一些伪首选项,您不应该使用首选项,而是,您将需要使用普通表单项并手动将其值保存到首选项中。以下是我测试的代码及其工作正常情况:

公共类首选项来自代码扩展首选项活动实现 OnSharedPreferenceChangeListener{

private SwitchPreference switchPref;
private CheckBoxPreference checkboxPref;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setPreferenceScreen(createPreferenceHierarchy());
}

private PreferenceScreen createPreferenceHierarchy() {
    // Root
    @SuppressWarnings("deprecation")
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
            this);

    // Inline preferences
    PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
    inlinePrefCat.setTitle(R.string.inline_preferences);
    root.addPreference(inlinePrefCat);

    // Checkbox preference
    checkboxPref = new CheckBoxPreference(this);
    checkboxPref.setKey("checkbox_preference");
    checkboxPref.setTitle(R.string.title_checkbox_preference);
    checkboxPref.setSummary(R.string.summary_checkbox_preference);
    inlinePrefCat.addPreference(checkboxPref);

    // Switch preference
    switchPref = new SwitchPreference(this);
    switchPref.setKey("switch_preference");
    switchPref.setTitle(R.string.title_switch_preference);
    switchPref.setSummary(R.string.summary_switch_preference);
    inlinePrefCat.addPreference(switchPref);

    /*
     * The Preferences screenPref serves as a screen break (similar to page
     * break in word processing). Like for other preference types, we assign
     * a key here so that it is able to save and restore its instance state.
     */
    // Screen preference
    PreferenceScreen screenPref = getPreferenceManager()
            .createPreferenceScreen(this);
    screenPref.setKey("screen_preference");
    screenPref.setTitle(R.string.title_screen_preference);
    screenPref.setSummary(R.string.summary_screen_preference);

    return root;
}

@Override
protected void onResume() {
    super.onResume();
    PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    /*
     * getPreferenceScreen().getSharedPreferences()
     * .registerOnSharedPreferenceChangeListener(this);
     */

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("ghjg", "changed key is : " + key);
    if (key.equals(checkboxPref.getKey())) {
        switchPref.setEnabled(checkboxPref.isChecked());
    }
}
}

但是,您可以覆盖
onContentChanged()
并查看发生了什么。

结果表明,这是SwitchPreference类中的一个Android错误。某人(我非常感谢他;))向b.android.com报告,甚至发布了一个解决方案。全部内容如下:

请向我们展示您的首选项代码。您是否尝试过在eclipse中清理您的项目?您是否尝试过不同的android版本?您是否设置了一些onScroll侦听器?感谢您的回复加力后,我已将代码添加到原始问题中。我尝试过清理该项目(大约一百次:)),并尝试了Android 4.0、4.1和4.2,得到了相同的结果。我没有尝试过更低的Android版本,因为我使用了SwitchPreference。我发现了更多的东西……如果我用CheckBoxPreference替换SwitchPreference,它不会改变它的值。这可能是SwitchPreference本身的错误吗?您是如何在Ta中实现首选项的活力?
private SwitchPreference switchPref;
private CheckBoxPreference checkboxPref;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setPreferenceScreen(createPreferenceHierarchy());
}

private PreferenceScreen createPreferenceHierarchy() {
    // Root
    @SuppressWarnings("deprecation")
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
            this);

    // Inline preferences
    PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
    inlinePrefCat.setTitle(R.string.inline_preferences);
    root.addPreference(inlinePrefCat);

    // Checkbox preference
    checkboxPref = new CheckBoxPreference(this);
    checkboxPref.setKey("checkbox_preference");
    checkboxPref.setTitle(R.string.title_checkbox_preference);
    checkboxPref.setSummary(R.string.summary_checkbox_preference);
    inlinePrefCat.addPreference(checkboxPref);

    // Switch preference
    switchPref = new SwitchPreference(this);
    switchPref.setKey("switch_preference");
    switchPref.setTitle(R.string.title_switch_preference);
    switchPref.setSummary(R.string.summary_switch_preference);
    inlinePrefCat.addPreference(switchPref);

    /*
     * The Preferences screenPref serves as a screen break (similar to page
     * break in word processing). Like for other preference types, we assign
     * a key here so that it is able to save and restore its instance state.
     */
    // Screen preference
    PreferenceScreen screenPref = getPreferenceManager()
            .createPreferenceScreen(this);
    screenPref.setKey("screen_preference");
    screenPref.setTitle(R.string.title_screen_preference);
    screenPref.setSummary(R.string.summary_screen_preference);

    return root;
}

@Override
protected void onResume() {
    super.onResume();
    PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    /*
     * getPreferenceScreen().getSharedPreferences()
     * .registerOnSharedPreferenceChangeListener(this);
     */

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("ghjg", "changed key is : " + key);
    if (key.equals(checkboxPref.getKey())) {
        switchPref.setEnabled(checkboxPref.isChecked());
    }
}
}