Estava dando aula e precisei mostrar para os meus alunos um exemplo de um menu de contexto. Mas o que é um menu de contexto? É basicamente é uma lista de opções que é exibida quando o usuário dá um clique longo em um componente da tela. Isso é particularmente útil em uma lista, onde você pode realizar várias operações sobre um determinado item.
É esse exemplo que mostraremos aqui. Crie um novo projeto, e em seguida crie o arquivo menu_contexto.xml na pasta menu (essa pasta não existe, você deve criá-la).
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/opcao1" android:title="Opção 1"/> <item android:id="@+id/opcao2" android:title="Opção 2"/> <item android:id="@+id/opcao3" android:title="Opção 3"/> </menu>Esse arquivo contém as opções de menu que aparecerão no menu de contexto. Carregaremos essas opções no método onCreateContextMenu na nossa Activity.
public class MainActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String[] nomes = { "Fulano", "Cicrano", "Beltrano", "João", "Maria", "José", "Antônio", "Francisco" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nomes); setListAdapter(adapter); registerForContextMenu(getListView()); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); getMenuInflater().inflate( R.menu.menu_contexto, menu); } @Override public boolean onContextItemSelected(MenuItem item){ AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); String nomeSelecionado = (String) getListView().getItemAtPosition(info.position); switch (item.getItemId()) { case R.id.opcao1: Toast.makeText(this, "Opção 1 - "+ nomeSelecionado, Toast.LENGTH_SHORT).show(); return true; case R.id.opcao2: Toast.makeText(this, "Opção 2 - "+ nomeSelecionado, Toast.LENGTH_SHORT).show(); return true; case R.id.opcao3: Toast.makeText(this, "Opção 3 - "+ nomeSelecionado, Toast.LENGTH_SHORT).show(); return true; } return super.onContextItemSelected(item); } }A primeira etapa para criar o menu de contexto é chamar o método registerForContextMenu, passando um objeto View. Pode ser qualquer View, mas no nosso exemplo estamos pegando a ListView (que a classe ListActivity tem internamente). No método onCreateContextMenu utilizamos a classe MenuInflater para carregar o arquivo de menu que criamos anteriormente.
Por fim, para tratar as opções de menu, utilizamos o método onContextItemSelected. Esse método começa resolvendo um problema que temos quando usamos um menu de contexto em uma lista: quando o menu de contexto é aberto, perdemos o item que estava selecionado na lista.
Felizmente, podemos obter essa informação através do método getMenuInfo, que quando chamado em um item de menu que está associada a view, que é preenchida por um Adapter (a ListView está usando um ArrayAdapter para exibir seu conteúdo), retorna uma instância da classe AdapterContextMenuInfo. Nela podemos obter a linha que foi selecionada através do atributo position.
Para saber a opção de menu que foi selecionada, usamos o método getItemId, e comparamos com os ids que foram definidos no arquivo XML de menu. Abaixo temos a nossa aplicação em execução.
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
8 comentários:
Bem legal!
Parabéns pelo seu blog! Você mostra muito conhecimento no assunto. Deveria explorar isso mais criando video-aulas, ensinando a distância pela web.
Abraço!!
Valeu Tony!
Gosto muito de escrever, por isso prefiro os post às video aulas. Mas dou cursos EAD de Android e iOS (lançando em breve). Mais detalhes em:
http://www.cesar.edu.br
4br4ç05,
nglauber
Queimei mufa aqui, revisando o código e tava igualzinho ao seu. Aí, reli o texto e vi: longo clique.. Não tem como fazer isso para um clique normal?
Obrigada.
Oi Fernanda,
Aí você pode usar um Dialog normal.
http://developer.android.com/guide/topics/ui/dialogs.html#AddingAList
4br4ç05,
nglauber
Tem como colocar imagens no menu?
Oi Alessando,
O menu de contexto não suporta ícones. Mas você pode usar esse componente aqui:
https://code.google.com/p/android-icon-context-menu/
Entrentanto aconselho você usar o menu de contexto da ActionBar que eu mostrei nesse post aqui:
http://nglauber.blogspot.com.br/2013/07/listview-com-selecao-multipla-actionbar.html
4br4ç05,
nglauber
Ótima explicação! obrigado!! parabéns
Rubens
Postar um comentário