2015-11-05 78 views
0

我有一個設置頁面,用戶可以在該頁面中爲我的應用程序選擇倒數計時器的時間。它有3個單選按鈕,我想要發生的是當用戶點擊其中一個按鈕時,一個int值將被保存到SharedPreferences中作爲另一個活動中的定時器的「時間」參數。onCheckedChangedListener被觸發但不會將數據保存到SharedPreferences(Android)

單選按鈕的onCheckedChangedListener被觸發,但時間值不會保存到SharedPrefs。

這裏是我的設置活動的片段:

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    switch (buttonView.getId()) { 
     case R.id.thirty: 
      prefs = PreferenceManager.getDefaultSharedPreferences(this); 
      editor = prefs.edit(); 
      editor.putInt("time", 30000).apply(); 
      Toast.makeText(this, "h", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.fifty: 
      editor.putInt("time", 50000); 
      editor.apply(); 
      break; 
     case R.id.ninety: 
      editor.putInt("time", 90000); 
      editor.apply(); 
      break; 
    } 
} 

而且這裏是我(失敗)的另一項活動檢索數據:

mprefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
    time = mprefs.getInt("time", 50000); 

    cdTimer = new Timer(time, 1000); 

另一件事是,當我設置的onClickListener這樣的單選按鈕,而不是onCheckedChanged一切正常

thirty = (RadioButton)findViewById(R.id.thirty); 
    thirty.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      prefs = PreferenceManager.getDefaultSharedPreferences(Options.this); 
      editor = prefs.edit(); 
      editor.putInt("time", 30000).apply(); 
     } 
    }); 

有人可以解釋爲什麼會發生這種情況嗎?我對android編程非常陌生,所以請在你的解釋中溫和一些。謝謝。

+0

使用意圖在活動之間傳遞數據並且不要忘記調用commit()來保存對首選項的更改 – Nanoc

回答

0

所有你需要添加if (isChecked)onCheckedChanged功能的第一。此外首選項的初始化想出門開關,讓你函數將是這樣的:

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if (isChecked) { 
     prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     switch (buttonView.getId()) { 
      .... 
     } 
    } 
} 

的問題是,其他單選按鈕的onCheckedChanged可能會覆蓋在首選項的值。

+0

在我的XML文件中,我有這行android:checked =「true」。這是我想到的問題。它覆蓋了偏好中的價值。謝謝! – BBrain

0

寧可呼叫editor.commit();editor.putInt

commit()寫入數據後同步(阻塞線程從它的調用)。然後它會通知您操作的成功。

apply()安排要寫入的數據異步。它沒有通知您操作的成功。

0

您只在第一個switch語句中初始化編輯器,而不在其他兩個中初始化編輯器。如果我是你,我會在點擊監聽器之外初始化它,然後它可以在任何地方使用。

 case R.id.thirty: 
     prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     editor = prefs.edit(); 
     editor.putInt("time", 30000).apply(); 
     Toast.makeText(this, "h", Toast.LENGTH_SHORT).show(); 
     break; 
+0

我在第一個switch語句中初始化它,因爲我正在測試該單選按鈕。我做了外部初始化,但同樣的事情發生 – BBrain