【问题标题】:Cant get from the backstack无法从后台获取
【发布时间】:2017-09-06 04:39:14
【问题描述】:

我有一个包含一个容器的主要活动,我想在其中显示四个片段。这个主要活动有一个底部栏,当我按下一个特定的选项卡时,它应该膨胀不同的片段。我正在尝试使用 backstack 调用来使我的应用程序更加流畅。下面的代码显示了该底部栏的侦听器

@Override
    public void onTabSelected(@IdRes int tabId) {

    if (tabId == R.id.tab_people) {
        cretePeopleFrgament();
    }  else if (...) {
                ...
     }

    bottomBar.setOnTabReselectListener(new OnTabReselectListener() {
        @Override
        public void onTabReSelected(@IdRes int tabId) {
            if (tabId == R.id.tab_people) {
                cretePeopleFrgament();
            } else if (...) {
                ...
            }
        }
    });
}

我就这样开始我的片段

void creteProfileFrgament() {
        ...    
        Fragment fraggy = new FragmentProfile();
        replaceFragment(fraggy,"Profile",null);

    }

因此,如果我想要膨胀的片段已经在后台堆栈上,我正在尝试使用下一个方法,如果是,他应该被弹出而不是创建。正在发生的事情是,当我想从后台堆栈弹出时,总是生成从 onStart 传递的片段。从我的调试中我已经看到他正确地添加了,布尔 fragmentpop 实现了但它没有弹出

private void replaceFragment (Fragment fragment, String name,Bundle bundle){
    boolean fragmentPopped = fragmentManager.popBackStackImmediate(name,0);
if (!fragmentPopped){ //fragment not in back stack, create it.
    FragmentTransaction ft= fragmentManager.beginTransaction();
    ft.addToBackStack(name);
    ft.replace(R.id.conteiner, fragment);
    if(bundle!=null)
        fragment.setArguments(bundle);
    ft.commit();
}

}

这样做的目的是使用 onBackPressed

@Override
    public void onBackPressed() {
        bottomBar.setVisibility(View.VISIBLE);
        int index = fragmentManager.getBackStackEntryCount() - 1;
        String tag;
        if(index==-1) {
            tag = "default";
        }else {
            FragmentManager.BackStackEntry backEntry = fragmentManager.getBackStackEntryAt(index);
            tag = backEntry.getName();
        }
        switch (tag){
            case "Profile":
                bottomBar.selectTabAtPosition(0);
                break;
            case "People":
                bottomBar.selectTabAtPosition(1);
                break;
            case "default":
                bottomBar.selectTabAtPosition(0);
        }

    }

非常感谢

【问题讨论】:

  • 尝试编辑您的问题并正确改写一些单词和标题

标签: android android-fragments fragment-backstack


【解决方案1】:

你每次都在创建一个新的 Fragment,如果你想从 backstack 中弹出,你应该保留它而不再次创建它......

查看您的 creteProfileFrgament 方法。

【讨论】:

  • 那么当我创建一个新的 Fragment 时,它会从 onStart 方法开始?我该如何解决我的问题?谢谢
  • fragmentTransaction.addToBackStack("name");稍后当你需要它时: FragmentManager fm = getActivity() .getSupportFragmentManager(); fm.popBackStack("名称", FragmentManager.POP_BACK_STACK_INCLUSIVE);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2013-03-21
  • 2022-01-25
相关资源
最近更新 更多