J'implémente le tiroir de navigation de style Lollipop avec la dernière bibliothèque de support appcompat, mais le problème est que l'icône hamburger n'est jamais affichée. Seule l'icône de retour est affichée.
Ceci est mon code d'activité
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);
}
}
Ceci est mon fichier de styles
<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>
Le fichier de mise en page
<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>
Dans les deux cas, seule la flèche arrière est affichée. J'ai lu de nombreux articles mais rien ne semble faire la différence. Toute aide serait appréciée.
Vous devez appeler
mDrawerToggle.syncState();
Assurez-vous que vous importez le sélecteur de tiroir approprié.
Lorsque j'ai importé la version v4, j'avais la flèche (ci-dessous).
import Android.support.v4.app.ActionBarDrawerToggle;
Le changer pour ceci (ci-dessous, v7) corrige mon problème.
import Android.support.v7.app.ActionBarDrawerToggle;
Lorsque vous utilisez ActionBarDrawerToggle, vous devez l’appeler pendant onPostCreate () et onConfigurationChanged ().
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
Puisque mon NavigationDrawer était en train d’étendre un fragment et non une activité, je n’ai pas pu remplacer postCreate. Le dessous est ce que j'ai fait.
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true); // this sets the button to the back icon
actionBar.setHomeButtonEnabled(true); // makes it clickable
actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);// set your own icon
J'espère que ça aide!
N'oubliez pas de remplacer la méthode onOptionsItemSelected et de vérifier si ctionBarDrawerToggle a été cliqué, dans ce cas, renvoyez la valeur true sinon l'activité sera terminée.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
Vous pouvez simplement utiliser ceci:
// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
getActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer);
}
});
mDrawerToggle.syncState()
n'a pas fonctionné pour moi, mais j'ai fini par le faire fonctionner avec:
getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger_icon);
Cependant, je n'utilisais pas de barre d'outils.
Lorsque vous incluez ActionBarDrawerToggle, veillez à utiliser la méthode post:
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
vous pouvez appeler syncState () à partir de onPostCreate de votre activité pour synchroniser l'indicateur avec l'état du DrawerLayout lié après que onRestoreInstanceState s'est produit.
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
ActionBarDrawerToggle peut également être utilisé directement en tant que DrawerLayout.DrawerListener ou, si vous fournissez déjà votre propre écouteur, appelez chacune des méthodes d'écoute à partir de la vôtre.
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
.
.
.
.
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
J'ai également eu un problème similaire, dans mon cas, le problème était Lors du lancement de actionbartoggle, Je ne transmettais pas un argument de barre d'outils valide (la barre d'outils était initialisée ultérieurement). échouer pour créer une icône de hamburger.
actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar,
R.string.drawer_open, R.string.drawer_close);
Le tiroir de navigation ne s'affiche pas lorsque vous cliquez sur le menu de la barre d'actions. Cela a résolu le problème pour moi.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
//add your switch statement
return super.onOptionsItemSelected(item);
}
Cela fonctionne pour moi. J'ai étendu AppCompatActivity au lieu d'ActionBarActivity.
mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,null, R.string.drawer_opened, R.string.drawer_closed) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if( getSupportActionBar()!= null)
getSupportActionBar().setTitle(R.string.drawer_opened);
mActionBarDrawerToggle.syncState();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if(getSupportActionBar() != null)
getSupportActionBar().setTitle(R.string.drawer_closed);
mActionBarDrawerToggle.syncState();
}
};