Tutorial Android #7 – Menus e Mensagens

Padrão

Olá pessoal! Continuando com a nossa série sobre Android, hoje vamos ver como adicionar itens de menu (acessíveis pelo botão físico de menu do dispositivo) e mensagens informativas (anotações) para os itens listados na nossa Lista de Restaurantes.

O primeiro passo, então, é adicionarmos em nossa classe de modelo o campo anotações, do tipo String. Após os o campo mais o setter e getter, a nossa classe Restaurante ficará assim:

package net.rafaeltoledo.restaurante.model;</p>
<p>public class Restaurante {</p>
<p>	private String nome = &quot;&quot;;<br />
	private String endereco = &quot;&quot;;<br />
	private String tipo = &quot;&quot;;<br />
	private String anotacoes = &quot;&quot;;</p>
<p>	public String getNome() {<br />
		return nome;<br />
	}</p>
<p>	public void setNome(String nome) {<br />
		this.nome = nome;<br />
	}</p>
<p>	public String getEndereco() {<br />
		return endereco;<br />
	}</p>
<p>	public void setEndereco(String endereco) {<br />
		this.endereco = endereco;<br />
	}</p>
<p>	public String getTipo() {<br />
		return tipo;<br />
	}</p>
<p>	public void setTipo(String tipo) {<br />
		this.tipo = tipo;<br />
	}</p>
<p>	public String getAnotacoes() {<br />
		return anotacoes;<br />
	}</p>
<p>	public void setAnotacoes(String anotacoes) {<br />
		this.anotacoes = anotacoes;<br />
	}</p>
<p>	@Override<br />
	public String toString() {<br />
		return getNome();<br />
	}<br />
}

Continuando, vamos agora adicionar o campo para as anotações em nosso arquivo main.xml. Antes do nó Button, adicione o campo:

&lt;TableRow&gt;<br />
	&lt;TextView android:text=&quot;Anotações:&quot;/&gt;<br />
	&lt;EditText android:id=&quot;@+id/anotacoes&quot;<br />
		android:singleLine=&quot;false&quot;<br />
		android:gravity=&quot;top&quot;<br />
		android:lines=&quot;2&quot;<br />
		android:scrollHorizontally=&quot;false&quot;<br />
		android:maxLines=&quot;2&quot;<br />
		android:maxWidth=&quot;200sp&quot;/&gt;<br />
&lt;/TableRow&gt;

Caso execute o aplicativo, o formulário terá essa aparência:

O próximo passo é criarmos o menu, e configurá-lo para ser exibido quando o usuário pressionar a tecla Menu do celular. Para isso, vamos criar um novo arquivo XML, chamado opcao.xml, colocando-o em res/menu. O arquivo terá o seguinte conteúdo:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />
&lt;menu xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&gt;<br />
	&lt;item android:id=&quot;@+id/anotacao&quot;<br />
	    android:title=&quot;Exibir Anotação&quot;<br />
	    android:icon=&quot;@drawable/anotacao&quot;/&gt;<br />
&lt;/menu&gt;

O ícone anotacao (anotacao.png) pode ser baixado no final do post, junto com o projeto.

Continuando, agora adicione o seguinte método a nossa classe ListaRestaurantes:

@Override<br />
public boolean onCreateOptionsMenu(Menu menu) {<br />
	new MenuInflater(this).inflate(R.menu.opcao, menu);<br />
	return super.onCreateOptionsMenu(menu);<br />
}

Agora, ao pressionar a tecla Menu do celular, a opção definida será exibida a opção de menu que definimos.

Agora, vamos adicionar o controle sobre o botão, para que a anotação seja exibida quando o usuário selecionar o botão Exibir Anotação. A questão principal, é que para isso precisamos saber qual anotação devemos exibir. Para isso, vamos criar um controle para saber qual restaurante está selecionado.

Para começar, vamos adicionar um novo atributo à nossa classe ListaRestaurantes, chamado atual, que será inicializado em null.

Restaurante atual = null;

Após isso, nos métodos onSave() e onListClick(), em vez de utilizar a variável local r, vamos utilizar o atributo atual. Além disso, lembre-se de adicionar as referências também ao novo atributo (anotacoes) nestes métodos, e crie um atributo para ele, juntamente com nome, endereco e tipos.

