android - 如何清除 fragment 后台直到指定 fragment ?

标签 android android-fragments android-viewpager fragmentstatepageradapter fragment-backstack

我正在开发一个带有 viewpager 选项卡的应用程序。我正在使用fragmentstatepageradapter 来处理viewpager 选项卡。我使用 childFragmentmanager 将第一个 fragment 替换为嵌套 fragment ,并将当前 fragment 添加到后台堆栈。控制流程如下。

第一个选项卡 fragment A -> 替换为 fragment B -> 替换为 fragment C -> 替换为 fragment D。

现在,当我单击 fragment D 中的特定按钮时,我需要返回到 fragment B,从后台清除 fragment C、D。

我试过了

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

但是没有成功。有人可以告诉我清除后台堆栈并从 fragment D 导航到 fragment 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;
    }


}

这就是我替换 fragment 的方式。

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();

最佳答案

当您将 fragment 添加到后台堆栈时,请给它们命名。

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);
    }
});

关于android - 如何清除 fragment 后台直到指定 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35818695/

相关文章:

android - fragment 相互重叠

android - 类似于 Go Launcher Ex 中的分页动画

android - 使用 ViewPager Android 固定标签

具有动态高度的Android ViewPager

android - appcompat-v7 :22. 1.0 不工作

android - 如何在另一个线程中设置 TextView 的文本

android - 适用于 android 的 Visual Studio (2015) 模拟器无法正常工作 - XDE.exe - 退出代码 3

android - 回收者 View 可见性问题,它超出屏幕

android - 如何使用导航类型 safeargs 插件将 Parcelable 类型的对象传递给 fragment

android - 多个 fragment 同时访问同一个数据库