android - Como criar uma classe com um NavigationDrawer para usar em várias Activities? - Stack Overflow em Português
Comecei a estudar desenvolvimento Android a pouco tempo, vi que para usar um NavigationDrawer o recomendável é usar fragmentos para alterar um FrameLayout na Activity principal, porém nas novas activities que criar, não queria ter que colocar todo o código do NavigationDrawer novamente, queria saber como criar um menu para usar em qualquer uma.
Alguém tem alguma dica para me passar?
public class MainActivity extends GenericActivity {
public class GenericActivity extends AppCompatActivity {
protected boolean drawerLayoutEnable;
protected void setUpDrawerLayout(){
this.drawerLayoutEnable = true;
if(toolbar !=null){
setUpDrawerToggle();
navigationView.setNavigationItemSelectedListener((NavigationView.OnNavigationItemSelectedListener) this);
private void setUpDrawerToggle(){
activity_generic.xml
android:id="@+id/activity_base"
tools:context="com.example.rafael.elite.BaseActivity">
android:id="@+id/drawer_layout" //Seria este o drawer_layout que eu tenho que referenciar?
app:menu="@menu/menu_generic_activity" />
editada 19/11/17 às 14:47
41011 medalhas de ouro55 medalhas de prata1313 medalhas de bronze
Dá uma olhada nessa resposta do SO: stackoverflow.com/a/19451842/5165061 – Dener 15/12/15 às 13:15
Bom, isso foi uma dúvida que eu me deparei quando decidi implementar o NavigationDrawer também no meu app, principalmente porque eu gostaria de ter activities em que eu utilizasse ele e outras activities que eu não utilizasse ele. E principalmente, não queria sair duplicando código pelas classes, então após pesquisar em diversos tutoriais eu adaptei e cheguei a esse resultado abaixo, de forma resumida porém você entenderá o conceito.
Criei uma GenericActivity onde todas as demais activities do meu aplicativo irão extendê-la:
public abstract class GenericActivity extends AppCompatActivity {
protected ActionBarDrawerToggle drawerToggle;
protected NavigationViewMenuHandler navigationMenuHandler;
//Com essa variável eu valido se a activity possui o NavigationDrawer
//para realizar determinadas ações, ou não.
//esse método é chamado pelas activities que extendem esta classe
//e desejam ter um NavigationDrawer.
protected void setUpDrawerLayout() {
//Toda a lógica de criação do NavigationDrawer vai neste método
//Atualize com suas regras caso necessário
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black_36dp);
setUpDrawerToggle(); //configura o DrawerToggle
setUpNavigationView(); //configura a NavigationView
//Métodos private setUpDrawerToggle() e setUpNavigationView()
Agora todas activities do meu aplicativo que desejam ter o mesmo NavigationDrawer configurado extendem GenericActivity e apenas chamam o método setUpDrawerLayout() no onCreate().
public class AppFootActivity extends GenericActivity {
setContentView(R.layout.app_activity);
//Chamo a configuração do NavigationDrawer. Caso eu não queira que
//minha activity tenha um, basta não chamá-lo.
//Demais códigos da activity
Esta mesma lógica pode ser aplicada em outros componentes como a ToolBar.
Levei em consideração que você já conhece como implementar o NavigationDrawer e tem apenas a dúvida de como fazê-lo em várias activities.
respondida 15/12/15 às 15:08
Julio, muito obrigado, estou seguindo sua resposta porém estou com um problema. Quando tento rodar o app, recebo o seguinte erro: java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.rafael.testenavigationdrawer/br.com.rafael.testenavigationdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.widget.DrawerLayout.setDrawerListener(android.support.v4.widget.DrawerLayout$DrawerListener)' on a null object reference O erro acontece quando chamo o método SetupDrawerToggle() Editei a pergunta e coloquei meus arquivos – Rafael 15/12/15 às 19:23
Pelo que eu pude perceber o seu drawerLayout está nulo no hora que ele vai chamar o método drawerLayout.toggle(). Você implementou o xml contendo o DrawerLayout? Note no código que ele chama findViewById(R.id.drawer_layout) tentando encontrar a view com este id. – Julio Henrique Bitencourt 15/12/15 às 20:17
Acho que estou implementando o correto, adicionei o xml da GenericActivity, se possível dá uma olhada e me diz o que acha. – Rafael 15/12/15 às 22:19
Altera o seu xml deixando o DrawerLayout como view principal. Deixando <DrawerLayout> <AppBarLayout><Toolbar/></AppBarLayout> <NavigationView/> </DrawerLayout>. – Julio Henrique Bitencourt 15/12/15 às 23:23
Consegui, só esqueci de postar a resposta, o problema da NullPointerExcption era que eu tinha definido o drawer e a toolbar no arquivo xml da classe GenericActiviy, só depois percebi que ela não deve ter o arquivo e que a toolbar e o drawer devem ser definidos no xml da Activity que extende a classe GenericActivity. Agora a única questão, como fazer para que quando eu clicar no item do navigation drawer correspondente a activity em que eu estou, ela não seja recarregada mas somente feche o navigationDrawer? – Rafael 18/12/15 às 13:08