2013-03-08 88 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(),看看會發生什麼。