SharedPreferences не сохраняет логическое значение при перезапуске приложения - PullRequest
1 голос
/ 09 января 2020

Я занимаюсь разработкой приложения, которое я использую в теме DarkMode, для которого я включаю и выключаю darkMode Switch и сохраняю его внутри логического значения, означающего, что darkMode становится истинным или ложным (boolean isDarkMode =false;)

это работает хорошо, и я использую SharedPreferences, чтобы сохранить это истинное или ложное значение, чтобы использовать его в других действиях. это работает, но ... когда я закрываю приложение и снова запускаю приложение, значение SharedPreferences не сохраняется, и оно возвращается к первому значению boolian (спасибо)

SettingActivity. java (чтобы установить boolian true или false)

package com.kurdfoxx.nightmodewithsharedprefrense;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

public class SettingActivity extends AppCompatActivity {
    Switch mySwitch;
    boolean isDarkMode =false;
    private static final String DARKMODE = "login";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        myboolian();
        if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
            setTheme(R.style.darkTheme);
            isDarkMode =true;

        } else {
            setTheme(R.style.AppTheme);
            isDarkMode =false;


        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);
        Toast.makeText(this, ""+ isDarkMode, Toast.LENGTH_SHORT).show();
        mySwitch = findViewById(R.id.switch1);
        if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
            mySwitch.setChecked(true);
        }
        mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                    isDarkMode =true;
                    restartApp();
                } else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    isDarkMode =false;

                    restartApp();

                }
            }
        });


        Button buttonGoMain=findViewById(R.id.btn_go_MainAct);
        buttonGoMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SettingActivity.this,MainActivity.class));

            }
        });


    }

    public void restartApp() {
        Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
        startActivity(intentRestartApp);
        finish();

    }
    public void myboolian(){
           isDarkMode =!isDarkMode;  //change isDarkMode from false to true by this
        SharedPreferences sharedPreferences =getSharedPreferences(DARKMODE,MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("ISDARKMODE", isDarkMode);
        editor.apply();


    }


}

и MainActivity. java

package com.kurdfoxx.nightmodewithsharedprefrense;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static final String DARKMODE = "login";
    boolean isDarkMode = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getData();
        if (isDarkMode){

            if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
                setTheme(R.style.darkTheme);
                isDarkMode =true;
            } else {
                setTheme(R.style.AppTheme);
                isDarkMode =false;

            }
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button_go_to_setting_activity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SettingActivity.class));
            }
        });

    }
    private void getData() {

        SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
        isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);

    }

}

Ответы [ 2 ]

2 голосов
/ 09 января 2020

В вашем selectedChangedListener вы устанавливаете darkMode на true и false соответственно.

И в вашем методе myboolian это единственное место, где вы пишете переменную.

Этот метод только вызывается из вашего onCreate и больше никуда. Кроме того, этот метод всегда устанавливает darkMode = !darkMode, меняя значение.

Вы должны вызвать myboolian в onCheckedChanged и удалить darkMode = !darkMode, иначе вы всегда будете сбрасываться до значения ранее.

0 голосов
/ 12 января 2020

спасибо @Grisgram за помощь. Я решил эту проблему с некоторыми изменениями и замечаниями о

settingActivity. java

package com.kurdfoxx.nightmodewithsharedprefrense;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

public class SettingActivity extends AppCompatActivity {
   public static Switch mySwitch;
    boolean isDarkMode =false;
    private static final String DARKMODE = "dark";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
            setTheme(R.style.darkTheme);
            isDarkMode=true;

        } else {
            setTheme(R.style.AppTheme);
            isDarkMode=false;


        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);
        Toast.makeText(this, ""+ isDarkMode, Toast.LENGTH_SHORT).show();
        mySwitch = findViewById(R.id.switch1);
        if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
            mySwitch.setChecked(true);
        }
        mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                    isDarkMode=true;
                    myboolian();


                    restartApp();
                } else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    isDarkMode=false;
                    myboolian();

                    restartApp();

                }
            }
        });
        myboolian();

        Button buttonGoMain=findViewById(R.id.btn_go_MainAct);
        buttonGoMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SettingActivity.this,MainActivity.class));

            }
        });


    }

    public void restartApp() {
        Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
        startActivity(intentRestartApp);
        finish();

    }
    public void myboolian(){
     // isDarkMode =!isDarkMode;  //change isDarkMode from false to true by this
        SharedPreferences sharedPreferences =getSharedPreferences(DARKMODE,MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("ISDARKMODE", isDarkMode);
        editor.apply();


    }


}

и основной деятельности

package com.kurdfoxx.nightmodewithsharedprefrense;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private static final String DARKMODE = "dark";
    boolean isDarkMode ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getData();
        Toast.makeText(this, "is datk ?"+isDarkMode, Toast.LENGTH_SHORT).show();

        if (isDarkMode){
                setTheme(R.style.darkTheme);
        }else {setTheme(R.style.AppTheme);}
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button_go_to_setting_activity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SettingActivity.class));
            }
        });

    }
    private void getData() {

        SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
        isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);



    }




}
...