2016-04-13 4 views
0

Comment supprimer le fragment de son fragment appelant?Comment supprimer le fragment de son fragment appelant?

J'ai chercher cette chose mais je n'ai pas eu de solution selon mon exigence. Dans mon application, il y a un FragmentActivity qui a le viewPager.

Cette viewPager contient 3 fragments. Pour le fragment j'utilise FragmentStatePagerAdapter.

Supposons qu'il y ait trois fragments: A, B, C; et le fragment DC contient également un fragment enfant E.

je fragment d'appel E dans la méthode onCreateView() et dans la méthode onDestroy() du fragment C, je retirer le fragment de l'enfant E.

Alors qu'est-ce qui se passe quand je glissais viewPagerC-B et B-A - quand je reviens A-B, maintenant fragment affichage actuel est B. Maintenant, si je glisse fragment C devrait être afficher, mais à la place du fragment C le fragment enfant de C, fragment E affiche ensuite après le fragment E alors le fragment C affiche maintenant dans cette condition je n'ai pas vu Fragment E sur le fragment C, le fragment d'enfant E n'interagit avec viewpager mais pourquoi il est ajouté dans viewPager,

je dois essayer de détruire le fragment d'enfant E dans onPause() et méthode onDestroy() de C, mais rien ne se passe. S'il vous plaît quelqu'un m'aider.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MYDataManager.sharedHandler().changeLanguageConfiguration(); 
    overridePendingTransition(R.anim.activity_open_translate, R.anim.activity_close_scale); 
    setContentView(R.layout.activity_myscanner); 

    appFlow = new ArrayList(Arrays.asList(MYConstant.kProfileMenuSettings, MYConstant.kScanner, MYConstant.kRestaurantListing)); 

    viewpager = (ViewPager) findViewById(R.id.view_pager); 
    viewpager.addOnPageChangeListener(this); 
    viewpager.setOffscreenPageLimit(0); 

    reloadViewPager(1); 
} 

public void reloadViewPager(int currentItem) { 
    adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) { 
     @Override 
     public Fragment getItem(int position) { 
      return getFragmentWithPosition(position); 
     } 

     @Override 
     public int getCount() { 
      return appFlow.size(); 
     } 

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 
    }; 
    viewpager.setAdapter(adapter); 
    viewpager.setCurrentItem(currentItem); 
} 

private MYBaseFragment getFragmentWithPosition(int position) { 
    String screen = appFlow.get(position); 
    MYBaseFragment fragment = null; 
    if(screen.equals(MYConstant.kProfileMenuSettings)) { 
     myProfileSettingFragment = new MYProfileSettingFragment(); 
     fragment = myProfileSettingFragment; 
    } else if(screen.equals(MYConstant.kScanner)) { 
     fragment = new MYScannerParentFragment(); 
    } else if(screen.equals(MYConstant.kRestaurantListing)) { 
     myRestaurantListFragment = new MYRestaurantListFragment(); 
     fragment = myRestaurantListFragment; 
    } else if(screen.equals(MYConstant.kRestaurantDetails)) { 
     myResraurantDetailsFragment = new MYResraurantDetailsFragment(); 
     fragment = myResraurantDetailsFragment; 
    } else if(screen.equals(MYConstant.kCurrentRestaurantDetails)) { 
     MYQRCode qrData = MYDataManager.sharedHandler().getQRData(); 
     if(MYUitilities.checkQRValidation(qrData)) { 
      fragment = new MYCurResDetails(); 
     } 
    } else if(screen.equals(MYConstant.kSettings)) { 
     fragment = new MYSettingFragment(); 
    } else if(screen.equals(MYConstant.kViewMenu)) { 
     fragment = new MYResCatListFragment(); 
    } else if(screen.equals(MYConstant.kMenuCategoryListing)) { 
     fragment = new MYResCatListFragment(); 
    } else if(screen.equals(MYConstant.kViewMenuViewPage)) { 
     // myResMenuViewPagerFragment = new MYResMenuViewPagerFragment(); 
     // fragment = myResMenuViewPagerFragment; 
     fragment = new MYResMenuViewPagerFragment(); 
    } else if(screen.equals(MYConstant.kReviewOrder)) { 
     fragment = new MYReviewOrderFragment(); 
    } else if(screen.equals(MYConstant.kYourOrder)) { 
     fragment = new MYYourOrderFragment(); 
    } else if(screen.equals(MYConstant.kSettings)) { 
     fragment = new MYSettingFragment(); 
    } else if(screen.equals(MYConstant.kOrderHistory)) { 
     fragment = new MYOrderHistoryFragment(); 
    } else if(screen.equals(MYConstant.kCheckout)) { 
     fragment = new MYCheckoutFragment(); 
    } else if(screen.equals(MYConstant.kCallWaiter)) { 
     fragment = new MYCallWaiterFragment(); 
    } else if(screen.equals(MYConstant.kYourProfile)) { 
     myYourProfileFragment = new MYYourProfileFragment(); 
     fragment = myYourProfileFragment; 
    } 

    fragment.setFragmentInteractionListener(MYScannerActivity.this); 
    return fragment; 
} 

