web-dev-qa-db-fra.com

Comment fermer le fragment en cours en utilisant Button comme le bouton Précédent?

J'ai essayé de fermer le fragment actuel en utilisant Imagebutton.

Je suis dans le fragment A et il se tournera vers le fragment B lorsque je clique sur le bouton.

Et quand je clique sur le bouton en Fragment-B, il se tournera vers le Fragment-C et fermera le Fragment-B.

Si je clique sur le bouton Précédent de Fragment-C, il reviendra à Fragment-A.

Le code que j'ai essayé est le suivant 

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

        camera_album.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                            closefragment();
                Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
                MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


            }
        });

    private void closefragment() {
        getActivity().getFragmentManager().beginTransaction().remove(this).commit();
    }

Lorsque je clique sur le bouton de retour du fragment B, il se tourne vers le fragment C. 

Mais lorsque je clique sur le bouton Précédent de Fragment-C, il ne revient pas à Fragment-A ..__, mais à l'arrière-plan vide. Si je veux revenir au fragment A, je dois cliquer à nouveau sur le bouton Précédent.

SO, il semble ne pas fermer le fragment actuel complet.

Comment terminer le fragment actuel comme le bouton de retour d'Android?

54
Wun

À partir du fragment A, pour aller à B, remplacez A par B et utilisez addToBackstack() avant commit().

Maintenant, à partir du fragment B, allez à C, utilisez d'abord popBackStackImmediate(), cela ramènera A. Maintenant, remplacez A par C, comme pour la première transaction.

52
S.D.

Je change le code de getActivity().getFragmentManager().beginTransaction().remove(this).commit();

à 

getActivity().getFragmentManager().popBackStack();

Et cela peut fermer le fragment.

93
Wun

Pour ceux qui ont besoin de trouver un moyen simple

Essayez getActivity().onBackPressed();

43

Essaye ça:

ft.addToBackStack(null);   // ft is FragmentTransaction

Ainsi, lorsque vous appuyez sur back-key , l'activité en cours (qui contient plusieurs fragments) chargera le fragment précédent au lieu de se terminer elle-même.

4
Shylendra Madda

C’est une façon de faire Kotlin, j’ai créé un bouton dans la disposition des fragments, puis jeté onClickListner dans onViewCreated. 

selon le commentaire de @ Viswanath-Lekshmanan

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity.onBackPressed()
    }
}
3
Abdul Rehman

Vous pouvez essayer cette logique parce que cela a fonctionné pour moi.

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}
2
user8595527

Essaye ça:

public void removeFragment(Fragment fragment){
    Android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    Android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}
2
None
Button ok= view.findViewById(R.id.btSettingOK);
    Fragment me=this;
    ok.setOnClickListener( new View.OnClickListener(){
        public void onClick(View v){

         getActivity().getFragmentManager().beginTransaction().remove(me).commit();
        }
    });
1
Bruno L.

getActivity().onBackPressed fait tout ce dont vous avez besoin. Il appelle automatiquement la méthode onBackPressed dans l'activité parent.

1
Farruh Habibullaev

Si vous devez gérer l'action plus spécifiquement avec le bouton Précédent, vous pouvez utiliser la méthode suivante:

    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if( keyCode == KeyEvent.KEYCODE_BACK )
            {
                onCloseFragment();
                return true;
            } else {
                return false;
            }
        }
    });
1
user6683868

Essaye celui-là

getActivity().finish();
0
Karan Chunara