【问题标题】:Unable to save shared preference on image click?无法在图像点击时保存共享偏好?
【发布时间】:2014-03-04 14:22:18
【问题描述】:
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ib1= (ImageButton) findViewById(R.id.imageButton1);
        getpref();
        ib1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(sound==true){
                    sound=false;
                    ib1.setImageResource(R.drawable.volume);
                }
                else{
                    sound=true;
                    ib1.setImageResource(R.drawable.vol);
                }
            }
        });
    };
    public void getpref() {
        SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
        Boolean sh_sound = prefs.getBoolean("key", true);
        sound=sh_sound;
        if(sh_sound==true){
            SharedPreferences pref = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
            Editor editor = pref.edit();
            editor.putBoolean("key", sh_sound);
            editor.commit();
            checkpref(sh_sound);
        }
        else{
            SharedPreferences pref = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
            Editor editor = pref.edit();
            editor.putBoolean("key", sh_sound);
            editor.commit();
            checkpref(sh_sound);
        }
    }
    public void checkpref(Boolean sh_sound) {
        if(sh_sound== true){
            ib1.setImageResource(R.drawable.vol);
        }
        else{
            ib1.setImageResource(R.drawable.volume);
        }
    }

我想保存单击图像时的首选项,当我重新打开活动时,之前选择的选项应该在那里,但我无法存储首选项,当我重新打开时它会显示默认图像。

默认视图

选择要存储偏好的图片后

重新开启活动

【问题讨论】:

    标签: android sharedpreferences android-preferences


    【解决方案1】:

    我没有测试代码,但你的逻辑是错误的。您没有在点击时保存首选项。

    Boolean sound;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ib1= (ImageButton) findViewById(R.id.imageButton1);
        getpref();
        ib1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(sound==true){
                    sound = false;
                    ib1.setImageResource(R.drawable.volume);
                } else{
                    sound = true;
                    ib1.setImageResource(R.drawable.vol);
                }
                setSoundChecked(sound);
            }
        });
    };
    
    void setSoundChecked(Boolean checked) {
        SharedPreferences pref = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
        Editor editor = pref.edit();
        editor.putBoolean("key", checked);
        editor.commit();
    }
    
    public void getpref() {
        SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
        Boolean sh_sound = prefs.getBoolean("key", true);
        sound = sh_sound;
        checkpref(sh_sound);
    }
    
    public void checkpref(Boolean sh_sound) {
        if(sh_sound== true){
            ib1.setImageResource(R.drawable.vol);
        }
        else{
            ib1.setImageResource(R.drawable.volume);
        }
    }
    

    【讨论】:

    • 你可以把setSoundChecked(sound)移出if-else。
    • 当然。没注意。谢谢。
    【解决方案2】:

    看起来您实际上并没有尝试将首选项保存在点击事件中。尝试像这样更新您的点击侦听器:

        ib1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(sound==true){
                    sound=false;
                    ib1.setImageResource(R.drawable.volume);
                }
                else{
                    sound=true;
                    ib1.setImageResource(R.drawable.vol);
                }
    
                SharedPreferences pref = getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
                Editor editor = pref.edit();
                editor.putBoolean("key", sound);
                editor.commit();
            }
        });
    

    除此之外,您似乎正在保存您刚刚在 getpref() 中读取的值,您可以像这样简化它:

    public void getpref() {
        SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
        Boolean sh_sound = prefs.getBoolean("key", true);
        sound=sh_sound;       
    
        checkpref(sh_sound);        
    }
    

    【讨论】:

    • 我们无法在 onClick 覆盖方法中调用 getSharedPreferences 方法。
    • 我的错误。是的,您可以在 clicklistener 中调用 getSharedPreferences,您只需删除 thisreference 或将其更改为 YourClassName.this.getSharedPreferences(...) 调用。更新了删除 thisreference 的答案。
    【解决方案3】:

    还可以在 Button onClick 作为最后一条语句或在 Activity onPause/OnStop 上调用 getpref() 方法,以将 SharedPreferencessh_sound 的最新值保存为:

    @Override
    public void onPause()
    {
          // call getpref() here..
         getpref();
        super.onPause();
    
    }
    

    【讨论】:

      【解决方案4】:

      您正在使用 getprefs() 方法写入首选项,该方法仅在 Activity 启动时调用。当你点击Button 时你应该写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多