Dlaczego SharedPreference nie działa? / Android Studio

0

Dlaczego moja metoda SharedPreference nie działa? Gdy przycisk ma status setEnable "true", chcę, aby to zostało zapisane gdy wyjdę z aplikacji, ale niestety tak się nie dzieje. Po zamknięciu i ponownym uruchomieniu mojej aplikacji, przycisk ma ponownie status setEnable "false" :( Byłbym wdzięczny za rozwiązanie tego problemu.

Activity z dwoma przyciskami. "button2" jest domyślnie ustawiony jako nieaktywny, kiedy użyję metody intent.putExtra("isEnabled", "enabled") w innej klasie z której przechodzę do tej klasy przycisk zmienia status na aktywny.

public class Activity2 extends AppCompatActivity implements View.OnClickListener{
 Button button1;
 Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_2);

    button1 = (Button) findViewById(R.id.button1);
    button1.setOnClickListener(this);

    button2 = (Button) findViewById(R.id.button2);
    button2.setOnClickListener(this);

   button2.setEnabled(getSharedPreferences("MY_PREF", MODE_PRIVATE).getBoolean("isEnabled",false));

}


@Override
public void onClick(final View v) {
   final MediaPlayer mp = MediaPlayer.create(this, R.raw.menu);
    if (v == button1) {

        startActivity(new Intent(Activity2.this, category1.class));
        mp.start();


    }

    if (v== button2){

        Intent intent=getIntent();
        String isEnabled = intent.getStringExtra("isEnabled");
        if(isEnabled==null||isEnabled.equals("disabled")){
            button2.setEnabled(false);
        }
        else{
            button2.setEnabled(true);
            getSharedPreferences("MY_PREF", MODE_PRIVATE).edit().putBoolean("isEnabled",true).apply();
            startActivity(new Intent(this, category2.class));
        }
        }



    }



}
0

Utwórz zmienna typu SharedPreferences w ciele klasy, zainicjalizuj już w onCreate() a potem wykonuj na niej operacje,
Wartość z getIntent() również pobieraj w onCreate() i zapisz sobie do zmiennej utworzonej w ciele klasy,
Nie widzę powodu dla którego do intentu pod klucz "isEnabled" pakujesz String zamiast boolean,
W przypadku tego onClick() przy if else bazuj na id widoku,
Każdy przycisk powinien miec swoją logikę

Uzywałeś debugera do sprawdzenia co zwraca ci getSharedPreferences("MY_PREF", MODE_PRIVATE).getBoolean("isEnabled",false)?

0

Generalnie to robię Quiz. Gra podzielona jest na 2 kategorie / w menu (czyli powyższa klasa o nazwie Activity2) wybiera się pierwszą kategorię ("button1"), natomiast druga kategoria (otwierająca się za pomocą przycisku o nazwie id. "button2") jest domyślnie zablokowana (setEnable "false").

Po przejściu wszystkich poziomów (każdy poziom to inna klasa) pierwszej kategorii , "button2" zmienia status na Enable "true". Przykładowo flagi1 -> flagi2-> flagi3 -> flagi4-> flagi5 -> win

W klasie "win" zastosowałem Intent.putExtra("isEnabled", "enabled"); przez co kiedy z niej wychodzę druga kategoria jest odblokowana ("button2" zmienia status na Enable "true").

Teraz pytanie, co muszę zrobić w swoim kodzie aby "button2" był permanentnie odblokowany ( Enable "true") w sensie kiedy wyjdę i wejdę do aplikacji ustawienia przycisku się nie zresetowały.

Oto klasa "win" natomiast wyżej w treści tematu jest klasa menu :

public class win extends AppCompatActivity implements View.OnClickListener{
Button win1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_winflagi);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    win1 = (Button) findViewById(R.id.winflagi);
    win1.setOnClickListener(this);

}

@Override
public void onClick(View v) {

    if(v==win1)
    {
        Intent myIntent = new Intent(win.this, Activity2.class);
        myIntent.putExtra("isEnabled", "enabled");
        startActivity(myIntent);

    }

}
}
0

Poczytaj o dobrych zasadach pisania kodu, podstawowe błędu który tutaj popełniasz to:
Klasy z małej litery,
Nazwy klas nic nie mówią o sobie, czytam to 5 razy i dalej nie wiem o co chodzi,
Nazwy zmiennych, w tym przypadku obiektów button1, button2 nic nie mówią,
Tworzysz jeden listener dla kilku przycisków i bazujesz na id zwracanego obiektu, jak byś dodał jeszcze kilka przycisków to ta metoda by się rozrosła masakrycznie

Zapoznaj się z książką Clean code i SOLID

public class MainActivity extends AppCompatActivity {

    private static final String NAME = "name";

    private Button button1;
    private Button button2;
    private SharedPreferences sharedPreferences;
    private boolean isEnabled;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = findViewById(R.id.button1);
        button1.setOnClickListener(onButton1Click);
        button2 = findViewById(R.id.button2);
        button2.setOnClickListener(onButton2Click);

        // tworzysz instancje shared preferences
        sharedPreferences = getSharedPreferences(NAME, MODE_PRIVATE);
        // pobierasz wartość z shared preferences
        isEnabled = sharedPreferences.getBoolean(Win.IS_ENABLED, false);
        // Ustawiasz stan przycisku
        button2.setEnabled(isEnabled);

    }

    private View.OnClickListener onButton1Click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //code
        }
    };

    private View.OnClickListener onButton2Click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //code
        }
    };
}
public class Win extends AppCompatActivity {

    private static final String NAME = "name";
    public static final String IS_ENABLED = "isEnabled";

    private SharedPreferences sharedPreferences;

    Button win1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_winflagi);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        win1 = (Button) findViewById(R.id.winflagi);
        win1.setOnClickListener(onButton1Click);
        // tworzysz instancje shared preferences
        sharedPreferences = getSharedPreferences(NAME, MODE_PRIVATE);
    }

    private View.OnClickListener onButton1Click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // wkładasz wartość typu boolean
            sharedPreferences.edit().putBoolean(IS_ENABLED, true).apply();
            Intent myIntent = new Intent(win.this, Activity2.class);
            startActivity(myIntent);
        }
    };

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1