Android:tabhost内的共享首选项不起作用

时间:2012-12-10 07:05:29

标签: android button onclick android-tabhost sharedpreferences

我有一个包含三个活动的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;
    }

};

1 个答案:

答案 0 :(得分:0)

可能你应该覆盖onResume()方法,你应该在其中设置按钮状态。在onCreate()之后调用此方法,甚至已经创建了活动。如果你在tabHost中有活动,那么每次在标签之间切换时都不会创建它们,因此每次切换到具有特定活动的标签时,onCreate()方法只会被调用一次但是onResume()。

加载首选项的代码在onStart()方法中。请看activity lifecycle。您可以看到,只有当您的活动之前已停止但在刚刚暂停时才会调用此方法。

修改

如果您的代码中只有2个状态,那么使用ToggleButton可能会更好,它通常也有2个状态。您可以将其设置为每个州具有不同的背景。 This tutorial could be helpfull

你会有一点不同的倾听者:

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

选择器将负责切换每个州的按钮背景。