Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Imagem não aparecendo quando uso app:showAsAction

Oi, estou tendo um probleminha nesse exercício. Está tudo funcionando normal até aqui, o botão está aparecendo no menu e tal, porém quando eu uso app:showAsAction="true" no xml do menu a imagem não aparece, como se essa linha não fizesse nada. Porém, quando eu mudei para android:showAsAction="true" para testar, o checkmark apareceu igualzinho na videoaula. Alguém pode me explicar porque isso aconteceu? Segue o código abaixo:

menu_formulario.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="br.com.alura.agenda.FormularioActivity">
    <item
        android:id="@+id/menu_formulario_ok"
        android:title="Ok"
        android:icon="@drawable/ic_confirmar"
        android:showAsAction="always"/> // mudei app para android e funcionou
</menu>

FormularioActivity.java

package br.com.alura.agenda;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class FormularioActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.menu_formulario, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.menu_formulario_ok:
                Toast.makeText(FormularioActivity.this, "Aluno salvo com sucesso!", Toast.LENGTH_SHORT).show();
                finish();
                break;
        }

        return super.onOptionsItemSelected(item);
    }
}
5 respostas

Oi Luiz,

O atributo showAsAction e do namespace android mesmo, e não do app. Você pode dar uma olhada aqui => https://developer.android.com/guide/topics/resources/menu-resource.html

Estranho, na explicação e na vídeo aula está app ao invés de android. Mais estranho ainda, o Android Studio me da um warning por causa disso. Enfim, obrigado, marquei sua resposta como solução.

Oi Luiz, tudo bem ?

Usamos o app para dar suporte tanto para a versão mais recente quanto para as versões anteriores do android.

Só de colocar app já deveria funcionar, quando colocamos android estamos falando que só queremos dar suporte para a versão mais recente do android. Provavelmente o celular que você está usando está com a última versão do android instalada.

Espero ter ajudado

Abraços :D

solução!

Olá Luiz,

você está certo, a propriedade showAsAction é do namespace app. Ou seja, o seu código

<menu
xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        app:showAsAction="always"/>
</menu>

está correto, sim.

Então por que o item não está aparecendo?

Veja que no seu onCreateOptionsMenu, você tem o seguinte código:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.menu_formulario, menu);
        return super.onCreateOptionsMenu(menu);
    }

O grande problema está nessa linha:

        MenuInflater inflater = new MenuInflater(this);

Como você está numa classe filha de AppCompatActivity, para obter um menu compatível (que as propriedades começadas com app funcionem), você precisa pedir para o AppCompatActivity um inflador de menus:

        MenuInflater inflater = getMenuInflater();

Quando você instancia direto um MenuInflater, usa o inflador comum da Activity e não do AppCompatActivity. Por isso que suas propriedades de compatibilidade não funcionavam.

Entendi, Felipe. Muito obrigado pela explicação. Acabei de corrigir aqui.