Android 首选项在PreferenceActivity中自行停用
我的Android应用程序中有一个PreferenceActivty,由于兼容性原因,我通过getPreferenceScreen()方法使用它,还有一些我在代码中创建的首选项对象,主要是CheckBoxPreference和SwitchPreference 在我的应用程序的前一个版本中,总共有8个首选项,一切都很好,但现在我又增加了2个首选项,我遇到了一个非常奇怪的问题 屏幕上的第二个首选项是SwitchPreference。当我打开活动时,它会被选中。如果我向下滚动屏幕而不实际更改任何内容,则其值会突然自动设置为OFF。我尝试向首选项添加OnChangeListener并实现OnSharedPreferenceChangeListener,但结果是一样的:一旦该特定首选项从屏幕上消失,它就会被关闭。如果设置为OFF,则保持其值,并且不调用更改侦听器 有人知道为什么会发生这种情况吗?我完全迷路了 提前谢谢Android 首选项在PreferenceActivity中自行停用,android,preferences,Android,Preferences,我的Android应用程序中有一个PreferenceActivty,由于兼容性原因,我通过getPreferenceScreen()方法使用它,还有一些我在代码中创建的首选项对象,主要是CheckBoxPreference和SwitchPreference 在我的应用程序的前一个版本中,总共有8个首选项,一切都很好,但现在我又增加了2个首选项,我遇到了一个非常奇怪的问题 屏幕上的第二个首选项是SwitchPreference。当我打开活动时,它会被选中。如果我向下滚动屏幕而不实际更改任何内容,
我的首选项代码基本上是这样的,在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());
}
}
}