0

Я работаю над приложением с вкладками с viewpager. Я использую фрагмент pixstatepageradapter для обработки вкладок viewpager. Я заменяю первый фрагмент вложенными фрагментами с помощью childFragmentmanager и добавляя текущий фрагмент к стопке. Управляющий поток выглядит следующим образом.Как очистить фрагмент фрагмента до указанного фрагмента?

Первая вкладка фрагмент A -> Заменено Фрагмент B -> Заменено Фрагмент C -> Заменено Фрагмент D.

Теперь, когда я нажимаю на определенной кнопке в фрагмента D, мне нужно вернуться к фрагмент B, очищая фрагменты C, D из задней части.

Я попытался

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

Но неудачная. Может ли кто-нибудь сказать мне правильный метод, чтобы очистить заднюю часть и перейти к фрагменту B из фрагмента D.? Это мой 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 и frag находятся внутри другого фрагмента для обработки отдельных стоп-кадра для каждой вкладки. И я использую homefragment.getChildFragmentManager(). PopBackStack («поиск», FragmentManager.POP_BACK_STACK_INCLUSIVE); для добавления последних добавленных 2 фрагментов. Все еще не работает. – Naz

0

Похоже, что ваш код выскакивают все из стека фрагментов. Попробуйте использовать определенное имя или идентификатор для фрагмента B вместо использования идентификатора для самого первого фрагмента в стеке.

+0

Я попытался дать имя, добавляя к backstack и попытался внезапная из backstack и не работал. Мои вкладки viewpager и frag находятся внутри другого фрагмента для обработки отдельных стоп-кадра для каждой вкладки. И я использую homefragment.getChildFragmentManager(). PopBackStack («поиск», FragmentManager.POP_BACK_STACK_INCLUSIVE); для добавления последних добавленных 2 фрагментов. Все еще не работает. – Naz

Смежные вопросы