Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dark mode

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.

1 resposta
solução!

Pessoal Eu consegui implementar com a ajuda de um vídeo, moldei para minha necessidade e deu certo. Valeu

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software