2014-09-20 111 views
5

我目前正在開發一個具有菜單的應用程序,菜單上的一個選項是「設置」,用戶可以基本上決定關閉聲音和其他類似的東西。我目前在設置活動中有兩個開關。以下是目前設置活動的java代碼:更改Android開關狀態

import android.support.v7.app.ActionBarActivity; 


public class Options extends ActionBarActivity { 
private Switch ding; 
private Switch countdown; 
public boolean isDingChecked; 
public boolean isCountdownChecked; 
public static final String PREFS = "examplePrefs"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_options); 
ding = (Switch) findViewById(R.id.switch1); 
ding.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     SharedPreferences examplePrefs = getSharedPreferences(PREFS,0); 
     Editor editor = examplePrefs.edit(); 
     editor.putBoolean("userMessage", isChecked); 
     editor.commit(); 

     //System.out.println(examplePrefs.getBoolean("userMessage", isChecked)); 
     isDingChecked = examplePrefs.getBoolean("userMessage", isChecked); 
     System.out.println(isDingChecked + " is ding checked"); 
     ding.setChecked(isDingChecked); 
    } 
}); 

countdown = (Switch) findViewById(R.id.switch2); 
countdown.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // do something, the isChecked will be 
     // true if the switch is in the On position 
     isCountdownChecked = isChecked; 

    } 
});  
} 
} 

我能夠在我的其他活動中使用布爾值,因此SharedPreference可以正常工作。但是,當我回到菜單活動並返回到此選項活動時,無論用戶說什麼,交換機的狀態都會恢復爲其默認值爲true。無論如何,我可以解決這個問題嗎?

ding.setChecked(isDingChecked) 

是不是真的在做我猜的任何事情。我知道我過去發佈過類似的問題,只是一個人沒有太多的活動,我在這個問題上已經研究了很長時間。謝謝!

回答

16

嘗試是這樣的:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_options); 
    ding = (Switch) findViewById(R.id.switch1); 

    //grab prefs first 
    final SharedPreferences examplePrefs = getSharedPreferences(PREFS,0); 
    final Editor editor = examplePrefs.edit(); 
    ding.setChecked(examplePrefs.getBoolean("your_key", false)); //false default 


    ding.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      //commit prefs on change 
      editor.putBoolean("your_key", isChecked); 
      editor.commit(); 

      System.out.println(isDingChecked + " is ding checked"); 
     } 
    }); 
+0

感謝了! – user2677095 2014-09-20 09:04:10

0

Switch的setChecked(value)方法工作得很好,但是您在onCheckedChanged(...)方法中調用它是不必要的。
因此,要將Switch設置爲最新值,您應該加載首選項,並將檢查狀態設置在setOnCheckedChangeListener偵聽器之外。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_options); 
    // your current code 

    //load and set preferences 
    SharedPreferences examplePrefs = getSharedPreferences(PREFS,0); 
    isDingChecked = examplePrefs.getBoolean("userMessage", isChecked); 
    ding.setChecked(isDingChecked); 
} 
+0

我不得不改變器isChecked到真/假,我相信,因爲只器isChecked工作在監聽器裏,但應該工作 – user2677095 2014-09-20 07:58:56

+0

是啊,這是真的。其實這只是一個默認值,如果這個鍵沒有任何偏好。 – reVerse 2014-09-20 09:19:20

+0

是的,我知道。儘管如此,我仍然可以運作。非常感謝。 – user2677095 2014-09-20 20:26:54