【问题标题】:Android: Shared preferences not saving the state of the buttonsAndroid:共享首选项不保存按钮的状态
【发布时间】:2012-11-29 18:02:17
【问题描述】:

我有一个包含三个活动的选项卡主机,并且在每个活动中我都有按钮。

每按一次按钮,我都会更改背景可绘制资源

那么现在如何保存所有三个子活动中每个按钮的按下状态,以便当我从一个活动移动到另一个活动时,按钮按下状态将反映在返回时。第一个活动 -> 按下所有 2 个按钮 -> 转到第二个活动 -> 返回到第一个活动 -> 第一个活动中的所有按钮都应处于按下状态并更改可绘制资源

我有两张背景图片。

按钮按下 -> 高亮背景图像 -> 第二次按下相同的按钮 -> 更改为正常背景图像

当我第一次运行应用程序时,如果我按下按钮,背景图像就会发生变化。如果我进入第二个子活动并返回,那么按钮处于按下状态并更改了可绘制资源。所以很好

第二次如果我按下相同的按钮并从第二个活动返回到相同的活动。这里它不起作用

第一个子活动 -> 按下按钮 -> 高亮背景图像更改 -> 转到第二个 tabhost 子活动 -> 返回第一个子活动 -> 按钮在按下后显示相同的背景图像(这很好)

问题是

现在您在第一个子活动中按下相同的按钮 -> 背景图像变为正常 -> 转到第二个 tabhost 子活动 -> 返回第一个子活动 -> 但按钮背景资源突出显示而不是正常

即使我再次运行应用程序,按钮也会显示高亮背景图像

我在第一个子活动中使用的以下代码

已编辑

public void onResume() {
    super.onResume();
    SharedPreferences sharedPreferences = this.getSharedPreferences(
            "sharedPreferences", MODE_PRIVATE);

    int which = sharedPreferences.getInt("sharedPreferences", 1);
    switch (which)
    { 
        case 1:
            seatdirnbtn.setBackgroundResource(R.drawable.icon4); break; 
        case 2:
            seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt); break;
        default:
            seatdirnbtn.setBackgroundResource(R.drawable.icon4); break;
    }
}

public void onPause() {
    super.onPause();
     boolean isclick = false;
    SharedPreferences sharedPreferences = this.getSharedPreferences(
            "sharedPreferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    if (isclick) {  
        seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);   

        editor.putInt("sharedPreferences", 2).commit();
    }
}

EDIT2

     public static boolean isclick = false;
private View.OnClickListener listner1 = new View.OnClickListener() {

    public void onClick(View v) {

    if (isclick) {
            seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);

        } else {
            seatdirnbtn.setBackgroundResource(R.drawable.icon4);
        }

        isclick = !isclick; 
    }

};

【问题讨论】:

  • 看起来你的onPause 有条件将int 2 放入SharedPrefs 但从来没有机会放入1。
  • 坦率地说我很困惑。您设置了一个布尔值以始终读取false,这样就解释了为什么一部分条件没有运行。您必须使其与单击按钮的时间相对应。然而你是说它是始终运行的 true 部分?此外,我认为通过简单的布尔标志(可能是数组)可以更好地处理切换。以及应用离开时的 SharedPrefs。
  • 谢谢,我明白了你的意思,但由于我是 android 新手,所以我不知道如何准确地实现这一点。你能否请您详细说明一下如何用标志处理这个问题。跨度>

标签: android button save android-tabhost sharedpreferences


【解决方案1】:

这就是我的意思:

boolean[] btnBool = new boolean[2]; // number of buttons

private View.OnClickListener listner1 = new View.OnClickListener() {
    public void onClick(View v) {
        toggleBtn(0); //zero refers to which index of the array for button button
        setDrawables();
    }

};

public void onResume() {
    super.onResume();
    toggleAllBtns();
    setDrawables();
}

private void toggleBtn(int index) {
    if(btnBool[index]) {
        btnBool[index] = false;
    } else {
        btnBool[index] = true;
    }
}

private void toggleAllBtns() {
    // first switch the values of the array
    for (int i = 0; i < btnBool.length; i++) {
        if(btnBool[i]) {
            btnBool[i] = false;
        } else {
            btnBool[i] = true;
        }
    }       
}

private void setDrawables() {
    // then set drawables based on values
    if (btnBool[0]) {
        seatdirnbtn.setBackgroundResource(R.drawable.icon4);
    } else {
        seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);
    }
}

【讨论】:

  • 非常感谢。但遗憾的是,当我第一次单击该按钮时,它会获得突出显示的图像并恢复 tabhost 子活动,它反映了我想要的,但如果我再次单击同一个按钮,它应该显示正常图像,但它一旦我暂停并恢复活动(我的意思是去第二个孩子活动并回到第一个孩子活动),就会显示突出显示。我是否应该第二次点击同一个按钮进行任何不同的条件检查。
  • 我能看到监听器发生了什么吗?你在里面修改btnBool吗?如果一切正常,请在设置背景资源之前再次尝试查找相同的按钮。
  • 请在我上面的问题中检查 EDIT2。我只是像这样更改背景图像,我只是将您的代码保存在 onResume() 中,甚至保存在按钮的 onclicklistner 中。
  • OHHH 抱歉,仍然无法正常工作。同样的事情在按钮上重复,首先单击其突出显示的背景图像,但正在进行第二个子活动并返回到第一个子活动,它变为正常背景图像而不是突出显示,带有突出显示背景图像的按钮我需要回来如果我点击第一个子活动。再次感谢
  • 我很抱歉。我在这里自己测试它,事情(在纠正一个小错误之后)似乎工作正常。希望你能深入了解它。
【解决方案2】:

试试这个改变:

if (isclick) {  
        seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);   
        editor.clear();
        editor.putInt("sharedPreferences", 2).commit();
    }
else {
        seatdirnbtn.setBackgroundResource(R.drawable.icon4);   
        editor.clear();
        editor.putInt("sharedPreferences", 1).commit();
}

【讨论】:

  • 对不起,我没有理解。
  • 如果满足else 条件,您能否在每个语句中添加log 语句?
  • @Alex,一点也不,对不起,这不是我的意图。你能告诉我在哪里需要休息吗?请看我的编辑答案 boolean isclick = false;我在 onpause() 中。
  • @mango,在把日志也放好之后,我在 logcat 中没有得到任何数据
  • 对于 if-else 的任一条件?重启模拟器,重启你的ide,再次检查。看看这两个条件是否都被调用了。如果是这样,请在设置可绘制对象之前再次尝试查找 btn 的 id。
猜你喜欢
  • 2016-06-06
  • 2013-09-24
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2012-11-14
  • 2019-04-09
相关资源
最近更新 更多