3
respostas

o onPrepareOptionsMenu não executa o if

Ao iniciar a Activity pela primeira vez, o onPrepareOptionsMenu deveria verificar o If para saber qual dois itens de menu deveria exibir na ActionBar, de acordo com o resultado do SharedPreferences.

Fiz alguns testes utilizando o Toast e verifiquei que o onPrepare consegue buscar o valor do SharedPreferences, mas não executa o If.

A condição só funciona se eu clicar e executar o onOptionsMenuItem.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_notas);

        setTitle(TITULO_APPBAR);

        configuraBotaoInsereNota();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_lista_notas_activity, menu);

        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        MenuItem botao_stagLayout = menu.findItem(R.id.menu_lista_notas_staggeredLayout);
        MenuItem botao_linearLayout = menu.findItem(R.id.menu_lista_notas_linearLayout);

//        getMenuInflater().inflate(R.menu.menu_lista_notas_activity, menu);

        linearLayoutManager = new LinearLayoutManager(this);
        staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        List<Nota> todasNotas = pegaTodasNotas();
        configuraRecyclerView(todasNotas, linearLayoutManager);

        sharedPreferences = getSharedPreferences(LAYOUT_LISTA, Context.MODE_PRIVATE);
        String layoutDoUsuario = sharedPreferences.getString(CHAVE_LAYOUT, NAO_ENCONTRADO);
        Toast.makeText(this, layoutDoUsuario, Toast.LENGTH_SHORT).show();

        if(layoutDoUsuario == STAGGERED){
            botao_stagLayout.setVisible(false);
            botao_linearLayout.setVisible(true);

            configuraRecyclerView(todasNotas, staggeredGridLayoutManager);

        } else if(layoutDoUsuario == LINEAR){
            botao_stagLayout.setVisible(true);
            botao_linearLayout.setVisible(false);
            Toast.makeText(this, layoutDoUsuario, Toast.LENGTH_SHORT).show();

            configuraRecyclerView(todasNotas, linearLayoutManager);

        } else if(layoutDoUsuario == NAO_ENCONTRADO){
            botao_stagLayout.setVisible(true);
            botao_linearLayout.setVisible(false);

            configuraRecyclerView(todasNotas, linearLayoutManager);
        }
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        String layoutStag = layoutStagggered.name();
        String layoutLin = layoutLinear.name();

        switch (item.getItemId()){
            case R.id.menu_lista_notas_staggeredLayout:

                sharedPreferences = getSharedPreferences(LAYOUT_LISTA, MODE_PRIVATE);
                editor = sharedPreferences.edit();
                editor.putString(CHAVE_LAYOUT, layoutStag);
                editor.apply();

                invalidateOptionsMenu();
                break;
            case R.id.menu_lista_notas_linearLayout:

                editor = sharedPreferences.edit();
                editor.putString(CHAVE_LAYOUT, layoutLin);
                editor.apply();

                invalidateOptionsMenu();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
3 respostas

Oi Matheus, tudo bem?

Vejamos se eu entendi a sua dúvida, existe algum if dentro da sua lógica que não está sendo executado? Se sim, qual é e em qual condição?

Pois da maneira como implementou, você considerou o uso do else if que só executa se o if acima falha.

Um outro destaque importante, de ser feito é que no seu onPrepareOptionsMenu() está com muita responsabilidade, veja que ele está até mesmo configurando o RecyclerView.

Em outras palavras, antes de prosseguir com o projeto, sugiro avaliar o seu código, tanto na complexidade como na responsabilidade e aplicar técnicas de refatoração assim como vemos nos cursos de Android.

Além de deixar a solução mais limpa, vai te ajudar a entender o que é ou não necessário para a implementação atual.

[]s

Olá!

Fiz uma refatoração do meu código e criei um método para configurar o RecyclerView e chamar o invalidateOptionsMenu, também retirei os else if, porém o problema continua.

Ao iniciar o app pela primeira vez, o menu na action bar não esconde um dos botões como deveria. Eu coloquei um Toast no if para saber quando a execução passa pelo método e ao iniciar o app pela primeira vez, ele não é acionado.

Os ifs no onPrepareOptionsMenu, só estão sendo executados ao clicar em um dos botões da actionbar selecionando um dos layouts.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_notas);

        setTitle(TITULO_APPBAR);

        verificaShared();
        configuraBotaoInsereNota();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_lista_notas_activity, menu);

        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        MenuItem botao_stagLayout = menu.findItem(R.id.menu_lista_notas_staggeredLayout);
        MenuItem botao_linearLayout = menu.findItem(R.id.menu_lista_notas_linearLayout);

