2016-04-13 108 views
0

如何从他的调用片段中删除片段?如何从其调用片段中删除片段?

我有搜索这个东西,但我没有得到解决方案根据我的要求。在我的申请中,有一个FragmentActivity,其中有viewPager

这个viewPager包含3个片段。对于片段,我使用FragmentStatePagerAdapter

假设有3个片段:AB,C;和D片段C也包含儿童片段E

我在onCreateView()方法调用片段E和片段ConDestroy()方法,我已经删除子片段E

所以发生了什么事,当我滑到viewPagerCB,并BA - 我回来的时候从AB,现在是当前显示片段是B。现在,如果我滑片段C应该是显示器,但在地方片段CC孩子片段,片段E正在显示后然后分段E然后片段C在这种情况下我还没有看到片段E的片段C现在显示,孩子片段E不与viewpager互动,但为什么它在viewPager添加,

我有试图摧毁孩子片段EonPause()并在ConDestroy()方法,但什么也没有发生。请任何人帮助我。

@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

我认为你应该使用自定义viewgroups和一个普通的'ViewPager'而不是'FragmentPagerAdapter'或'FragmentStatePagerAdapter',这样你将直接控制所有的状态。 – EpicPandaForce

+0

@EpicPandaForce片段'MYScannerParentFragment'包含片段'E',片段'E'与'viewPager'无关,但在从'MYScannerParentFragment'中删除滑动片段'E'并在左侧显示'MYScannerParentFragment'。 –

回答

0

您请试试这些。

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

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

这个东西不适合我,在这里播种currentFragment = null。 –

+0

你必须添加名称到你的分数 –

+0

,我必须添加片段名称?我已经尝试过使用标签,但并没有删除片段。 –

0

所以,当我滑到viewPager从C到B B发生了什么,以及A - 我回来的时候,从A到B,现在是当前显示片段B.

我像现在这样面对过一些事情。我正在注册并注销关于碎片生命周期事件的侦听器。但在视图上,即使我切换到另一个片段,以前的片段永远不会被销毁,您可以check

在深入您的案例之前,我想提及一下“关闭页面限制”。所以你不能设置为零。检查link。所以,当你设置为0,则默认为1

viewpager.setOffscreenPageLimit(0); 

如果我不是失去了一些东西,在这种情况下,当你从C转向到B

  • 如果你有前C走访d片段,D将被销毁,B将被创造,C仍然会生活。

假设你从第一壳体来(C到B,然后B到A)

  • Ç将被破坏,B住,A将被创建

底线,与ViewPager你有两分钟的片段。一个是你正在互动和第二个(屏幕关闭)

+0

@ Blackkara你没有得到我的问题让我解释你的片段C包含片段E和E与viewPager无关。当片段C可见时,在C的onCreateView方法内调用片段E.问题是当片段C被viewPager销毁时,被C调用的片段E不被销毁,它会自动添加到片段C的左侧。是当C被破坏时E应该在C变得可见时被再次销毁E应该也可以通过C. –

+0

所以我的帖子提到FragmentC必须负责在你的案例中创建和删除FragmentE。当片段C出现时动态添加片段E,然后在片段C消失时动态删除片段E. – Blackkara

+0

是的,这是我的要求什么片段E自动从C中删除,并添加左侧的C为什么它发生? –