Estou implementando a gaveta de navegação estilo pirulito com a biblioteca de suporte appcompat mais recente, mas o problema é que o ícone de hambúrguer nunca é exibido. Apenas o ícone de volta é mostrado.
Este é o meu código de atividade
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.View;
public class Home extends ActionBarActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initViews();
}
private void initViews(){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));
setSupportActionBar(toolbar);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar , R.string.drawer_open, R.string.drawer_close) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
//getActionBar().setTitle(mTitle);
//invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
//getActionBar().setTitle(mDrawerTitle);
//invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
}
Este é o meu arquivo de estilos
<resources>
<!-- Application theme. -->
<style name="Theme.Test" parent="@style/Theme.AppCompat.Light">
<!-- customize the color palette -->
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="windowActionBar">false</item>
<item name="drawerArrowStyle">@style/Theme.Test.DrawerArrowStyle</item>
</style>
<style name="Theme.Test.DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item>
</style>
O arquivo de layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/toolbar">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>
Em ambos os casos, apenas a seta para trás é mostrada, eu li muitos posts, mas nada parece fazer diferença. Qualquer ajuda seria apreciada.
ActionBarDrawerToggle
mDrawerToggl.syncState()
? Na verdade, estou mostrando a gaveta de navegação como uma sobreposição na barra de ferramentas, então a animação não é necessária no meu caso.Certifique-se de que você está importando a chave de gaveta correta.
Quando importei a versão v4 tinha a seta (abaixo).
Mudar para este (abaixo, v7) corrigiu meu problema.
fonte
Certifique-se de ligar
mDrawerToggle.syncState();
DEPOIS de ligar
fonte
Ao usar o ActionBarDrawerToggle, você deve chamá-lo durante onPostCreate () e onConfigurationChanged ()
fonte
onOptionsItemSelected
também.Como meu NavigationDrawer estava estendendo um Fragment, não uma Activity, não consegui substituir postCreate. A seguir está o que eu fiz.
Espero que ajude!
fonte
Não se esqueça de sobrescrever o método onOptionsItemSelected e verificar se ctionBarDrawerToggle foi clicado, neste caso retorne verdadeiro caso contrário a atividade será finalizada.
fonte
return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
Você pode simplesmente usar isto:
fonte
Ao incluir ActionBarDrawerToggle, certifique-se de usar o método post:
fonte
setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)
que forçava o ícone que era fingido ao alternar entre os fragmentos. Mas depois de ser atualizado para o novo ícone de hambúrguer animado, isso não resolve.mDrawerToggle.syncState()
não funcionou para mim, mas eventualmente consegui trabalhar com:Eu, no entanto, não estava usando uma barra de ferramentas.
fonte
Eu também tive um problema semelhante, no meu caso o problema foi, ao iniciar o actionbartoggle, eu não estava passando um argumento válido da barra de ferramentas (a barra de ferramentas foi inicializada mais tarde), sem uma barra de ferramentas adequada, não nula, o ActionBarToggle não criaria um ícone de hambúrguer.
fonte
você pode chamar syncState () do onPostCreate de sua Activity para sincronizar o indicador com o estado do DrawerLayout vinculado depois que onRestoreInstanceState ocorreu.
Além disso, ActionBarDrawerToggle pode ser usado diretamente como DrawerLayout.DrawerListener ou, se você já estiver fornecendo seu próprio ouvinte, chame cada um dos seus próprios métodos de ouvinte.
fonte
A gaveta de navegação não era exibida ao clicar no menu da barra de ação. Isso consertou para mim.
fonte
Isso funciona para mim. Estendi AppCompatActivity em vez de ActionBarActivity.
fonte