有人能告诉我为什么这个不起作用吗?我正在尝试保存togglebutton的状态,但每次我关闭应用程序并重新启动时,它都会回到关闭状态。我希望状态被记住,所以当有人向他们的收藏中添加了一些东西时,要记住它是被添加到收藏中的。
private String state = "State";
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.recipe_menu, menu);
toggleButton = (ToggleButton) findViewById(R.id.myToggleButton);
toggleButton.setChecked(readState());
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
// The toggle is enabled
toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_black_24dp));
else
// The toggle is disabled
toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_border_black_24dp));
saveState(isChecked);
}
});
return super.onCreateOptionsMenu(menu);
}
private void saveState(boolean isFavourite) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedPreferences.edit().putBoolean(state, isFavourite).apply();
}
private boolean readState() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
return sharedPreferences.getBoolean(state, true);
}
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
toggleButton = (ToggleButton) findViewById(R.id.myToggleButton);
toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_border_black_24dp));
toggleButton.setChecked(readState());
}发布于 2017-04-02 17:26:54
您正在从一个SharedPreferences文件读取数据,但写入到另一个文件中。
将saveState中sharedPreferences的初始化行更改为:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());此外,您应该使用setOnCheckedChangeListener,而不是使用setOnClickListener,请参阅docs和示例代码:
toggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// The toggle is enabled
} else {
// The toggle is disabled
}
}
});更新
带有修复的完整代码:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.recipe_menu, menu);
toggleButton = (ToggleButton) findViewById(R.id.myToggleButton);
toggleButton.setChecked(readState());
toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// The toggle is enabled
toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_black_24dp));
} else {
// The toggle is disabled
toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_border_black_24dp));
}
saveState(isChecked);
}
});
return super.onCreateOptionsMenu(menu);
}
private void saveState(boolean isFavourite) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedPreferences.edit().putBoolean("State", isFavourite).apply();
}
private boolean readState() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
return sharedPreferences.getBoolean("State", true);
}发布于 2017-04-02 17:57:05
您正在更改togglebutton的状态两次。因此,这些行是不必要的。删除以下各行。
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
toggleButton.setChecked(sharedPreferences.getBoolean("toggleButton", true));希望这能帮上忙..
发布于 2017-04-02 18:17:08
toggleButton.setChecked(sharedPreferences.getBoolean("toggleButton", true));上面这行代码重置了checkbox的状态。因此,需要将其删除。此外,像"Favourite“和”“这样的字符串应该被定义为一行或另一行中的拼写错误的constants.In案例,这也可能导致意外的结果。
https://stackoverflow.com/questions/43166650
复制相似问题