Не можете да запазите споделеното предпочитание при кликване върху изображение?

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

Искам да запазя предпочитанието при щракване върху изображение и когато отворя отново дейността, предишният избран избор трябва да е там, но не мога да запазя предпочитанието, то показва изображението по подразбиране, когато отворя отново.

Изгледът по подразбиране

След като изберете изображението за запазване на предпочитанията

Повторно отваряне на дейността


person Shubhankar    schedule 04.03.2014    source източник


Отговори (4)


Не съм тествал кода, но логиката ти е грешна. Не запазвахте предпочитанието при кликване.

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);
    }
}
person Samuel Barbosa    schedule 04.03.2014
comment
Можете да преместите setSoundChecked(sound) извън if-else. - person rusmus; 04.03.2014
comment
Сигурен. Не забелязах. Благодаря ти. - person Samuel Barbosa; 05.03.2014

Не изглежда, че всъщност се опитвате да запазите предпочитанието в събитието за кликване. Опитайте да актуализирате своя слушател на кликвания по този начин:

    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);        
}
person rusmus    schedule 04.03.2014
comment
не можем да извикаме метода getSharedPreferences вътре в метода за заместване onClick. - person Shubhankar; 04.03.2014
comment
Моя грешка. Да, можете да извикате getSharedPreferences вътре в clicklistener, просто трябва да премахнете thisreference или да го промените на YourClassName.this.getSharedPreferences(...) извикване. Актуализиран отговор за премахване на thisreference. - person rusmus; 04.03.2014

Също така извикайте getpref() метод или на бутон onClick като последно изявление или на дейност onPause/OnStop, за да запазите последната стойност на sh_sound в SharedPreferences като:

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

}
person ρяσѕρєя K    schedule 04.03.2014

Вие пишете в предпочитанията си в метода getprefs(), който се извиква само когато Activity стартира. Трябва да пишете, когато щракнете върху Button.

person Mark Buikema    schedule 04.03.2014