2013-03-08 91 views
1

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

截至到以前的版本我的应用程序有共8个偏好和一切工作得很好,但现在我加2个偏好和我遇到一个非常奇怪的问题。

屏幕上的第二个首选项是SwitchPreference。当我打开活动时,它会被检查。如果我在没有实际改变任何东西的情况下向下滚动屏幕,突然其值会自动设置为OFF。我尝试将OnChangeListener添加到首选项并实现OnSharedPreferenceChangeListener,但结果相同:一旦该特定首选项从屏幕上消失,它将被关闭。如果它设置为OFF,它将保持其值,并且不会调用更改侦听器。

没有人有任何想法,为什么会这样发生?我完全失去了......

在此先感谢!


我的喜好的代码基本上是这样,重复5次,5级不同的设置,对onCreate方法:

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()为每个首选项重新设置其值,但我不确定它是否完全必要。

最后,我有一个激活/停用偏好点击别人的时候,因为我不能让setDependency方法工作的onSharedPreferenceChanged方法。这是这样的(再次,重复5次):

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

请向我们展示您的偏好代码。你有没有尝试在eclipse中清理你的项目?你有没有尝试过不同的Android版本?你有没有设置一些onScroll侦听器? – 2013-03-08 21:32:55

+0

感谢您的回复加力燃烧器,我已将代码添加到原始问题中。 我试着清理这个项目(就像上百次:)),并尝试了Android 4.0,4.1和4.2,结果相同。我没有尝试较低的Android版本,因为我使用的是SwitchPreference。 我发现了更多...如果我用CheckBoxPreference替换SwitchPreference,它不会更改它的值。它可能是SwitchPreference本身的错误吗? – LuTHieR 2013-03-09 12:12:48

+0

您是如何在TabActivity内实现偏好的? – 2013-03-09 16:23:13

回答

0

你怎么实现的喜好里面TabActivity我检查你的代码在我自己的一个PreferenceActivity内部IDE和它的工作就像一个charm.If你需要有一些?您不应该使用偏好,而是需要使用普通形式的项目并手动将其值保存到偏好设置中。这里是我测试的代码和它的工作正常:

public class PreferencesFromCode extends 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(),看看会发生什么。