首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保存togglebutton android状态

保存togglebutton android状态
EN

Stack Overflow用户
提问于 2017-04-02 17:15:00
回答 3查看 656关注 0票数 0

有人能告诉我为什么这个不起作用吗?我正在尝试保存togglebutton的状态,但每次我关闭应用程序并重新启动时,它都会回到关闭状态。我希望状态被记住,所以当有人向他们的收藏中添加了一些东西时,要记住它是被添加到收藏中的。

private String state = "State";

代码语言:javascript
运行
复制
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());
}
EN

回答 3

Stack Overflow用户

发布于 2017-04-02 17:26:54

您正在从一个SharedPreferences文件读取数据,但写入到另一个文件中。

saveStatesharedPreferences的初始化行更改为:

代码语言:javascript
运行
复制
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

此外,您应该使用setOnCheckedChangeListener,而不是使用setOnClickListener,请参阅docs和示例代码:

代码语言:javascript
运行
复制
toggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // The toggle is enabled
        } else {
            // The toggle is disabled
        }
    }
});

更新

带有修复的完整代码:

代码语言:javascript
运行
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2017-04-02 17:57:05

您正在更改togglebutton的状态两次。因此,这些行是不必要的。删除以下各行。

代码语言:javascript
运行
复制
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
toggleButton.setChecked(sharedPreferences.getBoolean("toggleButton", true));

希望这能帮上忙..

票数 0
EN

Stack Overflow用户

发布于 2017-04-02 18:17:08

代码语言:javascript
运行
复制
toggleButton.setChecked(sharedPreferences.getBoolean("toggleButton", true));

上面这行代码重置了checkbox的状态。因此,需要将其删除。此外,像"Favourite“和”“这样的字符串应该被定义为一行或另一行中的拼写错误的constants.In案例,这也可能导致意外的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43166650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档