web-dev-qa-db-fra.com

"Bouton Précédent" à l'aide de getSupportActionbar et de la barre d'outils appcompat v7

J'utilise la nouvelle barre d'outils de la bibliothèque Appcompat V7 et je crée une application avec un tiroir de navigation et des fragments.

Dans certains fragments, je ne veux pas montrer l’icône de hamburger mais la flèche à la place ... C’est très bien, je l’ai fait de cette façon:

mDrawerToggle.setDrawerIndicatorEnabled(false);

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

getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

Ma question est la suivante: comment ou où dois-je configurer le bouton d'accueil Lisener ou que dois-je écouter pour le bouton "Précédent"? Je souhaite appeler la méthode principale principale et appuyer sur l'icône du tiroir de navigation avec l'icône de hamburger.

50
András Ferencz

Vous pouvez le faire comme ça:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);  
    toolbar = (Toolbar)findViewById(R.id.toolbar);
    if (toolbar != null) {
      setSupportActionBar(toolbar);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    setUpNavigationDrawer();

    getFragmentManager().addOnBackStackChangedListener(backStackListener); // listen to the backstack of the fragment manager
}

Définissez le onBackSTackChangedListener:

private FragmentManager.OnBackStackChangedListener backStackListener = new FragmentManager.OnBackStackChangedListener() {
   @Override
   public void onBackStackChanged() {
       setNavIcon();
   };
}

Définissez l'icône en fonction du backstack de votre fragment:

protected void setNavIcon() {
    int backStackEntryCount = getFragmentManager().getBackStackEntryCount();
    drawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

Détecter lorsque l'icône du tiroir est enfoncée:

public boolean onOptionsItemSelected(MenuItem item) {
    if (drawerToggle.isDrawerIndicatorEnabled() && drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    switch (item.getItemId()) {
      case x:
         return true;
      default:
         return false;
    }
}

Et manipulez le bouton haut:

public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Cela fonctionne pour moi. Bonne chance.

41
tanneebee

Ajoutez cette méthode dans onCreate():

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Puis substituez le onOptionItemSelected() comme ci-dessous:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
70
Raja Jawahar

Pas sûr que cela fonctionne dans le cas d'OP, mais dans de nombreux cas, c'est probablement l'option la plus simple pour implémenter le bouton Précédent avec la barre d'outils AppCompat.

Ignorez tous les éléments setHomeButtonEnabled, setDisplayHomeAsUpEnabled et onOptionsItemSelected et liés

Au lieu de cela, lors de l’initialisation de la barre d’outils, définissez simplement 1) l’icône de navigation et 2) la navigation pour OnClickListener:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

if (enableBackNavigation) {
    toolbar.setNavigationIcon(R.drawable.ic_back);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
}
31
Jonik

1- Créer une mise en page Toolbar;

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:local="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@color/dark_blue"
    Android:minHeight="?attr/actionBarSize"
    local:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

2- Incluez ceci dans votre mise en page à l’endroit où vous voulez que la toolbar soit.

3- Collez le code suivant dans votre activité. (Étend ActionBarActivity)

private Toolbar mToolbar;

//For Toolbar (Action bar) start
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        mToolbar.setNavigationIcon(R.drawable.ic_back_arrow);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        getSupportActionBar().setTitle("Event Details");
        //For Toolbar (Action bar) end

4- Changez l’icône de clic arrière sur ce que vous voulez.

16
Surendar D

activer le bouton retour:

getActionBar().setDisplayHomeAsUpEnabled(enable);

et écoutez les clics dans onBackPressed()

De toute évidence, votre activité doit s'étendre ActionBarActivity

3
TheRedFox

Vous pouvez simplement configurer l’icône de navigation et vous assurer que vous définissez setNavigationOnClickListener() après avoir configuré setSupportActionBar(toolbar)

toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});
2
Fenil

dans manifeste ajouter ces lignes sous l'activité que vous voulez la flèche arrière de travail 

Android: parentActivityName = "Le nom de votre activité parent"

1
murtaza agaz

Ajouter setDisplayHomeAsUpEnabled (true)

    Toolbar toolbar  = findViewById(R.id.toolbar);
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

Manipuler le bouton de retour

   public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
0
Farid Haq