Сохранение параметра singleChoiceItems AlertDialog с использованием SharedPreference

#java #android #sharedpreferences #android-alertdialog

#java #Android #sharedpreferences #android-alertdialog

Вопрос:

Я реализовал singleChoiceItems AlertDialog функцию, которая открывается из меню навигации в моем приложении для Android. Я использую его для изменения темы приложения (светлая, темная, системная по умолчанию). введите описание изображения здесь

Теперь я пытаюсь сохранить текущее состояние AlertDialog in sharedPrefernces вместе с темой, которую выбирает пользователь. Например, если я ранее выбрал темную тему, я хочу AlertDialog , чтобы она отображала то же самое при применении темы к приложению.

Вот код, который я использовал.

 String selectedTheme = "Light";
public  static final String SHARED_PREFS = "sharedPrefs";

SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);       
selectedTheme = sharedPreferences.getString("str", "Light");


public void openDialog() {
        String[] themes = {"Light", "Dark", "System default"};
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Choose Theme");
        builder.setSingleChoiceItems(themes, 2, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                selectedTheme = themes[which];
            }
        });
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                SharedPreferences sharedPreferences = getSharedPreferences("SHARED_PREFS", MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("str", selectedTheme);
                editor.apply();
                if (selectedTheme.equals("Light")) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                }
                else if (selectedTheme.equals("Dark")) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                }
                else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                }
                dialog.dismiss();
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.show();

    }
 

С помощью приведенного выше кода sharedpreferences не сохраняет текущее состояние. Какие изменения мне нужно сделать, чтобы заставить его работать?

Комментарии:

1. if (selectedTheme.equals("Light")) editor.putString("str", "Dark"); ??

2. int checkedItem = 2; .setSingleChoiceItems(choices, checkedItem, ....... Вы устанавливаете для него значение 0: первое.

3. Достаточно одной строки: editor.putString("str", selectedTheme);

4. @blackapps, я пытался с вашими предложениями. Это не сработало

5. Пожалуйста, отредактируйте свой код, чтобы мы могли видеть, что вы изменили и как вы определяете значение checkedItem . И почему не отреагировал на мой первый комментарий?

Ответ №1:

Я смог решить проблему, поделившись строкой, связанной с темой sharedPreference . Я также реализовал AlertDialog проблему, из-за которой я хотел проверить элементы, которые были ранее выбраны внутри приложения.

Ниже приведен код, который я использовал:

 String selectedTheme = "Light";
int checkedItem = 0;

public static final String SHARED_PREFS = "sharedPrefs";
public static final String TEXT = "text";
public static final String RADIO = "selected";

 

Затем я позвонил loadData() и updateViews() из onCreate() .

 public void openDialog() {
        String[] themes = {"Light", "Dark", "System default"};
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Choose Theme");

        if (selectedTheme.equals("Light")) {
            checkedItem = 0;
        } else if (selectedTheme.equals("Dark")) {
            checkedItem = 1;
        } else {
            checkedItem = 2;
        }
        builder.setSingleChoiceItems(themes, checkedItem, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                selectedTheme = themes[which];
            }
        });
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (selectedTheme.equals("Light")) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                }
                else if (selectedTheme.equals("Dark")) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                }
                else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                }
                saveData();
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.show();

   }
 
 public void saveData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(TEXT, selectedTheme);
        editor.putInt("selected", checkedItem);
        editor.apply();
        Toast.makeText(MainActivity.this, "Data Saved", Toast.LENGTH_SHORT).show();
    }

 
 
    public void loadData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        selectedTheme = sharedPreferences.getString(TEXT, "System default");
        checkedItem = sharedPreferences.getInt("selected", 0);
    }

 
 
    public void updateViews() {
        if (selectedTheme.equals("Light")) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            checkedItem = 0;
        }
        else if (selectedTheme.equals("Dark")) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            checkedItem = 1;
        }
        else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
            checkedItem = 2;
        }
    }
 

Я следовал руководству по этой ссылке.