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
}
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();
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);
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.
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();
}
Essaye ça:
MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapview);
mapFragment.getView().setVisibility(View.GONE);
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();
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();
}
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>