Opa pessoal Estou implementando em minha aplicação o dark mode para android. Criei um menu, e nele tenho a opção tema, ao clicar nele eu abro uma dialog que contem um swicth se ativado - modo escuro, se não, modo claro. Vou colocar o codigo para que seja entendido a forma que estou fazendo.
Activity que tem o menu:
else if (itemId == R.id.theme) {
MyApp myApp = new MyApp();
new DialogTheme(this, myApp, preferences).show();
}
como podem ver, estou passando para o DialogTheme, o context, essa instancia da classe MyApp (já explico) e o preferences, que é o meu SharedPreferences. Eu instanciei ele na activity qye contem esse menu:
preferences = getSharedPreferences("db", Context.MODE_PRIVATE);
Essa é a minha classe DialoTheme:
public class DialogTheme extends ThemeDialog {
public DialogTheme(Context context, MyApp myApp, SharedPreferences preferences) {
super(context, myApp, preferences);
}
}
Como podem ver, ela se estende a ThemeDialog e chama o construtor dela, passando o que mandei no DialogTheme.
Agora na classe ThemeDialog
public abstract class ThemeDialog {
private final Context context;
private final MyApp myApp;
private SharedPreferences preferences;
protected ThemeDialog(Context context, MyApp myApp, SharedPreferences preferences) {
this.context = context;
this.myApp = myApp;
this.preferences = preferences;
}
public void show() {
@SuppressLint("InflateParams") View viewCreated = LayoutInflater.from(context)
.inflate(R.layout.dialog_theme, null);
new AlertDialog.Builder(context)
.setTitle("Tema")
.setView(viewCreated)
.setPositiveButton("Ok", (dialog, which) -> {
Switch aSwitch = viewCreated.findViewById(R.id.switch_selection);
verifySwitch(aSwitch);
})
.show();
}
public void verifySwitch(Switch aSwitch) {
this.myApp.sendSwitch(aSwitch, preferences);
}
}
vejam que o método show, eu pego a referencia do meu Switch na view e chamo esse método verifySwitch(Switch aSwitch), passando o Switch
Esse método chama um outro método da minha Classe MyApp passando a preferences que ela recebeu e também o Switch.
Bom, por quer fiz isso, por que minha classe MyApp se estende á application, pois assim, consigo mudar o tema do app como um todo.
Classe MyApp:
public class MyApp extends Application {
private boolean activated = false;
private SharedPreferences preferencesSend;
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_NO);
}
public void sendSwitch(Switch aSwitch, SharedPreferences preferences) {
if (aSwitch.isChecked()) {
if (!activated) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
preferencesSend = preferences;
SharedPreferences.Editor edit = preferencesSend.edit();
edit.putBoolean("activated", true);
edit.putBoolean("switch1", aSwitch.isChecked());
edit.apply();
//aSwitch.setChecked(true);
activated = true;
}
} else {
//boolean switch1 = preferencesSend.getBoolean("switch1", true);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
preferencesSend = preferences;
SharedPreferences.Editor edit = preferencesSend.edit();
edit.remove("activated");
edit.remove("switch1");
edit.apply();
//aSwitch.setChecked(false);
activated = false;
}
}
}
é aqui eu faço a logica de se o switch foi checado ou não eu troco o tema do app. Vamos ao que esta pegando:
1 - Eu não estou conseguindo salvar o estado do switch quando ele é checado. O tema é trocado, mas quando ativado e volto para a dialog, ele não salva.
2 - Vejo que quando troca o tema, o app dá um pequeno delay quando volto para a minha primeira tela no app (o app possui duas somente.)
3 - Claro, um problema de cada vez, mas só para aproveitar o post, em celulares mais antigos, como um que tenho aqui para testar com o android marshimalom Ao ativar o tema e voltar para a tela principal, o app trava, não consigo clicar mais na lista e nem fazer o movimento de scroll. Mas em celulares atuais, acontece um delay mas não chega a travar. A mensagem dada é a seguinte:
Performing stop of activity that is not resumed:
Alguem poderia me ajudar, nao sei se estou fazendo do jeito certo tambem.