//        getMenuInflater().inflate(R.menu.menu_lista_notas_activity, menu);

        sharedPreferences = getSharedPreferences(LAYOUT_LISTA, Context.MODE_PRIVATE);
        String layoutDoUsuario = sharedPreferences.getString(CHAVE_LAYOUT, NAO_ENCONTRADO);

        if(layoutDoUsuario == STAGGERED){
            botao_stagLayout.setVisible(false);
            botao_linearLayout.setVisible(true);
            Toast.makeText(this, layoutDoUsuario, Toast.LENGTH_SHORT).show();
        }
        if(layoutDoUsuario == LINEAR){
            botao_stagLayout.setVisible(true);
            botao_linearLayout.setVisible(false);
            Toast.makeText(this, layoutDoUsuario, Toast.LENGTH_SHORT).show();
        }
        if(layoutDoUsuario == NAO_ENCONTRADO){
            botao_stagLayout.setVisible(true);
            botao_linearLayout.setVisible(false);
            Toast.makeText(this, layoutDoUsuario, Toast.LENGTH_SHORT).show();
        }
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        String layoutStag = layoutStagggered.name();
        String layoutLin = layoutLinear.name();

        switch (item.getItemId()){
            case R.id.menu_lista_notas_staggeredLayout:

                sharedPreferences = getSharedPreferences(LAYOUT_LISTA, MODE_PRIVATE);
                editor = sharedPreferences.edit();
                editor.putString(CHAVE_LAYOUT, layoutStag);
                editor.apply();

                verificaShared();
//                invalidateOptionsMenu();
                break;
            case R.id.menu_lista_notas_linearLayout:

                editor = sharedPreferences.edit();
                editor.putString(CHAVE_LAYOUT, layoutLin);
                editor.apply();

                verificaShared();
//                invalidateOptionsMenu();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

Este é o novo método:

private void verificaShared(){
        sharedPreferences = getSharedPreferences(LAYOUT_LISTA, Context.MODE_PRIVATE);
        String layoutDoUsuario = sharedPreferences.getString(CHAVE_LAYOUT, NAO_ENCONTRADO);

        linearLayoutManager = new LinearLayoutManager(this);
        staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

        List<Nota> todasNotas = pegaTodasNotas();

        if(layoutDoUsuario == STAGGERED){
            configuraRecyclerView(todasNotas, staggeredGridLayoutManager);
        }
        if(layoutDoUsuario == LINEAR){
            configuraRecyclerView(todasNotas, linearLayoutManager);
        }
        if(layoutDoUsuario == NAO_ENCONTRADO){
            configuraRecyclerView(todasNotas, linearLayoutManager);
        }

        invalidateOptionsMenu();
    }

Oi Matheus,

Considerando a modificação do seu código, um outro detalhe é que você não está usando o padrào camelCase nas variáveis para o menu. É de extrema importância o uso desse padrão em código fonte Java ou Kotlin.

Um outro detalhe é que o onPrepareOptionsMenu() é chamado apenas uma vez durante a criação da Activity, ou seja, via listener de menus é executado os comportamentos do método onOptionsItemSelected().

Nesse caso, verifica o valor da variável layoutDoUsuario dentro do onPrepareOptionsMenu(), confira se o valor retornado é o esperado para entrar no if esperado.

[]s