Fiz uma gaveta de navegação funcional, como mostra o tutorial no developer.android.com site . Mas agora, quero usar uma gaveta de navegação, criada no NavigationDrawer.class para várias atividades no meu aplicativo.
Minha pergunta é: se alguém aqui puder fazer um pequeno Tutorial, que explica, como usar uma gaveta de Navegação para várias Atividades.
Eu o li primeiro nesta resposta Android Navigation Drawer on multiple Activities
mas não funcionou no meu projeto
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
Nesta atividade, eu quero ter a gaveta de navegação, então eu estendo 'NavigationDrawer' e, em algumas outras atividades, eu quero usar a mesma gaveta de navegação
public class SampleActivity extends NavigationDrawer {...}
Não sei o que mudar ...
Respostas:
Se você quiser uma gaveta de navegação, use fragmentos. Eu segui este tutorial na semana passada e funciona muito bem:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Você também pode fazer o download do código de amostra deste tutorial, para ver como fazer isso.
Sem fragmentos:
Este é o seu código BaseActivity:
Todas as outras atividades que precisam ter uma gaveta de navegação devem estender esta atividade em vez da própria atividade, exemplo:
XML
Editar:
Eu mesmo tive algumas dificuldades, então aqui está uma solução se você receber NullPointerExceptions. Em BaseActivity, altere a função onCreate para
protected void onCreateDrawer()
. O resto pode permanecer o mesmo. Nas atividades que estendem BaseActivity, coloque o código nesta ordem:Isso me ajudou a resolver meu problema, espero que ajude!
É assim que você pode criar uma gaveta de navegação com várias atividades, se tiver alguma dúvida, não hesite em perguntar.
Edição 2:
Como dito por @GregDan, você
BaseActivity
também pode substituirsetContentView()
e chamar onCreateDrawer lá:fonte
Eu encontrei a melhor implementação. Está no Google I / O 2014 aplicativo .
Eles usam a mesma abordagem que a de Kevin. Se você puder se abstrair de todas as coisas desnecessárias no aplicativo de E / S, poderá extrair tudo o que precisa e é garantido pelo Google que é um uso correto do padrão da gaveta de navegação. Cada atividade opcionalmente tem um
DrawerLayout
como layout principal. A parte interessante é como é feita a navegação para outras telas. É implementado daBaseActivity
seguinte maneira:Isso difere da maneira comum de substituir o fragmento atual por uma transação de fragmento. Mas o usuário não vê diferença visual.
fonte
overridePendingTransitions
.Portanto, esta resposta está atrasada alguns anos, mas alguém pode apreciá-la. O Android nos deu um novo widget que facilita o uso de uma gaveta de navegação com várias atividades.
android.support.design.widget.NavigationView é modular e possui seu próprio layout na pasta de menus. A maneira como você o usa é agrupar layouts de xml da seguinte maneira:
O Layout da raiz é um android.support.v4.widget.DrawerLayout que contém dois filhos: um
<include ... />
para o layout que está sendo agrupado (consulte 2) e um android.support.design.widget.NavigationView.nav_header_main é apenas um LinearLayout com orientação = vertical para o cabeçalho do seu Drawar de navegação.
activity_main_drawer é um xml de menu no diretório res / menu. Pode conter itens e grupos de sua escolha. Se você usar a Galeria AndroidStudio, o assistente fará uma escolha básica para você e você poderá ver quais são suas opções.
O layout da barra de aplicativos agora é agora um android.support.design.widget.CoordinatorLayout e isso inclui dois filhos: um android.support.design.widget.AppBarLayout (que contém uma android.support.v7.widget.Toolbar) e um
<include ... >
for seu conteúdo real (consulte 3).O layout do conteúdo pode ser o layout que você deseja. Esse é o layout que contém o conteúdo principal da atividade (sem incluir a gaveta de navegação ou a barra de aplicativos).
Agora, o mais interessante disso tudo é que você pode agrupar cada atividade nesses dois layouts, mas ter o NavigationView (consulte a etapa 1) sempre apontar para activity_main_drawer (ou o que for). Isso significa que você terá a mesma gaveta de navegação (*) em todas as atividades.
fonte
A maneira mais fácil de reutilizar uma gaveta comum do Navigation entre um grupo de atividades
app_base_layout.xml
AppBaseActivity.java
fonte
AppBaseActivity
e asetContentView
maneira padrão devem funcionar.Para quem quiser fazer o que o pôster original está pedindo, considere usar fragmentos da maneira que Kevin disse. Aqui está um excelente tutorial sobre como fazer isso:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Se você optar por usar atividades em vez de fragmentos, encontrará o problema de a gaveta de navegação ser recriada toda vez que você navegar para uma nova atividade. Isso resulta em uma renderização feia / lenta da gaveta de navegação a cada vez.
fonte
Minha sugestão é: não use atividades, use fragmentos e substitua-os no contêiner (layout linear, por exemplo), onde você mostra seu primeiro fragmento.
O código está disponível nos Tutoriais para desenvolvedores Android, você só precisa personalizar.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
É aconselhável usar cada vez mais fragmentos em seu aplicativo e deve haver apenas quatro atividades básicas locais, mencionadas no AndroidManifest.xml, além das externas (FacebookActivity, por exemplo):
SplashActivity: não usa fragmentos e usa o tema Tela Inteira.
LoginSignUpActivity: Não requer o NavigationDrawer, e também nenhum botão de retorno; basta usar a barra de ferramentas normal, mas serão necessários pelo menos 3 ou 4 fragmentos. Usa o tema sem barra de ação
Atividade HomeActivity ou DashBoard: Usa o tema sem barra de ação. Aqui você precisa da gaveta Navegação, todas as telas a seguir serão fragmentos ou fragmentos aninhados, até a visualização em folha, com a gaveta compartilhada. Todas as configurações, perfil do usuário e etc. estarão aqui como fragmentos nesta atividade. Os fragmentos aqui não serão adicionados à pilha traseira e serão abertos nos itens de menu da gaveta. No caso de fragmentos que exijam o botão Voltar em vez da gaveta, há um quarto tipo de atividade abaixo.
Atividade sem gaveta. Esta atividade tem um botão voltar na parte superior e os fragmentos dentro compartilharão a mesma barra de ação. Esses fragmentos serão adicionados à pilha traseira, pois haverá um histórico de navegação.
[Para obter mais orientações, consulte: https://stackoverflow.com/a/51100507/787399 ]
Feliz codificação !!
fonte
atualize esse código na atividade básica. e não se esqueça de incluir drawer_list_header no seu xml de atividade.
e não use request () em sua atividade. mas a gaveta ainda não está visível ao clicar na imagem .. e arrastando-a ficará visível sem itens da lista. Eu tentei muito, mas sem sucesso. precisa de alguns exercícios para isso ...
fonte
Com a resposta de @Kevin van Mierlo, você também é capaz de implementar várias gavetas. Por exemplo, o menu padrão localizado no lado esquerdo (iniciar) e outro menu opcional, localizado no lado direito, que é mostrado apenas quando fragmentos determinados são carregados.
Eu fui capaz de fazer isso.
fonte
use isso para o seu toolbar.xml
use isso no cabeçalho de navegação se quiser usar
fonte
Eu faço isso no Kotlin assim:
As atividades da gaveta devem herdar isso
BaseAppCompatActivity
, chamarsuper.onCreate
depois que o conteúdo é definido (na verdade, pode ser movido para algum método init) e ter elementos correspondentes para os IDs em seu layoutfonte
Minha resposta é apenas conceitual, sem nenhum código fonte. Pode ser útil para alguns leitores como eu entender.
Depende da sua abordagem inicial de como você arquiteta seu aplicativo. Existem basicamente duas abordagens.
Você cria uma atividade (atividade base) e todas as outras visualizações e telas serão fragmentos. Essa atividade base contém a implementação dos Layouts de gaveta e coordenador. Na verdade, é a minha maneira preferida de fazer, porque ter pequenos fragmentos independentes tornará o desenvolvimento de aplicativos mais fácil e suave.
Se você iniciou o desenvolvimento do aplicativo com atividades, uma para cada tela, provavelmente criará uma atividade básica e todas as outras atividades se estendem a partir dela. A atividade base conterá o código para a implementação da gaveta e do coordenador. Qualquer atividade que precise da implementação da gaveta pode se estender da atividade básica.
Eu pessoalmente preferiria evitar usar fragmentos e atividades misturadas sem nenhuma organização. Isso dificulta o desenvolvimento e, eventualmente, você fica preso. Se você tiver feito isso, refatorar seu código.
fonte
Crie a gaveta de navegação em sua MainActivity usando fragmento.
Inicialize a gaveta de navegação no MainActivity
agora em todas as outras atividades que você deseja usar a mesma gaveta de navegação, coloque DrawerLayout como base e fragmento como gaveta de navegação. Basta definir android: name no seu fragmento apontando para o seu arquivo Java do fragmento. Você não precisará inicializar o fragmento em outras atividades.
Você pode acessar o Nav Drawer deslizando em outras atividades, como no aplicativo Google Play Store
fonte