я еще только учусь программировать и у меня возникла проблема при изменении темы приложения, в идеале я хочу сделать так чтобы при нажатии на чекбокс в настройках тема в самих настройках и в приложении менялась со светлой на темную сразу же, но почему то тема в настройках меняется только при открытии их повторно а главной Активности только после перезапуска приложения, хотя во второй Активности тема меняется при повторном ее открытии. Я что то делаю не так и не могу понять что, прошу вашей помощи в этом, буду признателен за любые ответы.
Ниже прилагаю код моего приложения.
MainActivity
package com.example.testsettings;
public class MainActivity extends AppCompatActivity {
String LOG = "log";
private void setTheme() {
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("enabled", false)) {
this.setTheme(R.style.AppTheme);
} else {
this.setTheme(R.style.AppThemeDark);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(LOG, "onCreate");
setTheme();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
Log.d(LOG, "onResume");
setTheme();
super.onResume();
}
@Override
protected void onDestroy() {
Log.d(LOG, "onDestroy");
super.onDestroy();
}
@Override
protected void onPause() {
Log.d(LOG, "onPause");
super.onPause();
}
@Override
protected void onStart() {
Log.d(LOG, "onStart");
super.onStart();
}
@Override
protected void onStop() {
Log.d(LOG, "onStop");
super.onStop();
}
public void setPrefs(View view) {
Intent intent = new Intent(this, Settings.class);
startActivity(intent);
}
public void onclick(View view) {
Intent intentA = new Intent(this, Main2Activity.class);
intentA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intentA);
}
}
Main2Activity
public class Main2Activity extends AppCompatActivity {
private void setTheme() {
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("enabled", false)) {
this.setTheme(R.style.AppTheme);
} else {
this.setTheme(R.style.AppThemeDark);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
SettingsActivity
public class Settings extends AppCompatActivity implements OnSharedPreferenceChangeListener {
private void setTheme() {
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("enabled", false)) {
this.setTheme(R.style.AppTheme);
} else {
this.setTheme(R.style.AppThemeDark);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
SettingsFragment fragment = new SettingsFragment();
getFragmentManager().beginTransaction().add(R.id.prefs_content, fragment).commit();
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}
public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String string){
if (string.equals("enabled")){
this.finish();
this.startActivity(new Intent(this, this.getClass()));
this.setResult(-1, new Intent());
}
}
Settings.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="Theme"
android:key="prefs_key">
<CheckBoxPreference
android:key="enabled"
android:summary="Темная тема"
android:title="dark"
android:defaultValue="true"/>
Для смены темы внутри метода onCreate()
в Activity необходимо прописать два метода: setTheme()
и setContentView()
, которые Вы успешно прописали в коде. Однако тема меняется только после вызова метода onCreate()
. Вы сейчас пересоздаёте свою верхнюю Activity (тем самым вызывая onCreate()
у данной Activity), однако забываете про тот стек Activity, который вы открывали ранее. Их вы НЕ пересоздаёте, следовательно в них у Вас тема НЕ меняется. Как пересоздать весь стек Activity хорошо объясняется в данном ответе: https://stackoverflow.com/a/28799124/7120432
Благодаря ответу выше получилось изменить тему в главной активности дополнив медод onStop в MainActivity
@Override
protected void onStop() {
super.onStop();
finish();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
в общем пишу бота для множественного входа на почту (для себя)есть 300 почт, нужно поочередно на них заходить и выходить так, чтобы сервер понимал,...
Есть код игры "Угадай число"Но рейтинг участников вывести не могу
Как HashMap<String, Integer> map увеличить значение числа, например, я вставил в map значение: mapput("example", 5); и как его по ключу увеличить?
уважаемые программисты и кодеры, возникла следующая проблема, которую я уже безуспешно пытаюсь исправить без малого деньУ меня есть метод...