Tutorial Android – Criando um menu lateral deslizante
Criando menu lateral deslizante no Android
Hoje vamos falar de um componente que está muito na moda em grandes aplicações. Esse componente é o menu lateral deslizante. Você pode encontrá-lo em praticamente todos os aplicativos da Google e em muitos outros.
O assunto é um pouco mais avançado e para a criação de desse menu precisaremos ter conhecimento de alguns componentes do Android. Se você ainda é um novato, seria interessante que desse uma olhada em fragments, listview e animações usando XML.
Acreditando que os tutoriais acima referenciados foram estudados e entendidos, vamos ao que interessa. Criar um menu como esse:
Passo a passo para o menu lateral deslizante
A primeira coisa a ser fazer é criar um listview com as opções que você deseja que apareçam no menu. No nosso caso, criaremos uma listview com um imageview, para nosso ícone, e dois textview, um para o texto que descreve o que é a opção e outro que mostrará a informação de quantos itens foram atualizados naquela aba.
Então crie um arquivo XML de layout chamado drawer_list_item com o seguinte código:
[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/list_selector"
android:paddingBottom="10dp"
android:paddingTop="10dp" >
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/desc_list_item_icon"
android:src="@drawable/ic_home" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@id/icon"
android:gravity="center_vertical"
android:paddingRight="40dp"
android:textColor="@color/list_item_title" />
<TextView
android:id="@+id/counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="8dp"
android:background="@drawable/counter_bg"
android:textColor="@color/counter_text_color" />
</RelativeLayout>
[/sourcecode]
Tendo criado o layout de um item da lista, agora vamos criar o código Java que representa o item e o adapter.
Criamos então duas classes, a NavDrawerItem e NavDrawerListAdapter, respectivamente com os códigos abaixo:
[sourcecode language=”java”]
public class NavDrawerItem {
private String title;
private int icon;
private String count = "0";
// boolean to set visiblity of the counter
private boolean isCounterVisible = false;
public NavDrawerItem(){}
public NavDrawerItem(String title, int icon){
this.title = title;
this.icon = icon;
}
public NavDrawerItem(String title, int icon, boolean isCounterVisible, String count){
this.title = title;
this.icon = icon;
this.isCounterVisible = isCounterVisible;
this.count = count;
}
public String getTitle(){
return this.title;
}
public int getIcon(){
return this.icon;
}
public String getCount(){
return this.count;
}
public boolean getCounterVisibility(){
return this.isCounterVisible;
}
public void setTitle(String title){
this.title = title;
}
public void setIcon(int icon){
this.icon = icon;
}
public void setCount(String count){
this.count = count;
}
public void setCounterVisibility(boolean isCounterVisible){
this.isCounterVisible = isCounterVisible;
}
}
[/sourcecode]
[sourcecode language=”java”]
public class NavDrawerListAdapter extends BaseAdapter
{
private Context context;
private ArrayList<NavDrawerItem> navDrawerItems;
public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){
this.context = context;
this.navDrawerItems = navDrawerItems;
}
@Override
public int getCount() {
return navDrawerItems.size();
}
@Override
public Object getItem(int position) {
return navDrawerItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.drawer_list_item, null);
}
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
TextView txtCount = (TextView) convertView.findViewById(R.id.counter);
imgIcon.setImageResource(navDrawerItems.get(position).getIcon());
txtTitle.setText(navDrawerItems.get(position).getTitle());
// displaying count
// check whether it set visible or not
if(navDrawerItems.get(position).getCounterVisibility()){
txtCount.setText(navDrawerItems.get(position).getCount());
}else{
// hide the counter view
txtCount.setVisibility(View.GONE);
}
return convertView;
}
}
[/sourcecode]
Vamos agora criar a classe principal que irá agrupar tudo isso e transformá-los em um menu.
Crie uma activity vazia, de preferência com nome de MainActivity e no XML responsável pelo layout insira o seguinte código:
[sourcecode language=”xml”]
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.uguideufopalfa.MainActivity" >
<!– Framelayout to display Fragments –>
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!– Listview to display slider menu –>
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#f6f6f6"
android:choiceMode="singleChoice"
android:divider="#2d2b28"
android:dividerHeight="1dp" />
</android.support.v4.widget.DrawerLayout>
[/sourcecode]
Voltando à activity, vamos criar uma pequena classe privada, dentro da própria classe da Activity, com o seguinte código:
[sourcecode language=”java”]
private class SlideMenuClickListener implements ListView.OnItemClickListener
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
// display view for selected nav drawer item
displayView(position);
}
}
[/sourcecode]
Essa classe serve para acionarmos os eventos de clique no menu.
Insira abaixo dessa classe o seguinte código, que será responsável por resolver e direcionar para qual fragmento a tela deverá ser redirecionada.
[sourcecode language=”java”]
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position)
{
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new MenuFragment();
break;
case 2:
fragment = new NewsFragment();
break;
case 3:
fragment = new EventsFragment();
break;
case 4:
fragment = new PlacesFragment();
break;
case 5:
fragment = new AdsFragment();
break;
default:
break;
}
if (fragment != null)
{
FragmentManager fragmentManager = getFragmentManager();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
{
fragmentManager.beginTransaction()
.setCustomAnimations(R.anim.fadein, R.anim.fadeout, R.anim.fadein, R.anim.fadeout)
.replace(R.id.frame_container, fragment).commit();
}
else
{
fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
}
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
else
{
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
[/sourcecode]
Para finalizar a activity, inserimos o seguinte código:
[sourcecode language=”java”]
public class MainActivity extends Activity
{
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
private static boolean alreadyOpen = false;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
// What’s hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
// Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(), navDrawerItems);
mDrawerList.setAdapter(adapter);
if (savedInstanceState == null)
{
// on first time display view for first nav item
displayView(0);
}
}
@Override
protected void onResume()
{
super.onResume();
Log.i("Already Open", "" + alreadyOpen);
if(!alreadyOpen)
{
mDrawerLayout.openDrawer(mDrawerList);
Handler h = new Handler();
h.postDelayed(new Runnable()
{
@Override
public void run()
{
mDrawerLayout.closeDrawer(mDrawerList);
}
}, 2000);
alreadyOpen = true;
}
}
[/sourcecode]
Vocês podem perceber que meu menu contêm seis opções, sendo assim preciso de seis fragmentos.
O construtor de NavDrawerItem aceita dois tipos diferentes de entrada. Em uma são passados somente o texto que será inserido no menu e o ícone do mesmo. A segunda opção, um pouco maior, recebe o texto, o ícone, a opção de acionar ou não o contador (true ou false) e o valor que será passado ao contador. Lembrando que esse contador é o lugar onde é mostrado quantos itens foram atualizados naquela seção.
No método onResume, criei um código que abrirá o menu na primeira vez que o usuário entrar na aplicação, para que o mesmo possa saber que a funcionalidade existe.
Provavelmente alguns erros ainda aparecerão citando a falta de alguns arquivos XML. Os arquivos que faltam são os arquivos para animação do menu. Também faltará algumas strings a serem inseridas no arquivo strings.xml.
Vamos fazer isso agora.
Crie dois arquivos XML com os nome fadein.xml e fadeout.xml e os insira na pasta anim que está dentro da pasta res. Caso a pasta anim não exista, crie a mesma.
No arquivo fadein, insira esse código:
[sourcecode language=”java”]
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="alpha"
android:valueFrom="0.0"
android:valueTo="1" />
[/sourcecode]
Para o arquivo fadeout vai esse código:
[sourcecode language=”java”]
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0.0" />
[/sourcecode]
Para finalizar vamos ao nosso arquivo strings.xml e vamos inserir o seguinte:
[sourcecode language=”xml”]
<string-array name="nav_drawer_items">
<item>Home</item>
<item>Cardápio</item>
<item>Notícias</item>
<item>Eventos</item>
<item>Locais</item>
<item>Anúncios</item>
</string-array>
<array name="nav_drawer_icons">
<item>@drawable/ic_home</item>
<item>@drawable/ic_menu</item>
<item>@drawable/ic_news</item>
<item>@drawable/ic_events</item>
<item>@drawable/ic_places</item>
<item>@drawable/ic_ads</item>
</array>
[/sourcecode]
No string-array ficará o nome dos itens que você vai colocar no menu. Já no array ficará o caminho para os ícones do menu.
Temos agora o nosso menu deslizante funcionando perfeitamente.
Não é uma tarefa das mais fáceis para quem não conhece nada ainda de programação para Android, mas para quem já tem um conhecimento básico, vai conseguir tirar de letra tudo isso.
Lembrando que todas as suas telas agora serão fragments e o menu será sua activity. Então, como falei no ínicio, um conhecimentos sobre fragments também é importante para dar continuidade ao seu projeto.
Qualquer dúvida, deixe nos comentários.
(Atualização: Para quem está pedindo o código ou quer saber mais, fiz um novo post sobre o menu lateral. Está tudo aqui: http://www2.decom.ufop.br/imobilis/crie-um-menu-lateral-com-navigationview/)





Obrigado pelo tutorial foi muito util.
Poderia me enviar o fonte
Parabéns, ótimo conteúdo.
Tem como disponibilizar o fonte completo?
Tem sim. Mandarei a implementação do menu para seu e-mail.
Oi. Mande pro meu tambem.
Obrigado
Oi. Mande no meu e-mail tambem.
Obrigado
Olá, poderia por favor me enviar o fonte completo por favor.
Obrigado.
Ola. Mande no meu e-mail tambem por favor.
Obrigado
Tem como mandar o código fonte desse menu para meu email?
Post muito bom! Você também poderia mandar o fonte completo p/ o meu e-mail?
Show de bola o tuto. Estou cometendo algum erro acho que no Main. Poderia me enviar o projeto? Grato.
boas pode me enviar tambem o conteudo completo por favor
ola muito bom seu tutorial, infelizmente estou com alguns problemas na implementação, poderia disponibilizar o código fonte? desde ja grato
Ola, iremos mandar para seu email!
Gostaria que me enviasse também, obrigado!
Rafael, vc ainda tem esse projeto? se tiver me envia por favor moc.liamgnull@oriehnipahnytaf
Muito Obrigada! =)
Amigo, estou com problemas para implemetar este tipo de menu para phones e tablet.
Gostaria que no Tablet o menu ficasse estatico , contendo os itens ao lado . Pode me ajudar?
Adriano, não entendi bem a sua dúvida. Entre em contato comigo por e-mail para conversarmos melhor.
moc.liamgnull@avliseppilefw
Cara gostei muito desse tutorial mas não consegui implementar tem como me enviar por email pra eu continuar meu estudo?
Oi Felippe, td b ?
Tem como enviar uma cópia do projeto:
Tutorial Android – Criando Um Menu Lateral Deslizante”
pra mim também ?
Legal o Post ! ob. t’+…
Cara muito bom o artigo foi muito claro, eu precisava dar uma olhada no fonte pode me enviar por favor? eu to com um projeto parado porque estou com dificuldade para poder implementar fragments…. me da uma ajuda por favor obrigado
Poderia encaminhar no meu e-mail o fonte? obrigado.
Boa noite. Primeiramente parabéns pelo artigo. Compreendi mas estou fazendo algo errado. Poderia me enviar também o fonte para estudo? Obrigada.
Olá, você poderia também me enviar o código fonte completo?
Agradeceria muito.
Boa tarde Willian, muito bom o tutoril, muito bem explicado, fácil e objetivo.
Testei aqui em meu pc e não rodou, tem como me disponibilizar o seu código?
Vlw
Olá boa noite, poderia enviar seu código fonte para meu e-mail por favor. Muito bom seu tutorial. Excelente!
Ótimo conteúdo, parabéns!
Poderia disponibilizar o mesmo no meu email ?
Obrigado!
Boa noite!
Muito SHOW!
Poderia enviar o codigo fonte ?
Obrigado!
Tutorial muito bacana. Poderia enviar o código fonte?
Obrigado.
Ótimo tutorial parabéns, infelizmente no decorre da criação apareceu uns erros que não consegui resolver, agradeceria muito se você enviasse para mim o código fonte se possível.
Otimo tutorial, mas aqui no meu deu alguns erros, tem como enviar o fonte ? Obrigado!
Boa tarde!
Muito bom!
poderia também me passar o projeto? estou com alguns problemas…
Obrigado!!
Olá Felippe!
Parabéns pelo material!
tem como me mandar o projeto. Pois tem alguns itens que estão dando erro pra mim!
Aguardo e obrigado!
Bom dia Willian! Parabéns pelo seu tutorial.
Como sou iniciante nessa área, estou com algumas dificuldades, será que poderia disponibilizar esse projeto se ainda tiver é claro….rsrs…vlw…abs.
Por gentileza, poderia disponibilizar o codigo fonte completo?
Obrigado.
Bom Dia, poderia me disponibilizar o projeto completo por favor ?
Poderia disponibilizar o código fonte? Obrigado
ola…muito bom tutorial, estou iniciando estudos em android. Poderia disponibilizar o fonte pra estudo?
desde ja agradeço.
Amigo.
Faz o favor de enviar o projeto completo pra mim também por favor? Estou precisando implementar este tipo de menu, mas infelizmente não estou conseguindo.
Obrigado!
Prezado William Felippe, disponibiliza o download do projeto completo ( xml, activity, casses…), pra gente?
Abraço,
Parabéns pelo conteúdo.
Prezado William Felippe,
Estou iniciando os estudos em Android, e se possível, por favor me envie o projeto completo. Assim, poderei estudar o código.
Parabéns pela iniciativa
Infelizmente eu não tenho mais esse código. Fiz esse tutorial ainda na faculdade, mas como vi que tinha muita gente ainda acessando a postagem, eu fiz um novo tutorial, usando os novos conceitos de programação para Android. Dê uma olhada aqui.
Parabéns, William! Funcional e bem prático.
Tenho uma duvida.
É possível alterar para que o menu deslize de parte de baixo para cima (footer)?
Seria outro recurso?
Abraço
Muito bom o tutorial, poderia disponibilizar o fonte por email?
Muito bom o tutorial, poderia disponibilizar o fonte por email?
Olá. O meu projeto está compilando com erro. Não sei o que eu tenho que fazer. Não achei solução na internet; olhe . O erro é esse:
Error 1 Unknown type ‘SlideView’ in XML namespace ‘clr-namespace:SlideView.Library;assembly=SlideView.Library’ t
Ola, muito bom conteudo.
Você poderia enviar o fonte para o meu e-mail ?
Olá! Poderia fazer a gentileza de me enviar por e-mail? Obrigada!
Opa William! Tudo bem! Estou tentando desenvolver o menu seguindo seu tutorial! Será que poderia me enviar o projeto ou pelo menos as imagens?
Muito obrigado!
ola excelente post porem estou com problemas na implementação do mesmo poderia enviar o código fonte para meu e-mail
Tem como mandar o projeto completo do menu deslizante para o meu email.
Grato
Salustiano
Você poderia enviar para o meu e-mail também?
Obrigado
Poderia me mandar o projeto completo?
olá,
teria como disponibilizar o fonte do menu?
Ficou excelente o tutorial. parabéns.
podes me enviar por email o source, encontrei algumas dificuldades ao implementar no android studio
obrigado
Parabéns pela explicação. Poderia enviar para mim também ?
Boa tarde, poderia me mandar o código para análise.
Desde já agradeço.
Obrigado
Ola Diogo, você recebeu o fonte ? poderia mandar pra mim, por favor.
Olá, podes me enviar o source também?
Parabéns desde já, ótima explicação.
Ótimo tutorial Willian, muito bem escrito. Você poderia me enviar o source?
Muito obrigado
Boa tarde, gostei do seu tutorial, poderia me enviar o source do projeto também?
Desde já agradeço
Alguém pode me enviar esses arquivos também?
moc.liamgnull@sdmsahtanohj
Muito bom o tutorial, teria como me enviar o projeto no meu e-mail? Obrigado!
Boa noite, gostei do tuto…teria como mandar os arquivos usando pra mim também por favor…ou os fontes também se possível, desde já, já agradeço….
moc.liamgnull@sdmsahtanohj
Bom dia!
Teria como disponibilizar o codigo fonte no meu email?
Desde já agradeço!
Leonardo
Boa tarde,
Muito bom o tutorial. Poderia por favor me enviar por e-mail o código fonte?
Obrigado,
Guilherme.
Boa noite!
Obrigado por compartilhar seu conhecimento, poderia enviar código fonte via e-mail?
Obrigado.
Olá, pode me enviar o código fonte também? Algo não está funcionando aqui…
Olá, pode me enviar o código fonte também? Não estou conseguindo aqui…
Boa noite!
Obrigado por compartilhar seu conhecimento, poderia enviar código fonte via e-mail?
Obrigado.
Olá, ótimo tutorial, no meu deu uns probleminhas, queria comparar com o seu, poderia me enviar o fonte do projeto.
Desde já agradeço.
Obrigado
Boa noite!
poderia me enviar o codigo por email por favor?!
Obrigado!
Boa noite!
poderia me enviar o codigo por email por favor?!
Obrigado
Ola, poderia me mandar o codigo fonte completo por email por favor, esta apresentando um errinhos e nao consigo resolver. valeuu
Otimo tutorial cara, mas no meu projeto apresentou alguns probleminhas que nao sei resolver, seria possivel se vc me enviasse o source completo ?
Obrigado
gostei!!!
me envia o codigo tambem
moc.liamtohnull@seraosnaved
Olá, poderia me enviar o código fonte completo por email por favor! =)
Pode me enviar o codigo completo para o meu email? para poder testar melhor, esta dando alguns erros
Olá , tem como enviar para o meu e-mail o codigo completo .
Muito obrigado.
Muito Show, poderia enviar para meu email. Obrigado.
Achei muito boa a explicação, teria como enviar o projeto para avaliar alguns aspectos. Obrigado.
Muito boa sua didática. Pode me enviar a implentação do menu para meu email. Obrigado.
Infelizmente eu não tenho mais esse código. Fiz esse tutorial ainda na faculdade, mas como vi que tinha muita gente ainda acessando a postagem, eu fiz um novo tutorial, usando os novos conceitos de programação para Android. Dê uma olhada aqui.
Alguem poderia por favor enviar este projeto para o meu email.
moc.liamgnull@58nosrevelc
Obrigado
Também gostaria do código.
moc.liamtohnull@olledrologaiht
Mano parabéns pelo tutorial. Infelizmente não consegui implementar, apresentou alguns erros. Se for possível me envia o código completo pra eu verificar onde eu errei. Grato, fica em paz.
Infelizmente eu não tenho mais esse código. Fiz esse tutorial ainda na faculdade, mas como vi que tinha muita gente ainda acessando a postagem, eu fiz um novo tutorial, usando os novos conceitos de programação para Android. Dê uma olhada aqui.
Ola bom dia. muito bom o tutorial, parabens pela iniciativa, é muito util pra quem estar iniciando na prorgamação android, ja sou programador delphi e estou migrando de plataforma, gostaria de saber se tem como me enviar os fontes.
Grato.
moc.evilnull@oigres.otnilo
Olá Olinto. Infelizmente eu não tenho mais esse código. Fiz esse tutorial ainda na faculdade, mas como vi que tinha muita gente ainda acessando a postagem, eu fiz um novo tutorial, usando os novos conceitos de programação para Android. Dê uma olhada aqui. Boa sorte nessa sua nova etapa.
Ótimo conteúdo, poderia me mandar completo?
Eai willian. muito bom material!
Teria como me mandar o código fonte por email ?
Minha implementação não tá ok 🙁
tulio.fdv@gm
Alguém me envia o projeto também
moc.liamgnull@0077rotkiv
Desde já, Obrigado!
Olá, você poderia me enviar o código-fonte completo para meu e-mail? não estou conseguindo resolver uns erros que está aparecendo.
Desde já, muito obrigado.
bom dia, gostei do tutorial, você poderia me enviar o arquivo fonte para meu e-mail. obrigado.
Teria como você forneçer o codigo fonte completo?