web-dev-qa-db-fra.com

Afficher le fragment de peau dans Android

Je développe une application qui contient 2 fragments et je veux montrer masquer en fonction de mes besoins. Le code suivant a un exemple simple de mon problème. Ce fragment d'activité simple contient 1 bouton et un fragment de liste.

Cet exemple simple fonctionne parfaitement. mais je ne suis pas satisfait de show hide fragment. Si vous supprimez layout.setVisibility (View.GONE); à partir du code puis ft.hide (f); ne cacherai pas fragment. En fait, nous ne dissimulons pas un fragment, mais un conteneur. 

Ma question est, IS est-ce une façon de montrer des fragments de peau? Si ce n'est pas le cas, veuillez expliquer avec un exemple testé comment masquer et afficher des 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
        }
73
abidkhan303

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

Donc, la bonne façon de faire est:

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

OR 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();
136
numan salati

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

 getView().setVisibility(View.GONE);
48
Arià

Bonjour, vous le faites en utilisant cette approche, tous les fragments resteront dans le conteneur une fois ajoutés initialement, puis nous révélerons simplement le fragment souhaité et en cacherons les autres à l’intérieur du 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 pouvoir aider quelqu'un. Même si c'est une vieille question.

18
mangu23
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();
}
6
Jyo the Whiff

Essaye ça: 

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

Cela a fonctionné pour moi

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if(tag.equalsIgnoreCase("dashboard")){

            DashboardFragment dashboardFragment = (DashboardFragment)
                    fragmentManager.findFragmentByTag("dashboard");
            if(dashboardFragment!=null) ft.show(dashboardFragment);

            ShowcaseFragment showcaseFragment = (ShowcaseFragment)
                    fragmentManager.findFragmentByTag("showcase");
            if(showcaseFragment!=null) ft.hide(showcaseFragment);

        } else if(tag.equalsIgnoreCase("showcase")){
            DashboardFragment dashboardFragment = (DashboardFragment)
                    fragmentManager.findFragmentByTag("dashboard");
            if(dashboardFragment!=null) ft.hide(dashboardFragment);

            ShowcaseFragment showcaseFragment = (ShowcaseFragment)
                    fragmentManager.findFragmentByTag("showcase");
            if(showcaseFragment!=null) ft.show(showcaseFragment);
        }

        ft.commit();
0
shankey

les réponses ici sont correctes et j'ai bien aimé l'idée de @Jyo the Whiff d'une implémentation de masquer et de fragmenter, à l'exception de la façon dont il l'a actuellement masquait le fragment lors de la première exécution. le fragment si ce n'est pas déjà

public void showHideCardPreview(int id) {
    FragmentManager fm = getSupportFragmentManager();
    Bundle b = new Bundle();
    b.putInt(Constants.CARD, id);
    cardPreviewFragment.setArguments(b);
    FragmentTransaction ft = fm.beginTransaction()
        .setCustomAnimations(Android.R.anim.fade_in, Android.R.anim.fade_out);
    if (!cardPreviewFragment.isAdded()){
        ft.add(R.id.full_screen_container, cardPreviewFragment);
        ft.show(cardPreviewFragment);
    } else {
        if (cardPreviewFragment.isHidden()) {
            Log.d(TAG,"++++++++++++++++++++ show");
            ft.show(cardPreviewFragment);
        } else {
            Log.d(TAG,"++++++++++++++++++++ hide");
            ft.hide(cardPreviewFragment);
        }
    }

    ft.commit();
} 
0
martinseal1987

De mon code, en comparant à la solution ci-dessus, le moyen le plus simple est de définir une présentation qui contient le fragment. Vous pouvez alors masquer ou afficher le fragment en contrôlant l'attribut de présentation qui est aligné avec le mode de vue général. Dans ce cas, aucun code supplémentaire n'est nécessaire et les attributs de déploiement supplémentaires du fragment peuvent être déplacés vers la présentation externe.

<LinearLayout style="@style/StHorizontalLinearView"
    >

    <fragment
        Android:layout_width="match_parent"
        Android:layout_height="390dp"
        Android:layout_alignParentTop="true"
        />

</LinearLayout>
0
Jeno