94 votes

barre d'action haut navigation avec fragments

J'ai une mise en page Actionbar/viewpager avec trois onglets, à savoir A , B y C . En onglet C tab(fragment), j'ajoute un autre fragment, disons fragment D . avec

 DFragment f= new DFragment();
 ft.add(android.R.id.content, f, "");
 ft.remove(CFragment.this);
 ft.addToBackStack(null);
 ft.commit();

Je modifie la barre d'action dans le onResume du DFragment pour ajouter un bouton :

ActionBar ab = getActivity().getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
ab.setDisplayHomeAsUpEnabled(true);
ab.setDisplayShowHomeEnabled(true);

Maintenant, dans DFragment, lorsque j'appuie sur le bouton Retour du matériel (téléphone), je reviens à la disposition originale à onglets (ABC) avec CFragment sélectionné. Comment puis-je réaliser cette fonctionnalité avec le bouton haut de la barre d'action ?

190voto

Roger Garzon Nieto Points 1006

Mettre en œuvre OnBackStackChangedListener et ajoutez ce code à votre activité de fragmentation.

@Override
public void onCreate(Bundle savedInstanceState) {
    //Listen for changes in the back stack
    getSupportFragmentManager().addOnBackStackChangedListener(this);
    //Handle when activity is recreated like on orientation Change
    shouldDisplayHomeUp();
}

@Override
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}

public void shouldDisplayHomeUp(){
   //Enable Up button only  if there are entries in the back stack
   boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount()>0;
   getSupportActionBar().setDisplayHomeAsUpEnabled(canGoBack);
}

@Override
public boolean onSupportNavigateUp() {
    //This method is called when the up button is pressed. Just the pop back stack.
    getSupportFragmentManager().popBackStack();
    return true;
}

43voto

SohailAziz Points 1873

Je l'ai. Il suffit de passer outre onOptionsItemSelected dans l'activité d'hébergement et faire apparaître le backstack, par ex.

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home: {
            FragmentManager fm = getSupportFragmentManager();
            if (fm.getBackStackEntryCount() > 0) {
                fm.popBackStack();
                return true;
            }
            break;
        }
    }
    return super.onOptionsItemSelected(item);
}

Appelez getActionBar().setDisplayHomeAsUpEnabled(boolean); y getActionBar().setHomeButtonEnabled(boolean); en onBackStackChanged() comme expliqué dans une réponse ci-dessous.

18voto

Daniel Jonker Points 223

Si vous n'avez qu'une seule activité parentale et que vous voulez que le bouton "up" fonctionne comme un bouton "back", vous pouvez utiliser ce code :

ajoutez ceci à l'onCreate de votre classe d'activité principale

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);
            }
        }

    });

puis ajoutez onOptionsItemSelected comme ceci :

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

Je l'utilise généralement tout le temps et il semble assez légitime.

11voto

Moaz Rashad Points 868

Vous pouvez revenir en arrière avec le bouton haut comme le bouton arrière ;

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

8voto

verboze Points 78

J'ai utilisé une combinaison de Roger Garzon Nieto y de sohailaziz réponses. Mon application a une seule MainActivity, et des fragments A, B, C qui sont chargés dans celle-ci. Mon fragment "home" (A) implémente OnBackStackChangedListener, et vérifie la taille du backStack ; si elle est inférieure à un, alors il cache le bouton UP. Les fragments B et C chargent toujours le bouton arrière (dans ma conception, B est lancé depuis A, et C est lancé depuis B). L'activité principale elle-même ouvre simplement la pile arrière lorsque le bouton UP est touché, et possède des méthodes pour afficher/masquer le bouton, que les fragments appellent :

Activité principale :

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            getSupportFragmentManager().popBackStack();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }

fragmentA (implémente FragmentManager.OnBackStackChangedListener) :

public void onCreate(Bundle savedinstanceSate) {
    // listen to backstack changes
    getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this);

    // other fragment init stuff
    ...
}

public void onBackStackChanged() {
    // enable Up button only  if there are entries on the backstack
    if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) {
        ((MainActivity)getActivity()).hideUpButton();
    }
}

fragmentB, fragmentC :

public void onCreate(Bundle savedinstanceSate) {
    // show the UP button
    ((MainActivity)getActivity()).showUpButton();

    // other fragment init stuff
    ...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X