web-dev-qa-db-de.com

Verstecken Fragment in Android anzeigen

Ich entwickle eine Anwendung, die 2 Fragmente enthält, und möchte je nach Bedarf ausblenden. Der folgende Code hat ein einfaches Beispiel für mein Problem. Diese einfache Fragmentaktivität enthält 1 Schaltfläche und ein Listenfragment.

Dieses einfache Beispiel funktioniert einwandfrei. aber ich bin nicht zufrieden mit show hide fragment. Wenn Sie layout.setVisibility (View.GONE) entfernen; aus dem Code dann ft.hide (f); wird das Fragment nicht verstecken. Tatsächlich verstecken wir kein Fragment, das wir Container verstecken. 

Meine Frage ist, IS eine Möglichkeit, versteckte Fragmente anzuzeigen. Wenn nicht, dann erklären Sie bitte anhand eines getesteten Beispiels, wie Sie Fragmente ein- und ausblenden können, da viele Menschen mit diesem Problem konfrontiert sind.

 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

Machen Sie sich nicht mit den Sichtbarkeitsflags des Containers herum - FragmentTransaction.hide/show erledigt das intern für Sie.

Der korrekte Weg, dies zu tun, ist also:

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

OR, wenn Sie Android.support.v4.app.Fragment verwenden

 FragmentManager fm = getSupportFragmentManager();
 fm.beginTransaction()
          .setCustomAnimations(Android.R.anim.fade_in, Android.R.anim.fade_out)
          .show(somefrag)
          .commit();
136
numan salati

Darüber hinaus können Sie ein Fragment ausführen (beispielsweise, wenn Serverdaten fehlgeschlagen sind):

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

Wenn Sie diesen Ansatz verwenden, bleiben alle Fragmente in dem Container, wenn Sie sie anfangs hinzugefügt haben. Dann legen wir einfach das gewünschte Fragment frei und verstecken die anderen innerhalb des Containers. 

// 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();
}

Siehe https://github.com/codepath/Android_guides/wiki/Creating-and-User-Fragments für weitere Informationen. Ich hoffe, ich kann jedem helfen. Auch wenn es sich um eine alte Frage handelt.

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

Versuche dies: 

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

Das hat bei mir funktioniert

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

die Antworten hier sind korrekt und ich mochte @Jyo die Whiff-Idee einer Show-and-Hide-Fragment-Implementierung, mit der Ausnahme, dass er das Fragment derzeit beim ersten Durchlauf ausblenden würde das Fragment, wenn es nicht schon ist

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

In meinem Code ist es im Vergleich zur obigen Lösung am einfachsten, ein Layout zu definieren, das das Fragment enthält. Anschließend können Sie das Fragment ausblenden oder einblenden, indem Sie das Layoutattribut steuern, das an der allgemeinen Ansichtsweise ausgerichtet ist. In diesem Fall ist kein zusätzlicher Code erforderlich, und die zusätzlichen Bereitstellungsattribute des Fragments konnten in das äußere Layout verschoben werden.

<LinearLayout style="@style/StHorizontalLinearView"
    >

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

</LinearLayout>
0
Jeno