119 votes

Afficher cacher un fragment dans Android

Je développe une application qui contient 2 fragments et je veux les afficher et les cacher selon mes besoins. Le code suivant est un exemple simple de mon problème. Cette simple activité de fragmentation contient un bouton et un fragment de liste.

Cet exemple simple fonctionne parfaitement. Mais je ne suis pas satisfait du fragment show hide. Si vous supprimez layout.setVisibility(View.GONE) ; du code, alors ft.hide(f) ; ne cachera pas le fragment. En fait, nous ne cachons pas le fragment mais le conteneur.

Ma question est la suivante : est-ce un moyen de montrer les fragments cachés ? Si ce n'est pas le cas, veuillez expliquer, à l'aide d'un exemple testé, comment masquer et afficher les fragments, car de nombreuses personnes sont confrontées à ce problème.

 public class MainActivity extends FragmentActivity implements OnClickListener {

        Fragment1 f;
        Button b;
        LinearLayout layout;
        Fragment myf;
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            b = (Button) findViewById(R.id.button1);
            layout = (LinearLayout) findViewById(R.id.ll);
            f = new Fragment1();
        }

        @Override
        public void onClick(View v) {

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

            if (f.isHidden()) {
                ft.show(f);
                layout.setVisibility(View.VISIBLE);
                b.setText("Hide");
            } else {
                ft.hide(f);
                b.setText("Show");
                layout.setVisibility(View.GONE);
            }
            ft.commit();
            // TODO Auto-generated method stub
        }

174voto

numan salati Points 4684

Ne modifiez pas les drapeaux de visibilité du conteneur - FragmentTransaction.hide/show le fait en interne pour vous.

Donc la façon correcte de faire est :

FragmentManager fm = getFragmentManager();
fm.beginTransaction()
          .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
          .show(somefrag)
          .commit();

OU si vous utilisez Android.support.v4.app.Fragment

 FragmentManager fm = getSupportFragmentManager();
 fm.beginTransaction()
          .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
          .show(somefrag)
          .commit();

62voto

Arià Points 876

En outre, vous pouvez le faire dans un fragment (par exemple, lorsque l'obtention des données du serveur a échoué) :

 getView().setVisibility(View.GONE);

25voto

mangu23 Points 697

Si vous le faites en utilisant cette approche, tous les fragments resteront dans le conteneur une fois ajoutés initialement et nous ne faisons que révéler le fragment souhaité et cacher les autres dans le conteneur.

// Within an activity
private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        fragmentA = FragmentA.newInstance("foo");
        fragmentB = FragmentB.newInstance("bar");
        fragmentC = FragmentC.newInstance("baz");
    }
}

// Replace the switch method
protected void displayFragmentA() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (fragmentA.isAdded()) { // if the fragment is already in container
        ft.show(fragmentA);
    } else { // fragment needs to be added to frame container
        ft.add(R.id.flContainer, fragmentA, "A");
    }
    // Hide fragment B
    if (fragmentB.isAdded()) { ft.hide(fragmentB); }
    // Hide fragment C
    if (fragmentC.isAdded()) { ft.hide(fragmentC); }
    // Commit changes
    ft.commit();
}

Veuillez consulter https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragments pour plus d'informations. J'espère que je pourrai aider quelqu'un. Même si c'est une vieille question.

11voto

Jyo the Whiff Points 585
public void showHideFragment(final Fragment fragment){

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.setCustomAnimations(android.R.animator.fade_in,
                    android.R.animator.fade_out);

    if (fragment.isHidden()) {
        ft.show(fragment);
        Log.d("hidden","Show");
    } else {
        ft.hide(fragment);
        Log.d("Shown","Hide");                        
    }

    ft.commit();
}

11voto

Tom Points 151

Essayez ça :

MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapview);
mapFragment.getView().setVisibility(View.GONE);

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