usuario usar studio medium interfaz example desde crear como cero android navigation-drawer android-toolbar

usar - ¿Cómo reemplazar el icono de hamburguesa utilizado para ActionBarToggle en la barra de herramientas de Android con un dibujo personalizado?



navigation drawer material design android (11)

Así es como pude finalmente hacer que el mío funcione.

private Toolbar toolbar; toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.drawable.ic_drawer); 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); } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerToggle.syncState(); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Resultó ser el

mDrawerToggle.syncState();

Eso finalmente consiguió que todo funcionara.

He implementado un ActionBarDrawerToggle básico utilizando la nueva barra de herramientas en Android 5.0.

Sin embargo, no puedo averiguar cómo cambiar el ícono de hamburguesa predeterminado que se suministra. En la documentación de Android se dice que "la Actividad dada se vinculará al DrawerLayout especificado y que el icono de navegación de la barra de herramientas se configurará en un dibujable personalizado ... Este dibujo muestra un icono de Hamburguesa cuando el cajón está cerrado y una flecha cuando está abierto. . Se anima entre estos dos estados a medida que se abre el cajón ".

Actualmente tengo todo esto funcionando correctamente con el siguiente código, sin embargo, quiero reemplazar la hamburguesa suministrada por defecto con mi propio dibujo.

Aquí está mi código actual:

MainActivity.java

@InjectView(R.id.main_activity_toolbar) Toolbar mToolbar; @InjectView(R.id.main_activity_drawer_layout) DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.main_activity); super.onCreate(savedInstanceState); setSupportActionBar(mToolbar); mToolbar.setNavigationIcon(R.drawable.navigation); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Esta línea:

mToolbar.setNavigationIcon(R.drawable.navigation);

no parece funcionar

¿Es posible hacer esto? ¡Gracias!

Documentación de ActionBarToggle: https://developer.android.com/reference/android/support/v7/app/ActionBarDrawerToggle.html


Creo que se recomienda poner la llamada a syncState() en el método de ciclo de vida onPostCreate(...) .

@Override public void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); }


El menú predeterminado que se puede dibujar para ActionBarDrawerToggle es DrawerArrowDrawable.

Puedes subclasificar esto para agregar funcionalidad personalizada, como insignias, así:

public class BadgedDrawerArrowDrawable extends DrawerArrowDrawable { /** * @param context used to get the configuration for the drawable from */ public BadgedDrawerArrowDrawable(Context context) { super(context); setColor(context.getResources().getColor(R.color.colorAccent)); } @Override public void draw(Canvas canvas) { super.draw(canvas); Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); paint.setTextSize(60); canvas.drawText("!", canvas.getWidth() - 60, 25, paint); } }

Uso:

actionBarDrawerToggle.setDrawerArrowDrawable(new BadgedDrawerArrowDrawable(activity));


En cuanto a la biblioteca de soporte de v7, puede crear su propia representación de DrawerArrowDrawable.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { public void onDrawerClosed(View view) { supportInvalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { supportInvalidateOptionsMenu(); } }; mDrawerToggle.setDrawerIndicatorEnabled(true); DrawerArrowDrawable drawerArrowDrawable = new DrawerArrowDrawable(this); drawerArrowDrawable.setAlpha(1); drawerArrowDrawable.setSpinEnabled(false); drawerArrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_LEFT); drawerArrowDrawable.setColor(Color.BLACK); mDrawerToggle.setDrawerArrowDrawable(drawerArrowDrawable);


Estas dos líneas de código funcionan para mí:

mDrawerToggle.setDrawerIndicatorEnabled(false); //disable "hamburger to arrow" drawable mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); //set your own

Y luego llama a esto:

mDrawerToggle.syncState();



Lo que funcionó para mí es que solo necesitaba llamar a toolbar.setNavigationIcon(R.drawable.ic_camera_alt_24dp); al final de onCreate, o al menos después de mDrawerToggle = new ActionBarDrawerToggle...


Mi solución es la subclasificación de ActionBarDrawerToggle.

public class MyActionBarDrawerToggle extends android.support.v7.app.ActionBarDrawerToggle { public MyActionBarDrawerToggle(Activity activity, final DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); setHomeAsUpIndicator(R.drawable.drawer_toggle); setDrawerIndicatorEnabled(false); setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View view) { drawerLayout.openDrawer(Gravity.LEFT); } }); } }


Puede usar la barra de herramientas como modo Stand Alone, lo que significa que no debe usar su barra de herramientas como parte de su constructor ActionBarDrawerToggle , puede lograrlo utilizando el siguiente código:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, null, R.drawable.appbar, R.drawable.appbar)

(Tenga en cuenta que la instancia de la barra de herramientas no se envía al constructor ActionBarDrawerToggle)

Además, debes inflar tu menú manualmente.

mToolbar = (Toolbar) findViewById(R.id.nav_toolbar); mToolbar.inflateMenu(R.menu.base);

Y elimine el setSupportActionBar (mToolbar); línea de código.

Por supuesto, tendrás que manejar el clic de navegación por ti mismo:

mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener() ...

Entonces, puedes abrir tu cajón así:

drawerButton = (BadgeDrawerButton) findViewById(R.id.badge_drawer_button); drawerButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { mDrawerLayout.openDrawer(Gravity.LEFT); } });

Espero que esto pueda ayudar.


a partir de enero de 2018, esta es una solución funcional (al menos para mí):

//setSupportActionBar(toolbar) val toggle = ActionBarDrawerToggle(this, drawer_layout, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close) toolbar.inflateMenu(R.menu.menu_main) toolbar.setNavigationIcon(R.drawable.ic_menu) toolbar.setNavigationOnClickListener { drawer_layout.openDrawer(Gravity.START) } toolbar.setOnMenuItemClickListener { true } drawer_layout.addDrawerListener(toggle) toggle.syncState() nav_view.setNavigationItemSelectedListener(this)

cosas para cuidar:

  • setSupportActionBar debe ser comentado
  • ActionBarDrawerToggle no está tomando una referencia a la toolbar de toolbar
  • Debemos inflar el menú nosotros mismos, y manejar onClicks. onCreateOptionsMenu y onOptionsItemSelected no funcionarán.
  • No olvides llamar a toggle.syncState()

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); toolbar.setNavigationIcon(R.drawable.ic_action_name);