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