Barre d'outils AppCompat v7 Up / Back Arrow ne fonctionne pas

J'ai deux fragments dans une activité. Lorsque le fragment A s'affiche, je souhaite que l'icône du burger de desserte de navigation s'affiche et que le tiroir de navigation fonctionne. Lorsque le fragment B s'affiche, je souhaite que la flèche arrière s'affiche et lorsqu'elle est cliquée, faites une navigation vers le haut. Cependant, je n'arrive pas à obtenir la nouvelle barre d'outils AppCompat v7 pour afficher la flèche vers le haut dans mon ActionBarActivity, sauf si le tiroir nav est ouvert.

Dans mon activité, pour ma méthode onCreate (), j'ai …

  • Quel est le but de l'événement "onFling" et "onScroll" dans GestureDetector d'Android?
  • Remplissez automatiquement les champs dans la visualisation Web
  • Comment éviter plusieurs instances de la même activité?
  • Comment puis-je diffuser de la musique à partir d'un fichier dans une zip cryptée sans décompresser l'intégralité du fichier?
  • WebView se débarrasse du double zoom.
  • Devrais-je avoir besoin d'un nouveau jeton chaque fois que je lance ma application Android?
  • toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); } mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); 

    Ensuite, j'appelle mDrawerToggle.syncState(); Dans mon onPostCreate ()

    J'ai essayé de chercher sur la façon de programmer l'icône de la barre d'outils sur la flèche arrière mais rien n'a fonctionné. D'après ce que j'ai rassemblé, appeler

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); 

    De mon fragment devrait changer l'icône, mais ce n'est pas le cas. C'est peut-être une question stupide, mais qu'est-ce-que je fais mal?

  • Erreur xml d'Android: "Aucune ressource trouvée qui correspond au prénom" avec RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)
  • Problème avec Robolectric avec une nouvelle version des services Google Play
  • Comment ajouter une activité de paramètres de notification aux paramètres du système
  • Utilisation de AdB avec plusieurs périphériques avec le même numéro de série
  • Fournisseur de contenu URI matcher
  • Action de répétition Android en appuyant et en maintenant enfoncé un bouton
  • 4 Solutions collect form web for “Barre d'outils AppCompat v7 Up / Back Arrow ne fonctionne pas”

    D'après ce que j'ai vu dans le code source de v7 ActionBarDrawerToggle , vous pouvez animer l'icône vers différents états sans que le tiroir ne soit ouvert.

      private enum ActionDrawableState{ BURGER, ARROW } private static void toggleActionBarIcon(ActionDrawableState state, final ActionBarDrawerToggle toggle, boolean animate){ if(animate) { float start = state == ActionDrawableState.BURGER ? 0f : 1.0f; float end = Math.abs(start - 1); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end); offsetAnimator.setDuration(300); offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float offset = (Float) animation.getAnimatedValue(); toggle.onDrawerSlide(null, offset); } }); offsetAnimator.start(); }else{ //do the same with nine-old-androids lib :) } }else{ if(state == ActionDrawableState.BURGER){ toggle.onDrawerClosed(null); }else{ toggle.onDrawerOpened(null); } } } 

    Morphing entre Burger et Arrow dépend des valeurs comprises entre 0f et 1.0f , essentiellement, ce sont des valeurs que le tiroir passe à ActionBarDrawerToggle.

    J'ai utilisé ValueAnimator pour animer des valeurs dans cette gamme, c'est-à-dire en imitant le changement de tiroir.

    null arguments null sont sécurisés car ActionBarDrawerToggle ne se soucie pas du tout des vues de tiroir. Assurez-vous de jeter un oeil sur les nouveaux interpolateurs pour faire l'animation complètement-par-le-livre des directives de conception de matériaux:

     fast_out_linear_in fast_out_slow_in 

    Une autre approche consiste à accéder mSlider champ privé mSlider du ActionBarDrawer par la méthode de la réflexion et de la setPosition(float position) appel setPosition(float position) pour basculer entre Burger et Arrow. mSlider est de type (extends) DrawerArrowDrawable .

    Personnellement, j'essaie toujours d'éviter la réflexion, tant qu'il n'y a pas d'autre moyen de faire votre sale travail.

    En tant que bibliothèque de support mise à jour en 23.0.0, il existe une meilleure façon de jouer à l'animation de la flèche du dessin. Je vais donc améliorer la réponse de Nikola. Voici le code:

     public static void playDrawerToggleAnim(final DrawerArrowDrawable d) { float start = d.getProgress(); float end = Math.abs(start - 1); ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end); offsetAnimator.setDuration(300); offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float offset = (Float) animation.getAnimatedValue(); d.setProgress(offset); } }); offsetAnimator.start(); } 

    Et appelez-le quand vous voulez par:

     playDrawerToggleAnim((DrawerArrowDrawable) toolbar.getNavigationIcon()); 
     getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { int stackHeight = getSupportFragmentManager().getBackStackEntryCount(); if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment) getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } else { getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setHomeButtonEnabled(false); } } }); 

    Après …

     @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getSupportFragmentManager().popBackStack(); return true; .... } 

    Dans mon cas, l'icône est animée: j'ai utilisé ActionBarDrawerToggle v7.

    Activité principale:

      Toolbar toolbar = (Toolbar) findViewById(R.id.tool1); setSupportActionBar(toolbar); toolbar.setTitle("ToolBar Demo"); toolbar.setLogo(R.drawable.ic_launcher); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open_navigation_drawer, R.string.close_navigation_drawer) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { // TODO Auto-generated method stub super.onDrawerSlide(drawerView, slideOffset); } /** Called when a drawer has settled in a completely closed state. */ @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); getSupportActionBar().setTitle("hello"); } /** Called when a drawer has settled in a completely open state. */ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getSupportActionBar().setTitle("hi"); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); } @Override public boolean onOptionsItemSelected(MenuItem item) { // <---- added if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { // <---- added super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); // important statetment for drawer to // identify // its state } @Override public void onConfigurationChanged(Configuration newConfig) { // <---- added super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(Gravity.START | Gravity.LEFT)) { // <---- // added mDrawerLayout.closeDrawers(); return; } super.onBackPressed(); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.