0

我正在研究一个具有viewpager选项卡的应用程序。我正在使用fragmentstatepageradapter来处理viewpager选项卡。我使用childFragmentmanager将第一个片段替换为嵌套片段,并将当前片段添加到backstack中。控制流程如下。如何清除片段backstack直到指定的片段?

第一个标签片段A - >替换为片段B - >与C片段替换 - >与片段D.替换现在

当我点击的片段d特定的按钮,我需要回去片段B,从后台堆栈中清除碎片C,D。

我试图

getSupportFragmentManager().popBackStack(
    getSupportFragmentManager().getBackStac‌​kEntryAt(0).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 

但unsuccessfull。有人可以告诉我正确的方法来清除后台堆栈并从D段导航到片段B. 这是我fragmentstatepageradapter

public class HomeViewPagerAdapter extends FragmentStatePagerAdapter { 

    CharSequence Titles[]; // This will Store the Titles of the Tabs which are 
    Context mcontext;      // Going to be passed when ViewPagerAdapter is 
    int[] images;      // created 
    int NumbOfTabs; 
    private Fragment mFragmentAtPos0; 
    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 
    Fragment homefragment; 
    Context context; 
    FragmentManager fragmentmanager; 

    public HomeViewPagerAdapter(Context context, FragmentManager fm, 
           CharSequence mTitles[], int mNumbOfTabsumb) { 
     super(fm); 
     this.Titles = mTitles; 
     this.NumbOfTabs = mNumbOfTabsumb; 
     this.context = context; 
     this.fragmentmanager = fm; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // TODO Auto-generated method stub 

     if (position == 0) 
     { 
      SharedPreferences LoginPref = this.context.getSharedPreferences("login_credentials", Context.MODE_PRIVATE); 
      if (LoginPref.contains("login_pref") && LoginPref.getString("login_pref", "").equals("loggedin")) { 
       homefragment = new SearchHomeFragment(); 
      } else { 
       homefragment = new HomeScreenFragment(); 
      } 
      return homefragment; 
     } else if (position == 1) 
     { 
      HomeCategoriesFragment homecategoriesfragment = new HomeCategoriesFragment(); 
      return homecategoriesfragment; 

     } else if (position == 2) 
     { 
      HomePriceComparisonFragment homepricecomparefragment = new HomePriceComparisonFragment(); 
      return homepricecomparefragment; 
     } else if (position == 3) 
     { 
      HomeEnterFeedFragment homeenterfeedfragment = new HomeEnterFeedFragment(); 
      return homeenterfeedfragment; 
     } else { 
      HomeMoreFragment homemorefragment = new HomeMoreFragment(); 
      return homemorefragment; 
     } 

    } 

    @Override 
    public int getItemPosition(Object object) { 
     Log.e("getItemPosition", "getItemPosition"); 
     if (object instanceof HomeScreenFragment) 
      return POSITION_NONE; 
     else 
      return POSITION_UNCHANGED; 

    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     registeredFragments.put(position, fragment); 
     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
      registeredFragments.remove(position); 
     if(MyTabFragment.shouldDestroy) { 
      super.destroyItem(container, position, object); 
      MyTabFragment.shouldDestroy=false; 
     } 
    } 

    public void resetScreendata() { 
     if (homefragment != null) { 
      homefragment.getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 
    } 
    public void resettoSearch() { 

     if (homefragment != null) { 
      homefragment.getChildFragmentManager().popBackStack("search", FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 
    } 
    public Fragment getRegisteredFragment(int position) { 
     return registeredFragments.get(position); 
    } 
    @Override 
    public CharSequence getPageTitle(int position) { 
     // TODO Auto-generated method stub 
     return Titles[position]; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return NumbOfTabs; 
    } 


} 

而且我这是怎么更换片段。

final SearchHomeFragment newFragment = new SearchHomeFragment(); 
FragmentTransaction transaction =getChildFragmentManager().beginTransaction(); 
transaction.setCustomAnimations(R.anim.slide_in_right,R.anim.slide_out_left,R.anim.slide_in_left,R.anim.slide_out_right); 
transaction.replace(R.id.fragment_mainLayout, newFragment); 
transaction.addToBackStack("search"); 
transaction.commit(); 

回答

1

当您将片段添加到backstack时,给它们一个名称。

fragmentTransaction.addToBackStack("fragmentA"); 
fragmentTransaction.addToBackStack("fragmentB"); 
fragmentTransaction.addToBackStack("fragmentC"); 
fragmentTransaction.addToBackStack("fragmentD"); 

然后在单击按钮添加以下代码:

button.setOnClickListener(new View.OnClickListener() { 

@Override 
public void onClick(View v) { 
    FragmentManager fm = getActivity() 
      .getSupportFragmentManager(); 
    fm.popBackStack ("fragmentB", FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
}); 
+0

嗨Avijit Karmakar,我试图给名称,同时添加到后台堆栈,并试图从后台堆栈并没有工作。我的viewpager和fragment标签位于另一个片段中,用于处理每个标签的单独的后台堆栈。我使用homefragment.getChildFragmentManager()。popBackStack(“search”,FragmentManager.POP_BACK_STACK_INCLUSIVE);弹出最后添加的2个片段。还是行不通。 – Naz

0

它看起来像你的代码的弹出一切掉碎片堆。尝试使用特定的名称或ID作为片段B,而不是使用ID作为堆栈中第一个片段。

+0

我试着给名字而增加堆栈中,并试图从堆栈中坡平了,没有工作。我的viewpager和fragment标签位于另一个片段中,用于处理每个标签的单独的后台堆栈。我使用homefragment.getChildFragmentManager()。popBackStack(“search”,FragmentManager.POP_BACK_STACK_INCLUSIVE);弹出最后添加的2个片段。还是行不通。 – Naz