【问题标题】:Android : Shared preferences inside tabhost not workingAndroid:tabhost中的共享首选项不起作用
【发布时间】:2012-12-10 07:05:28
【问题描述】:

我有一个包含三个活动的 tabhost,我想保存每个活动的按钮的按下状态

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

当我转到第二个子选项卡并进入第一个子选项卡时,更改(我按下的按钮未处于按下状态)没有反映

感谢您的帮助,谢谢

这是我在第一个 tabhost 子活动中的代码

         @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    seatdirnbtn.setOnClickListener(listner1);
    seatdirnbtn1.setOnClickListener(listner2);
        seatdirnbtn.setPressed(true);
        seatdirnbtn1.setPressed(true);
        this.LoadPreferences();

       }

    private void SavePreferences() {

    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("sharedPreferences",MODE_WORLD_READABLE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean("state", seatdirnbtn.isEnabled());
    editor.putBoolean("state1", seatdirnbtn1.isEnabled());
    editor.commit();

}

private void LoadPreferences() {
    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("sharedPreferences",MODE_WORLD_READABLE);
    Boolean state = sharedPreferences.getBoolean("state", false);
    Boolean state1 = sharedPreferences.getBoolean("state1", false);
    seatdirnbtn.setPressed(state);
    seatdirnbtn1.setPressed(state1);
}

         @Override
     protected void onStart() {
    super.onStart();
        LoadPreferences();
        }

        @Override  
       protected void onPause() {
    SavePreferences();
    super.onPause();
      }

       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;
    }

};

private View.OnClickListener listner2 = new View.OnClickListener() {

    public void onClick(View v) {

        if (isclick) {
            seatdirnbtn1.setBackgroundResource(R.drawable.icon2hlt);
        } else {
            seatdirnbtn1.setBackgroundResource(R.drawable.icon2);
        }

        isclick = !isclick;
    }

};

【问题讨论】:

  • 你在哪里调用 SavePreferences() 方法?
  • @ρяσѕρєя K,我在 onPause() 中调用 SavePreferences()

标签: android button onclick android-tabhost sharedpreferences


【解决方案1】:

您可能应该重写 onResume() 方法,您应该在其中设置按钮状态。此方法在 onCreate() 之后调用,甚至活动已经创建。如果您在 tabHost 中有活动,则每次在选项卡之间切换时都不会创建它们,因此 onCreate() 方法只会被调用一次,但每次切换到具有特定活动的选项卡时都会调用 onResume()。

加载首选项的代码位于 onStart() 方法中。看这里activity lifecycle。您可以看到,只有在您的活动之前停止时才会调用此方法,但如果只是暂停则永远不会调用。

编辑:

如果您的代码中只有 2 个状态,例如问题中的代码,最好使用通常也有 2 个状态的 ToggleButton。您可以为每个州设置不同的背景。 This tutorial could be helpfull.

比你会有一点不同的 Listener:

    toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            if(checked) {
                //do sth if it's checked
            } else {
                //do sth if it's not checked;
            }

        }
    });

以编程方式更改它们的状态:

toggleButton.setChecked(true); //or false

所以最后你可以将此状态保存到 SharedPreferences:

editor.putBoolean("toggleButton1",toggleButton.isChecked());

以及何时需要此状态:

boolean isChecked = sharedPreferences.getBoolean("toggleButton1",false);
toggleButton.setChecked(isChecked);

选择器将负责为每个状态切换按钮背景。

【讨论】:

  • 感谢您的回答,public void onResume() { SavePreferences();超级.onResume(); } 这个方法我已经添加了但是还是不行
  • 你应该阅读你的偏好并在 onResume() 中设置你的按钮状态而不是保存它们,因为你将它们保存在 onPause() 中,当你恢复时你应该阅读它们并在 onResume() 中设置状态) :)
  • 我明白你的意思。实际上,在单击每个按钮时,我正在更改按钮背景图像,所以我需要将背景可绘制对象保存在共享首选项中吗?如果是,我该怎么做?
  • 不幸的是,您不能将可绘制对象存储在共享首选项中,但将图像映射到您可以存储的一些布尔值或整数值会更好。例如。 State1 - drawable1 - 真; State2 - drawable2 - 错误。比您可以从共享首选项中读取布尔值并为真或假值设置适当的背景。
  • 感谢您提供的信息,我浏览了许多链接来实现您所说的,因为我是 android 和 java 新手,我没有找到任何正确的启动方式。您能否详细说明如何将图像映射到布尔值或整数。
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多