1

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

直到我的应用程序的以前版本,总共有 8 个首选项,一切正常,但现在我又添加了 2 个首选项,我遇到了一个非常奇怪的问题。

屏幕上的第二个首选项是 SwitchPreference。当我打开活动时,它被选中。如果我向下滚动屏幕而不实际更改任何内容,它的值会突然自动设置为 OFF。我尝试将 OnChangeListener 添加到 Preference 并实现 OnSharedPreferenceChangeListener,但结果是相同的:一旦特定的 Preference 从屏幕上消失,它就会关闭。如果它设置为 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 方法工作。是这样的(再次重复五次):

if (key.equals(controlWifiPreference.getKey())) {
    wifiPreference.setEnabled(controlWifiPreference.isChecked());
}
4

2 回答 2

3

原来这是 SwitchPreference 类中的一个 Android 错误。有人(我非常感谢他;))将其报告给 b.android.com,甚至发布了一个解决方法。都在这里:https ://code.google.com/p/android/issues/detail?id=26194

于 2013-06-09T09:55:05.710 回答
0

你是如何在 TabActivity 中实现首选项的?我在我自己的 IDE 中的 PreferenceActivity 中检查了你的代码,它的工作方式就像一个魅力。如果你需要在你的 Activity 中有一些伪首选项,你不应该使用首选项,而是需要使用范式项目并将它们的值手动保存到首选项中。这是我测试的代码,它的工作正常:

公共类 PreferencesFromCode 扩展 PreferenceActivity 实现 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()并查看会发生什么。

于 2013-03-09T16:32:05.560 回答