保存的首选项在重新启动时不起作用

Posted

技术标签:

【中文标题】保存的首选项在重新启动时不起作用【英文标题】:savedpreferences not working on reboot 【发布时间】:2012-12-18 11:29:30 【问题描述】:

tabhost 中的共享首选项不适用于按钮按下状态。

我正在更改按下状态下按钮的背景。但是当我重新启动(关闭和打开)手机时,共享首选项不会保存状态。

参考这里

Shared preferences for button pressed state inside tabhost not working on reboot

在调试时,isclick 在 if-else 条件下显示为 true。我不明白这个问题。

当我第一次运行时,我得到了带有突出显示背景的按钮,即使在重新启动时我也得到了相同的突出显示背景。

我们总是感谢任何帮助。

private boolean isclick ;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    seatdirnbtn = (Button) findViewById(R.id.seatdirnbtn);
    prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);

    isclick = prefs.getBoolean("prefName", false);
    System.out.println("bool? " + isclick);

    if (isclick) 
        seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);
     else if (!isclick) 
        seatdirnbtn.setBackgroundResource(R.drawable.icon4);
     



@Override
public void onRestart() 
    super.onRestart();

    if (isclick) 
        seatdirnbtn.setBackgroundResource(R.drawable.icon4);
     else if (!isclick) 
        seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);
    


@Override
public void onStop() 
    super.onStop();

    prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);
    editor = prefs.edit();

    editor.putBoolean("prefName", true);
    editor.commit();


private View.OnClickListener listner1 = new View.OnClickListener() 
    public void onClick(View v) 
        if (isclick) 
            seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);

            editor = prefs.edit();
            editor.clear();
            editor.putBoolean("prefName", true);
            editor.commit();
         else if (!isclick) 
            seatdirnbtn.setBackgroundResource(R.drawable.icon4);
            editor = prefs.edit();
            editor.clear();
            editor.putBoolean("prefName", false);
            editor.commit();
        
        isclick = !isclick;
    
;

编辑1:

    private boolean isclick  ;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);

    isclick = prefs.getBoolean("prefName", true);

    System.out.println("bool? " + isclick);
    Log.i(TAG, " prefname");

    if (isclick) 
        seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);
     else if (!isclick) 
        seatdirnbtn.setBackgroundResource(R.drawable.icon4);
     

         public void onPause() 
    super.onPause();
    prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);
    // boolean isclick = false;
    editor = prefs.edit();
    // editor.clear();
    editor.putBoolean("prefName", false);
    Log.i(TAG, " prefname");
    editor.commit();


@Override
public void onRestart() 
    super.onRestart();
      prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);
        isclick = prefs.getBoolean("prefName", !isclick);



@Override
public void onStop() 
    super.onStop();
    getApplicationContext().unbindService(this);

      prefs = this.getSharedPreferences(prefName, MODE_PRIVATE); // boolean
      isclick = false; editor = prefs.edit(); // editor.clear();
      editor.putBoolean("prefName", !isclick); 
      editor.commit();

      

         private View.OnClickListener listner1 = new View.OnClickListener() 

    public void onClick(View v) 


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

            editor = prefs.edit();
            editor.clear();
            editor.putBoolean("prefName", false);
            editor.commit();
            isclick = false;
         else if (!isclick) 
            seatdirnbtn.setBackgroundResource(R.drawable.icon4);
            editor = prefs.edit();
            editor.clear();
            editor.putBoolean("prefName", true);
            editor.commit();
            isclick = true;
        

    
;

【问题讨论】:

打印出 onRestart 中 if() 子句之后的 isCLicked 值是什么 isclick 在调试时总是返回 true。如何找出造成这种情况的根本原因。 @Capricorn 检查我发布的已编辑解决方案。谢谢。 @Pratik Sharma,感谢您的代码, @Capricorn 不客气,伙计。 :) 【参考方案1】:

试试这个修改后的解决方案

public class SharedprefsActivity extends Activity  

    protected static final String TAG = "HvacActivity";
    /** Called when the activity is first created. */
    private Button seatdirnbtn;
    private SharedPreferences prefs;
    private String prefName = "MyPref";
    private SharedPreferences.Editor editor;
    private boolean isclick;
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        seatdirnbtn = (Button) findViewById(R.id.seatdirnbtn);      
        seatdirnbtn.setOnClickListener(listner1);       
    

    public void onResume() 
        super.onResume();
        getPrefAndButtonState();        
    

    public void onPause() 
        super.onPause();
        setPrefAndButtonState();
    

    @Override
    public void onRestart() 
        super.onRestart();
        getPrefAndButtonState();
    

    @Override
    public void onStop() 
        super.onStop();
        setPrefAndButtonState();
    

    public void getPrefAndButtonState()
        prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);
        isclick = prefs.getBoolean("prefName", false);
        System.out.println("bool? " + isclick);
        if (isclick) 
            seatdirnbtn.setBackgroundResource(R.drawable.icon4hlt);
         else if (!isclick) 
            seatdirnbtn.setBackgroundResource(R.drawable.icon4);
        
    

    public void setPrefAndButtonState()
        editor = prefs.edit();
        editor.putBoolean("prefName", isclick);
        editor.commit();        
        getPrefAndButtonState();
    

    private View.OnClickListener listner1 = new View.OnClickListener()     
        public void onClick(View v)    
            if (isclick) 
                isclick = false;
                setPrefAndButtonState();            
             else if (!isclick) 
                isclick = true;
                setPrefAndButtonState();
               
        
    ;

我的测试很好,对我来说效果很好。

希望对你有帮助。

谢谢。

【讨论】:

感谢您的回复,但在重新启动时,我没有得到按钮图像的保存状态。如果单击按钮,则应保存并在重新启动时检索高亮背景图像 @Capricorn 尝试使用我发布的已编辑解决方案来解决您的问题。 感谢您的代码,但是当我添加您的代码时,我在运行应用程序后无法单击按钮。我应该单击它来更改背景图像,以便按下具有突出显示背景图像的状态应保存在共享首选项中。有什么想法吗? @Capricorn 如果您针对此问题向我发送一些小示例应用程序会很好。这将是一件好事,而且很容易解决。您可以从您的应用程序中删除所有其他代码并将所需的代码发送给我。我将在这里调试并以适当的解决方案发回给您。谢谢。 再次感谢,我的问题解决了一点。即在重新启动时它工作正常,我得到了按钮的按下状态图像(第一次按下时突出显示的背景图像,第二次按下时的正常背景图像)。我现在面临的是当我第一次运行应用程序时,我得到了按钮的高亮背景图像。我的第一次跑步应该有正常的背景。我将发布代码请检查我的编辑1

以上是关于保存的首选项在重新启动时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Amplify 控制台上部署为 SPA 后,Nuxtjs 动态路由在页面重新加载时不起作用

Android 地图:我的位置按钮在活动首次启动时不起作用

为啥这个宽度监视 AngularJS 指令在切换 Bootstrap 选项卡时不起作用?

级联在保存数据时不起作用

React Router 在重新加载时起作用,但在单击链接时不起作用

核心数据:后台更新 NSManagedObjectContext 在保存时不起作用