【问题标题】:Android Fragments - How to implement Backstacking and Recalling previous fragmentAndroid Fragments - 如何实现 Backstacking 和 Recalling 先前的 Fragment
【发布时间】:2013-09-27 10:00:03
【问题描述】:

我有如下所示的 android 屏幕布局

应用程序屏幕分为 3 个片段,页眉、页脚和内容。页眉和页脚片段是固定的。内容片段根据内容而变化。我根据需要替换了fragment1-fragment3。最初 Fragment1 显示在内容区域中。当我按下下一个按钮时,fragment1 被 fragment2 替换。这是命令。我有一个问题,如果我之前按下另一个按钮,我怎样才能返回到上一个片段(片段2->片段1)。片段类中是否有任何内置机制可用。

请指导我...

提前致谢

【问题讨论】:

  • 使用 FragmentTransaction 的 addToBackStack() 函数。 Details here

标签: android android-fragments


【解决方案1】:

试试这个代码

FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();

【讨论】:

  • 好的。我如何显示以前的片段。请提供更多信息
  • 以上默认处理手机返回键。如果您想自己处理后退按钮,我更喜欢自己维护 backstack,以便我们可以根据我们的要求进行操作
  • 如果您需要任何样品,请告诉我
  • 是的。如果我在片段中按下电话/标签的后退按钮,它将退出到主页
【解决方案2】:

每当您尝试调用新片段时,然后为其添加回堆栈

 ft.addToBackStack(null); 

现在,如果您想从一个片段返回到另一个片段,请创建一种方法..

public void DeleteCurrentFragment()
{
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

 Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);


 String fragName = "NONE";

 if (currentFrag!=null)
    fragName = currentFrag.getClass().getSimpleName();


 if (currentFrag != null)
    transaction.remove(currentFrag);

 transaction.commit();

 }

然后调用这个:

 getSupportFragmentManager().popBackStack();
 DeleteCurrentFragment();

【讨论】:

  • OK 工作...另一个疑问,我的初始片段是片段1,如果我调用上面的代码(即 getSupportFragmentManager().popBackStack(); DeleteCurrentFragment();)它会变成空白。我怎样才能找到我在第一个片段中。
  • 为此,您可以使用 findFragmentByTag() 方法,在该方法中,您可以很容易地找到在初始化片段时给出的标记......
  • 是否有任何计数可用于 backstack。如果 count 为零则很容易停止 popBackStack。
  • 不...你必须通过字符串来识别 findFragmentByTag("tag") 或 ft.addToBackStack("tag");
【解决方案3】:

你可以试试:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(R.id.contentFragment, <your fragment>);
ft.addToBackStack(null);
ft.commit();

所以假设您在fragment1 上,并且在做一些事情之后您想要推送fragment2 然后在您的contentFragment 上您可以addreplace 片段(在这种情况下为fragment2)按照你的要求。现在,当您调用addToBackStack 时,这意味着将此事务添加到后台堆栈。这样事务将在提交后被记住,并在以后从堆栈中弹出时反转其操作。它在内部维护一个堆栈,所以你不想做任何事情。最后,当您从fragment2 按下返回按钮时,它会检查事务是否在其堆栈中具有任何片段,如果是则调用它。它就像栈顶。当您在堆栈中调用 addToBackStack 时,会添加片段 1。所以当你按下返回按钮堆栈的顶部是fragment1 所以它会调用它。

当您按下硬件后退按钮时会发生这种情况。如果您想在任何按钮上执行此操作,则只需在该按钮的单击侦听器上使用 onBackPressed() 方法即可。

【讨论】:

  • 很好......如果我按下上一个按钮,如何显示/回调上一个片段
  • 好的。如果我按上一个按钮,我如何删除当前片段。
  • 如果您在 fragment2 上,则无需删除任何内容,这将在内部处理。
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多