Por fim, adicione a seguinte implementação do método onOptionsItemSelected(), lembrando do atalho Ctrl + Shift + O para corrigir as importações.

@Override<br />
public boolean onOptionsItemSelected(MenuItem item) {<br />
	if (item.getItemId() == R.id.anotacao) {<br />
		String mensagem = &quot;Nenhum restaurante selecionado&quot;;</p>
<p>		if (atual != null) {<br />
			mensagem = atual.getAnotacoes();<br />
		}</p>
<p>		Toast.makeText(this, mensagem, Toast.LENGTH_LONG).show();</p>
<p>		return true;<br />
	}</p>
<p>	return super.onOptionsItemSelected(item);<br />
}

Agora, ao cadastrar um restaurante e ir para a listagem, experimente pressionar a tecla menu para ver o que acontece.

Pra quem perdeu alguma parte ou não conseguiu acompanhar, segue a listagem da classe ListaRestaurantes:

package net.rafaeltoledo.restaurante;</p>
<p>import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import net.rafaeltoledo.restaurante.model.Restaurante;<br />
import android.app.TabActivity;<br />
import android.os.Bundle;<br />
import android.view.LayoutInflater;<br />
import android.view.Menu;<br />
import android.view.MenuInflater;<br />
import android.view.MenuItem;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.view.ViewGroup;<br />
import android.widget.AdapterView;<br />
import android.widget.AdapterView.OnItemClickListener;<br />
import android.widget.ArrayAdapter;<br />
import android.widget.Button;<br />
import android.widget.EditText;<br />
import android.widget.ImageView;<br />
import android.widget.ListView;<br />
import android.widget.RadioGroup;<br />
import android.widget.Toast;<br />
import android.widget.TabHost.TabSpec;<br />
import android.widget.TextView;</p>
<p>public class ListaRestaurantes extends TabActivity {</p>
<p>	List&lt;Restaurante&gt; listaRestaurantes = new ArrayList&lt;Restaurante&gt;();<br />
	AdaptadorRestaurante adaptador = null;<br />
	Restaurante atual = null;</p>
<p>	EditText nome = null;<br />
	EditText endereco = null;<br />
	EditText anotacoes = null;<br />
	RadioGroup tipos = null;</p>
<p>	@Override<br />
	public void onCreate(Bundle savedInstanceState) {<br />
		super.onCreate(savedInstanceState);<br />
		setContentView(R.layout.main);</p>
<p>		nome = (EditText) findViewById(R.id.nome);<br />
		endereco = (EditText) findViewById(R.id.end);<br />
		tipos = (RadioGroup) findViewById(R.id.tipos);</p>
<p>		Button salvar = (Button) findViewById(R.id.salvar);<br />
		salvar.setOnClickListener(onSave);</p>
<p>		ListView lista = (ListView) findViewById(R.id.restaurantes);<br />
		adaptador = new AdaptadorRestaurante();<br />
		lista.setAdapter(adaptador);<br />
		lista.setOnItemClickListener(onListClick);</p>
<p>		TabSpec descritor = getTabHost().newTabSpec(&quot;tag1&quot;);<br />
		descritor.setContent(R.id.restaurantes);<br />
		descritor.setIndicator(&quot;Lista&quot;, getResources().getDrawable(R.drawable.lista));<br />
		getTabHost().addTab(descritor);</p>
<p>		descritor = getTabHost().newTabSpec(&quot;tag2&quot;);<br />
		descritor.setContent(R.id.detalhes);<br />
		descritor.setIndicator(&quot;Detalhes&quot;, getResources().getDrawable(R.drawable.restaurante));<br />
		getTabHost().addTab(descritor);</p>
<p>		getTabHost().setCurrentTab(0);<br />
	}</p>
<p>	private OnItemClickListener onListClick = new OnItemClickListener() {<br />
		public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position,<br />
				long id) {<br />
			atual = listaRestaurantes.get(position);<br />
			nome.setText(atual.getNome());<br />
			endereco.setText(atual.getEndereco());<br />
			anotacoes.setText(atual.getAnotacoes());</p>
<p>			if (atual.getTipo().equals(&quot;rodizio&quot;)) {<br />
				tipos.check(R.id.rodizio);<br />
			} else if (atual.getTipo().equals(&quot;fast_food&quot;)) {<br />
				tipos.check(R.id.fast_food);<br />
			} else {<br />
				tipos.check(R.id.a_domicilio);<br />
			}</p>
<p>			getTabHost().setCurrentTab(1);<br />
		}<br />
	};</p>
