2015-11-05 79 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