当前位置: 首页 > 知识库问答 >
问题:

Android-addToBackStack()不工作?

陆琦
2023-03-14

这是负责将片段添加到后堆栈的函数:

public void populateContent(File f)
{

    ContentFragment cf = new ContentFragment(ctx, ac, this);
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();;
    cf.updateView(f);

    transaction.replace(R.id.contentFragment, cf);

    transaction.addToBackStack(null);

    transaction.commit();

}

当我点击后退按钮时,最后一个片段没有被加载(什么也没有发生)。

知道是什么导致的吗?

编辑:FragmentManager日志。

http://pastebin.com/mYnVdkLG

在我看来,我的应用程序似乎在两次保存第二个视图,而不是先保存第一个视图,然后再保存第二个视图。

共有3个答案

谷梁宝
2023-03-14

我在添加,而不是替换,但我必须在add()之前调用addToBackStack(null),而不是在add()之后,在将关闭的片段上,而不是在将保持打开的片段上。

A类(先开放)

FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();

B类(由A类打开)

FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
孟佑运
2023-03-14

我不确定实际的解决方案,但我可以指导你一点,也许你能弄清楚问题是什么。

你真的在替换两个碎片吗?如果没有,则没有要还原的事务。您的第一个片段也是从XML添加的吗?经理不知道这个片段,您可能还需要使用事务添加第一个片段。

如果(savedInstanceState==null)performFirstTransaction(),请仔细检查是否存在,否则您将两次添加第一个片段。

一个好主意是在碎片管理器中使用enableDebugLogging。这将告诉您经理知道哪些片段。

请参见:http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(布尔)

作为补充,不建议为片段使用自定义构造函数。这是因为如果你的应用程序被操作系统杀死并重新实例化,它将调用空构造函数。

您应该使用静态方法,例如ContentFragment.get实例(

更多信息请访问:http://developer.android.com/reference/android/app/Fragment.html在“课程概述”部分。

我希望我的回答能帮助你找到问题。

孔欣可
2023-03-14

在片段事务上调用addToBackStack()似乎是不够的,我们必须处理自己按下Back按钮时弹出的后端堆栈。我将此添加到我的活动中,它按预期工作:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
 类似资料:
  • 我在Android中面临两个关于碎片的问题。 我有一个应用程序与一个导航抽屉片段在我的主要活动。当我在这个导航抽屉上单击一个项目时,一个新的片段会加载到主活动中的“fragment_placeholder”上。很简单。 创建MainActivity时,我将在fragment_placeholder中加载“homeFragment”。这个片段有一个带有两个标签的SlidingTabLayout,每个

  • 这是我写的主活动的代码。我正在加载第一个屏幕中的片段列表。当用户点击任何列表项时,行星名称将在我在单独的类中定义的详细片段中显示给用户。 我正在添加“碎片行星列表”事务- 然而,如果我重写backPress方法并以编程方式弹出后栈,它就可以正常工作。 如果要实现此行为,是否需要以这种方式重写onBackPressed()方法?未记录您需要在此链接中重写此方法。Android背压片段文档 碎片行星细

  • 我需要你帮我拿这个充气机。从Activity3中,我需要获得Activity1中EditText中的内容。 例:在Activity1中,我写我的名字、电子邮件、ECC。在活动2中,我选择我的生日,在活动3中,我想看到两者。 所以我在Activity3中使用了LayoutInflater,但是当我将EditText解析为string时,字符串是空的。 谢了。

  • 我想从网站获取一个字符串,并将其转换为数组。它在eclipse中工作,但如果我想在Android应用程序中使用它,它就不起作用了。我知道,这一定是一个愚蠢的错误,但我不知道它在哪里。 InternetHandler: 主要的 显示 它总是返回错误数组,但idk为什么:C logcat: HttpEngineering. sendRequest(HttpEngineering. java: 239)

  • MediaPlayer中的seekTo()方法有问题。看来根本不管用!我跟踪了关于这个问题的其他线索,并尝试了不同的解决方案,但seekTo()仍然什么也没做!下面是我的代码: system.out.println()显示以下输出: null

  • 在为Android开发的Eclipse Java中······ 正如您所看到的,我根本无法获得应用程序或基本上下文。试图在没有它们的情况下获得文件目录是行不通的。我到底如何访问我的文件目录?