<p>	private OnClickListener onSave = new OnClickListener() {</p>
<p>		public void onClick(View arg0) {<br />
			atual = new Restaurante();<br />
			EditText nome = (EditText) findViewById(R.id.nome);<br />
			EditText endereco = (EditText) findViewById(R.id.end);<br />
			EditText anotacoes = (EditText) findViewById(R.id.anotacoes);</p>
<p>			atual.setNome(nome.getText().toString());<br />
			atual.setEndereco(endereco.getText().toString());<br />
			atual.setAnotacoes(anotacoes.getText().toString());</p>
<p>			RadioGroup tipos = (RadioGroup) findViewById(R.id.tipos);</p>
<p>			switch (tipos.getCheckedRadioButtonId()) {<br />
			case R.id.rodizio:<br />
				atual.setTipo(&quot;rodizio&quot;);<br />
				break;<br />
			case R.id.fast_food:<br />
				atual.setTipo(&quot;fast_food&quot;);<br />
				break;<br />
			case R.id.a_domicilio:<br />
				atual.setTipo(&quot;a_domicilio&quot;);<br />
				break;<br />
			}</p>
<p>			adaptador.add(atual);<br />
		}<br />
	};</p>
<p>	@Override<br />
	public boolean onCreateOptionsMenu(Menu menu) {<br />
		new MenuInflater(this).inflate(R.menu.opcao, menu);<br />
		return super.onCreateOptionsMenu(menu);<br />
	}</p>
<p>	@Override<br />
	public boolean onOptionsItemSelected(MenuItem item) {<br />
		if (item.getItemId() == R.id.anotacao) {<br />
			String mensagem = &quot;Nenhum restaurante selecionado&quot;;</p>
<p>			if (atual != null) {<br />
				mensagem = atual.getAnotacoes();<br />
			}</p>
<p>			Toast.makeText(this, mensagem, Toast.LENGTH_LONG).show();</p>
<p>			return true;<br />
		}</p>
<p>		return super.onOptionsItemSelected(item);<br />
	}</p>
<p>	class AdaptadorRestaurante extends ArrayAdapter&lt;Restaurante&gt; {<br />
		AdaptadorRestaurante() {<br />
			super(ListaRestaurantes.this, R.layout.linha,<br />
					listaRestaurantes);<br />
		}</p>
<p>		@Override<br />
		public View getView(int position, View convertView, ViewGroup parent) {</p>
<p>			View linha = convertView;<br />
			ArmazenadorRestaurante armazenador = null;</p>
<p>			if (linha == null) {<br />
				LayoutInflater inflater = getLayoutInflater();<br />
				linha = inflater.inflate(R.layout.linha, parent, false);<br />
				armazenador = new ArmazenadorRestaurante(linha);<br />
				linha.setTag(armazenador);<br />
			} else {<br />
				armazenador = (ArmazenadorRestaurante) linha.getTag();<br />
			}</p>
<p>			armazenador.popularFormulario(listaRestaurantes.get(position));</p>
<p>			return linha;<br />
		}<br />
	}</p>
<p>	static class ArmazenadorRestaurante {<br />
		private TextView nome = null;<br />
		private TextView endereco = null;<br />
		private ImageView icone = null;</p>
<p>		ArmazenadorRestaurante(View linha) {<br />
			nome = (TextView) linha.findViewById(R.id.titulo);<br />
			endereco = (TextView) linha.findViewById(R.id.endereco);<br />
			icone = (ImageView) linha.findViewById(R.id.icone);<br />
		}</p>
<p>		void popularFormulario(Restaurante r) {<br />
			nome.setText(r.getNome());<br />
			endereco.setText(r.getEndereco());</p>
<p>			if (r.getTipo().equals(&quot;rodizio&quot;)) {<br />
				icone.setImageResource(R.drawable.rodizio);<br />
			} else if (r.getTipo().equals(&quot;fast_food&quot;)) {<br />
				icone.setImageResource(R.drawable.fast_food);<br />
			} else {<br />
				icone.setImageResource(R.drawable.entrega);<br />
			}<br />
		}<br />
	}<br />
}

E se quiser, pode baixar o projeto aqui.

Até a próxima!