363 votes

Android Fragment gérer retour bouton presse

J'ai quelques fragments dans mon activité

 [1], [2], [3], [4], [5], [6]
 

Et sur le bouton Retour Appuyez sur Je dois retourner de [2] à [1] si le fragment courant actif est [2], ou ne rien faire autrement.

Quelle est la meilleure pratique pour faire cela?

EDIT : L'application ne doit pas retourner à [2] de [3] ... [6]

430voto

Mark Allison Points 10123

Lorsque vous effectuez une transition entre Fragments, appelez addToBackStack() dans le cadre de FragmentTransaction :

 FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();
 

Si vous avez besoin d'un contrôle plus détaillé (c'est-à-dire lorsque certains fragments sont visibles, vous voulez supprimer la touche retour), vous pouvez définir un OnKeyListener sur la vue parente de votre fragment:

 //You need to add the following line for this solution to work; thanks skayred
fragment.getView().setFocusableInTouchMode(true);

fragment.getView().setOnKeyListener( new OnKeyListener()
{
    @Override
    public boolean onKey( View v, int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            return true;
        }
        return false;
    }
} );
 

275voto

saulobrito Points 1390

Je préfère faire quelque chose comme ça:

 private final static String TAG_FRAGMENT = "TAG_FRAGMENT";

private void showFragment() {
    final Myfragment fragment = new MyFragment();
    final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT);
    transaction.addToBackStack(null);
    transaction.commit();
}

@Override
public void onBackPressed() {
    final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);

    if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not
        super.onBackPressed();
    }
}
 

126voto

ANemati Points 1436

Si vous surpassez la méthode onKey pour la vue fragmentée dont vous aurez besoin:

 view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i(tag, "keyCode: " + keyCode);
            if( keyCode == KeyEvent.KEYCODE_BACK ) {
                    Log.i(tag, "onKey Back listener is working!!!");
                getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                return true;
            } else {
                return false;
            }
        }
    });
 

92voto

shimatai Points 21

Utilisez la méthode addToBackStack lors du remplacement d'un fragment par un autre:

 getFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).addToBackStack("my_fragment").commit();
 

Ensuite, dans votre activité, utilisez le code suivant pour revenir d'un fragment à un autre (le précédent).

 @Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
 

55voto

Tejas Mehta Points 486

Si vous souhaitez gérer le matériel d'Arrière-clés de l'événement que vous avez à faire code suivant dans votre onActivityCreated() la méthode de Fragment.

Vous devez également vérifier Action_Down ou Action_UP événement. Si vous ne cochez ensuite onKey() Méthode appelle 2 fois.

Aussi, Si votre rootview(getView()) ne contiennent pas d'accent, alors il ne fonctionnera pas. Si vous avez cliqué sur un contrôle puis de nouveau vous avez besoin pour donner le focus à rootview à l'aide de getView().requestFocus(); Après cela, seulement onKeydown() va appeler.

getView().setFocusableInTouchMode(true);
getView().requestFocus();

getView().setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show();
                    return true;
                    }
                }
                return false;
            }
        });

Fonctionne très bien pour moi.

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