#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;
}
}
Я следовал руководству по этой ссылке.