【问题标题】:Triple Hierarchy Fragment back navigationTriple Hierarchy Fragment 返回导航
【发布时间】:2014-01-14 18:05:25
【问题描述】:

我有三个片段,分别是 GRANDPA、PA、ME。 有一个通用容器可以容纳这三个片段中的任何一个。

GRANDPA 中有一个按钮可以调用 PA。 同样,PA 中有一个按钮,它调用 ME。 在 ME 中有一个菜单项“DONEtoPA”,它返回到 PA。 同样,PA 中有一个菜单项“DONEtoGRANDPA”会返回给 GRANDPA。

除了一个很小的问题外,一切正常(所有导航)。

对于上述方案,用户可能存在三种情况:

情况 1:GRADPA 呼叫 PA 并且 PA 呼叫我...用户按 DONEtoPA 转到 PA,然后在 PA 中按 DONEtoGRANDPA 并转到 GRANDPA。 - 没有问题导航很好。

情况 2:GRADPA 呼叫 PA 并且 PA 呼叫我...用户按 BACK 键转到 PA,然后在 PA 中再次按 BACK 键并转到 GRANDPA。 - 没有问题导航很好。

问题情况 3:GRADPA 呼叫 PA,PA 呼叫我...用户按 DONEtoPA 转到 PA,然后在 PA 中按 BACK。在这里我必须按两次 BACK 按钮。在第一次返回时,第二次返回时没有任何反应,它会转到爷爷。

我不明白为什么需要两次后按。

我使用了片段的 addtobackstack()、hide() 和 show() 命令来导航,而不是 replace()。

代号:爷爷

//BUTTON CALLING PA
    gp.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.hide(this);
            ft.addToBackStack(getTag());
            ft.add(R.id.LLfragmentconsole, new PA(), "PA");
            ft.commit();
        }
    });

代码 PA:

//BUTTON CALLING PA
    pa.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.hide(this);
            ft.addToBackStack(getTag());
            ft.add(R.id.LLfragmentconsole, new ME(), "ME");
            ft.commit();
        }
    });

//MENU ITEM DONEtoGRANDPA
    case R.id.mi_done:
            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.remove(this);
            ft.show(getActivity().getSupportFragmentManager().findFragmentByTag("GRANDPA"));
            ft.commit();
   return true;

给我编码:

 //MENU ITEM DONEtoPA
    case R.id.mi_done:
            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.remove(this);
            ft.show(getActivity().getSupportFragmentManager().findFragmentByTag("PA"));
            ft.commit();
   return true;

据我了解,当我按下 DONEtoPA 后堆栈记录时,仍会添加片段 ME。因此,当我在 PA 片段中按 BACK(第一次)时,它会尝试反转这一点,即删除片段 ME。但是由于我已经在我的 DONEtoPA 菜单项中完成了该操作,因此该单击基本上是浪费的。当我再次按下 BACK 时,backstack 记录更改为添加 PA 片段的记录,因此在 BACK 按下时反转它,即删除片段 PA。

简而言之,我想去掉这个双后按动作。

非常感谢您的帮助。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    创建一个堆栈并使用它来存储您的片段。然后你可以在你的活动中创建这些方法来导航到你的片段层次结构:

    显示片段:

    private void showFragment(final Fragment fragment) 
    {
        if (fragment == null)
            return;
    
        final FragmentManager fm = getSupportFragmentManager();
        final FragmentTransaction ft = fm.beginTransaction();
    
        ft.replace(R.id.fragment_layout, fragment);
    
        ft.commit();
    
        fragmentStack.push(fragment);
    }
    

    推送一个片段:

    public void pushFragment(final Fragment fragment) 
    {
        closeKeaboard();
    
        if (fragment == null)
            return;
    
        final FragmentManager fm = getSupportFragmentManager();
        final FragmentTransaction ft = fm.beginTransaction();
    
        ft.setCustomAnimations(R.anim.push_in_anim, R.anim.push_out_anim);
    
        ft.replace(R.id.fragment_layout, fragment);
    
        ft.commit();
    
        fragmentStack.push(fragment);
    }
    

    弹出一个片段:

    public void popFragment() 
    {
        fragmentStack.pop();
    
        final Fragment fragment = fragmentStack.peek();
    
        if (fragment == null)
            return;
    
        final FragmentManager fm = getSupportFragmentManager();
        final FragmentTransaction ft = fm.beginTransaction();
    
        ft.setCustomAnimations(R.anim.pop_in_anim, R.anim.pop_out_anim);
    
        ft.replace(R.id.fragment_layout, fragment);
    
        ft.commit();
    }
    

    然后覆盖 OnBackPressed() :

    @Override
    public void onBackPressed() 
    {
        if(fragmentStack.size() == 1)
        {
            finish();
            return;
        }
    
        popFragment();
    }
    

    终于可以这样导航了:

    pushFragment(this.paFragment);
    popFragment();
    

    【讨论】:

    • 感谢您的回答,但我使用 popBackStack 选项得到了它。
    【解决方案2】:

    我使用 popBackStack() 得到它。它删除了浪费我点击的 backStack 条目。

    对ME片段进行如下修改

    //MENU ITEM DONEtoPA
    case R.id.mi_done:
        FragmentManager fm = getActivity().getSupportFragmentManager();
        fm.popBackStack();
    
        FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.remove(this);
            ft.show(getActivity().getSupportFragmentManager().findFragmentByTag("PA"));
            ft.commit();
    return true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2020-05-27
      • 2021-10-27
      • 2023-03-06
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多