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

Android:tabhost内的共享首选项不工作,android,button,onclick,android-tabhost,sharedpreferences,Android,Button,Onclick,Android Tabhost,Sharedpreferences,我有一个包含三个活动的tabhost,我想保存每个活动按钮的按下状态 那么,现在我如何保存所有三个子活动中每个按钮的按下状态,以便当我从一个活动移动到另一个活动时,按钮按下状态将在向后移动时反映出来。第一个活动->所有4个按钮按下->转到第二个活动->返回第一个活动->第一个活动中的所有按钮应处于按下状态 当我转到第二个子选项卡并转到第一个子选项卡时,更改(我按下的按钮未处于按下状态)没有反映出来 谢谢你的帮助 这是我在第一个tabhost子活动中的代码 @Override

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

};

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

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

编辑:

若您的代码中只有两种状态,比如问题中的状态,那个么最好使用ToggleButton,它通常也有两种状态。您可以为每个州设置不同背景的样式

然后你会有一个稍微不同的听众:

    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
因此,最后您可以将此状态保存到SharedReferences:

editor.putBoolean("toggleButton1",toggleButton.isChecked());
当您需要此状态时:

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

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

您在哪里调用SavePreferences()方法?@ρρρρρK,我在onPause()中调用SavePreferences(),谢谢您的回答,public void onResume(){SavePreferences();super.onResume()我添加了这个方法,但仍然不起作用。你应该在onResume()中读取pref并设置按钮状态,而不是保存它们,因为你在onPause()中保存了它们,当你恢复时,你应该在onResume()中读取它们并设置状态。我明白你的意思。实际上,在单击每个按钮时,我正在更改按钮背景图像,那么我是否需要在共享首选项中保存可绘制的背景图像?如果是,我该怎么做?不幸的是,您不能在共享pref中存储drawable,但最好将图像映射到一些可以存储的布尔值或int值。例:State1-可提取1-真实;状态2-可提取状态2-错误。你可以从共享pref中读取布尔值,并为真值或假值设置适当的背景。感谢你提供的信息,我通过了许多链接来实现你所说的,因为我对android和java还不熟悉,所以我没有找到任何正确的启动方法。你能谈谈如何把图像映射到bolean或int吗。