【问题标题】:Back in fragment and nested fragment返回片段和嵌套片段
【发布时间】:2016-10-22 01:29:12
【问题描述】:

我有这样的应用程序

一个活动及其内部>

  1. 片段a(在运行应用程序时加载也可以从菜单打开它)
  2. 片段 b(从菜单中打开)
  3. 片段c(可以从片段a打开,也可以从菜单打开)

在片段c内部也有4个子片段

在主要活动中(使用导航抽屉作为源)我像这样在 oncreate 中调用片段 a

 FragmentManager fragmentManager=getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.fragment_place,new First_Fragment()).addToBackStack("First").commit();

我的问题是如何控制后退按钮始终返回到片段 a 以及当片段 a 打开时关闭应用程序 我正在使用 addToBackStack(null) 但不是我想要的,因为它会显示我打开的所有片段历史记录

【问题讨论】:

    标签: android android-fragments android-nested-fragment


    【解决方案1】:

    当将片段 a 添加到后堆栈“addToBackStack(String name)”时,传入一个名称。

    然后在你的 Fragments 中监听 back press

    FragmentManager fm = getFragmentManager();
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
        }
    });
    

    确保在没有显示每个片段时停止收听。

    然后就可以弹回回栈中添加的命名片段

        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        fm.popBackStack ("name", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    

    确保您的其余片段事务未添加到后台堆栈。这应该会给你你想要的行为。

    【讨论】:

    【解决方案2】:

    addToBackStack(String tag) 用于将片段添加到后台堆栈,它包含字符串作为参数。此参数可以为 null 或具有某个值。 如果您传递 null,它会将您的片段添加到带有标签 null 的 backstack。 addToBackStack(null) 并不意味着您的片段未添加到后台堆栈。
    如果您希望您的片段不会被添加到 backstack,那么只需删除此行。

    如果您要将片段添加到 backstack 并希望它可见 onBackPressed,那么您可以使用

    getSupportFragmentManager().popBackStackImmediate(/* Fragment TAG */,0);
    

    代码:-试试下面的代码告诉我。

    1. 将以下函数复制到您的主 Activity 中。

      /**
       * function to show the fragment
       *
       * @param name fragment to be shown
       * @param tag  fragment tag
       */
       public void showFragment(Fragment name, String tag) {
          FragmentManager fragmentManager = getSupportFragmentManager();
          // check if the fragment is in back stack
          boolean fragmentPopped = fragmentManager.popBackStackImmediate(tag, 0);
          if (fragmentPopped) {
             // fragment is pop from backStack
          } else {
             FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
             fragmentTransaction.replace(R.id.fragment_container, name, tag);
             fragmentTransaction.addToBackStack(tag);
             fragmentTransaction.commit();
          }}
      
    2. 使用以下代码显示片段。

      showFragment(yourFragment, yourFragmentTag);

    3. 在 mainActivity onBackPressed。

      @override public void onBackPressed(){ FragmentTransaction fts = getSupportFragmentManager().beginTransaction(); FragmentManager fragmentManager = getSupportFragmentManager(); if (fragmentManager.getBackStackEntryCount() >= 2) { // always show your fragment a here showFragment(new FragmentA(), FragmentA.class.getSimpleName()); } else { // finish your activity } }

    【讨论】:

    • 感谢重播,但你能解释一下如果按回我应该在片段和主活动中放什么吗?
    • android studio 显示错误“showFragment”无法解决
    • showFragment 函数在 mainActivity 中,如果您尝试从片段中调用它,请使用 ((MainActivity)getActivity()).showFragment()
    • 我从 mainactivity 调用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多