web-dev-qa-db-fra.com

Utilisation de onBackPressed () dans Android Fragments

Je travaille sur un projet et je dois pouvoir utiliser le bouton de retour dans chaque fragment pour naviguer entre les fragments précédents, j'ai des méthodes écrites pour le faire en utilisant une flèche de retour dans la barre d'action, cependant, je veux pouvoir pour utiliser la même fonctionnalité sur le bouton de retour enfoncé. Je ne veux pas utiliser la pile arrière. Y a-t-il un moyen de faire cela?

MODIFIER

Plutôt que d'utiliser la pile arrière, je veux pouvoir appeler la méthode de retour à la méthode précédente ci-dessous lorsque l'utilisateur clique sur le bouton Retour. J'ai besoin d'utiliser la méthode gobackpressed dans des fragments. Est-ce possible? J'espère que c'est clair et concis. Toutes mes excuses pour toute confusion causée ci-dessus.

Revenir au précédent

public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){

    FragmentManager  fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out);

    ft.show(preFragment);

    //**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK**

    ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag));
    ft.addToBackStack(null);
    ft.commit();

    Misc.currentContentFragmentTag = preFragmentTag;

    createBar(preFragment);
}

Aller de l'avant

public void gotoNextFragment(String nextTag, Fragment nextFragment){

    FragmentManager  fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out);

    boolean newlyCreated = false;
    if(nextFragment == null){
        nextFragment = Fragment.instantiate(this, nextTag);
        newlyCreated = true;
    }

    //hide current fragment
    ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag));

    if(newlyCreated){
        ft.add(R.id.content_frame, nextFragment, nextTag);
    }
    else{
        ft.show(nextFragment);
    }

    ft.addToBackStack(null);
    ft.commit();
    Misc.currentContentFragmentTag = nextTag;

    createBar(nextFragment);
}

Voici comment je navigue d'avant en arrière, et j'aimerais pouvoir implémenter la méthode de retour en arrière sur onBackPressed (). Est-ce que ça a du sens?

24
DJ-DOO

Pourquoi ne voulez-vous pas utiliser la pile arrière? S'il y a un problème sous-jacent ou une confusion, nous pouvons peut-être vous éclaircir.

Si vous voulez respecter votre exigence, remplacez simplement la méthode onBackPressed () de votre activité et appelez la méthode que vous appelez lorsque la flèche de retour de votre ActionBar est cliquée.

EDIT: Comment résoudre le problème de pile de fragments de "l'écran noir":

Vous pouvez contourner ce problème en ajoutant un écouteur backstack au gestionnaire de fragments. Cet écouteur vérifie si la pile arrière de fragments est vide et termine l'activité en conséquence:

Vous pouvez définir cet écouteur dans la méthode onCreate de votre activité:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FragmentManager fm = getFragmentManager();
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if(getFragmentManager().getBackStackEntryCount() == 0) finish();
        }
    });
}
22
tiguchi

Je n'ai pas trouvé de bonne réponse à ce problème, c'est donc ma solution.

Si vous souhaitez revenir Appuyez sur dans chaque fragment, procédez comme suit.

créer l'interface OnBackPressedListener

public interface OnBackPressedListener {
    void onBackPressed();
}

Que chaque fragment qui veut être informé de backPressimplémente cette interface.

Dans l'activité parent, vous pouvez remplacer onBackPressed()

@Override
public void onBackPressed() {
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
    if (fragmentList != null) {
        //TODO: Perform your logic to pass back press here
        for(Fragment fragment : fragmentList){
           if(fragment instanceof OnBackPressedListener){
               ((OnBackPressedListener)fragment).onBackPressed();
           }
        }
    }
}
34
Ioane Sharvadze

Dans le fragment où vous souhaitez gérer votre bouton arrière, vous devez attacher des éléments à votre vue dans la vue oncreate

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.second_fragment, container, false);
    v.setOnKeyListener(pressed);
    return v;
}



@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    if( keyCode == KeyEvent.KEYCODE_BACK ){
            // back to previous fragment by tag
            myfragmentclass fragment = (myfragmentclass) getActivity().getSupportFragmentManager().findFragmentByTag(TAG);
            if(fragment != null){
                (getActivity().getSupportFragmentManager().beginTransaction()).replace(R.id.cf_g1_mainframe_fm, fragment).commit();
            }
            return true;
        }
        return false;
    }
};
3
user2886881

Vous pouvez essayer de remplacer onCreateAnimation, paramètre et catch enter==false. Cela se déclenchera avant chaque contre-pression.

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {            
        if(!enter){
            //leaving fragment
            Log.d(TAG,"leaving fragment");
        }
        return super.onCreateAnimation(transit, enter, nextAnim);
    }
2
negersiu

Pour un fragment, vous pouvez simplement ajouter

  getActivity().onBackPressed();

à votre code

2
Chidinma