@Override 
public void onPageSelected(final int position) { 
    if(currentPosition >= 0) { 
     final String previousScreen = appFlow.get(currentPosition); 
     final String currentScreen = appFlow.get(position); 

     System.out.println("previousScreen-" + previousScreen); 
     System.out.println("currentScreen-" + currentScreen); 

     if(previousScreen.equals(MYConstant.kYourProfile) && currentScreen.equals(MYConstant.kProfileMenuSettings)) { 
      appFlow.remove(MYConstant.kYourProfile); 
      adapter.notifyDataSetChanged(); 
      viewpager.setCurrentItem(0); 
     } 
     if(previousScreen.equals(MYConstant.kRestaurantDetails) && currentScreen.equals(MYConstant.kRestaurantListing)) { 
      appFlow.remove(MYConstant.kRestaurantDetails); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kViewMenu) && currentScreen.equals(MYConstant.kRestaurantDetails)) { 
      appFlow.remove(MYConstant.kViewMenu); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kViewMenuViewPage) && currentScreen.equals(MYConstant.kViewMenu)) { 
      appFlow.remove(MYConstant.kViewMenuViewPage); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kViewMenuViewPage) && currentScreen.equals(MYConstant.kMenuCategoryListing)) { 
      appFlow.remove(MYConstant.kViewMenuViewPage); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kYourOrder) && currentScreen.equals(MYConstant.kViewMenuViewPage)) { 
      appFlow.remove(MYConstant.kYourOrder); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kReviewOrder) && currentScreen.equals(MYConstant.kViewMenuViewPage)) { 
      appFlow.remove(MYConstant.kReviewOrder); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kYourOrder) && currentScreen.equals(MYConstant.kReviewOrder)) { 
      appFlow.remove(MYConstant.kYourOrder); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kYourOrder) && currentScreen.equals(MYConstant.kViewMenuViewPage)) { 
      appFlow.remove(MYConstant.kReviewOrder); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kSettings) && currentScreen.equals(MYConstant.kProfileMenuSettings)) { 
      appFlow.remove(MYConstant.kSettings); 
      adapter.notifyDataSetChanged(); 
      viewpager.setCurrentItem(0); 
     } else if(previousScreen.equals(MYConstant.kOrderHistory) && currentScreen.equals(MYConstant.kProfileMenuSettings)) { 
      appFlow.remove(MYConstant.kOrderHistory); 
      adapter.notifyDataSetChanged(); 
      viewpager.setCurrentItem(0); 
     } else if(previousScreen.equals(MYConstant.kCheckout) && currentScreen.equals(MYConstant.kViewMenuViewPage)) { 
      appFlow.remove(MYConstant.kCheckout); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kCheckout) && currentScreen.equals(MYConstant.kReviewOrder)) { 
      appFlow.remove(MYConstant.kCheckout); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kCheckout) && currentScreen.equals(MYConstant.kYourOrder)) { 
      appFlow.remove(MYConstant.kCheckout); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kCallWaiter) && currentScreen.equals(MYConstant.kCheckout)) { 
      appFlow.remove(MYConstant.kCallWaiter); 
      adapter.notifyDataSetChanged(); 
     } else if(previousScreen.equals(MYConstant.kRestaurantListing) && currentScreen.equals(MYConstant.kScanner)) { 
      if(MYDataManager.sharedHandler().isQRCodeScanned()) { 
       appFlow.remove(MYConstant.kRestaurantListing); 
       if(!appFlow.contains(MYConstant.kCurrentRestaurantDetails)) { 
        appFlow.add(MYConstant.kCurrentRestaurantDetails); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
     } else if(previousScreen.equals(MYConstant.kCurrentRestaurantDetails) && currentScreen.equals(MYConstant.kScanner)) { 

     } else if(previousScreen.equals(MYConstant.kMenuCategoryListing) && currentScreen.equals(MYConstant.kCurrentRestaurantDetails)) { 
      appFlow.remove(MYConstant.kMenuCategoryListing); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    Fragment fragment = ((FragmentStatePagerAdapter) viewpager.getAdapter()).getItem(position); 
    if(fragment instanceof MYProfileSettingFragment) { 

    } 
    currentPosition = position; 
} 
+1

Je pense que vous devriez utiliser Viewgroups personnalisés et un 'ViewPager' normal au lieu de' FragmentPagerAdapter' ou 'FragmentStatePagerAdapter', de cette façon vous serez en contrôle direct de tous les états. – EpicPandaForce

+0

@EpicPandaForce Le fragment 'MYScannerParentFragment' contient le fragment 'E', le fragment 'E' non lié à 'viewPager' mais après le glissement du fragment 'E' retiré de 'MYScannerParentFragment' et affichant le côté 'MYScannerParentFragment'. –

Répondre

0

Vous pouvez les essayer.

FragmentManager fragmentManager = getActivity().getFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       Fragment currentFragment = fragmentManager.findFragmentById(R.id.frame_container); 

       fragmentTransaction.remove(currentFragment);//remove current fragment 
+0

cette chose ne fonctionne pas pour moi, ici il sème currentFragment = null. –

+0

vous devez ajouter un nom à votre groupe –

+0

où je dois ajouter un nom de fragment? J'ai essayé avec Tag mais ce n'est pas enlever le fragment. –

0

Alors ce qui se passe quand je glissais viewPager de C à B et B à A - quand je reviens de A à B, maintenant fragment affichage courant est B.

I Avait fait face à quelque chose avant comme tu l'as maintenant. J'enregistrais et désinscrivais un auditeur sur des fragments de cycle de vie. Mais dans viewpager, même si je suis passé à un autre fragment, le fragment précédemment ne sera jamais détruit, vous pouvez check

Avant de plonger dans votre cas, je veux parler de 'hors page limite'. Donc vous ne pouvez pas mettre à zéro. Cochez cette case link. Ainsi, lorsque vous définissez 0, valeur par défaut de 1

viewpager.setOffscreenPageLimit(0); 

Si quelque chose im ne manque pas, dans ce cas, lorsque vous passez de C à B

  • Si vous aviez visité fragment D avant C , D sera détruit, B sera créé, C sera encore vivant.

En supposant que vous en provenance de premier cas (C à B, puis de B à A)

  • C sera détruite, B vit, A sera créé

Bottom line, avec ViewPager vous avez min deux fragments. Un est que vous êtes actuellement en interaction et deuxième (écran désactivé)

+0

@ Blackkara vous n'obtenez pas mon problème laissez-moi vous expliquer le Fragment C contient le fragment E et E n'est pas lié à viewPager. lorsque le fragment C est visible, appelez le fragment E dans la méthode onCreateView de C. problème est que lorsque le fragment C a été détruit par viewPager, le fragment E qui est appelé par C n'est pas détruit, il est automatiquement ajouté à gauche du fragment C. est-ce que lorsque C a détruit E devrait être détruit à nouveau quand C devient visible E devrait également visible sur le C. –

+0

Ainsi, mon message se réfère à ce que FragmentC doit être responsable de la création et la suppression de FragmentE dans votre cas. Ajouter dynamiquement le fragment E lorsque le fragment C est apparu, puis supprimer dynamiquement le fragment E lorsque le fragment C a disparu. – Blackkara

+0

oui c'est mes exigences quel fragment E automatiquement enlevé de C et ajouté à gauche le C pourquoi cela se passe-t-il? –