如何防止在android片段中按下后退按钮时调用onCreateView

Posted

技术标签:

【中文标题】如何防止在android片段中按下后退按钮时调用onCreateView【英文标题】:How to prevent calling onCreateView when back button pressed in fragment in android 【发布时间】:2013-08-11 00:33:28 【问题描述】:

在我的应用程序中,我有标签栏功能。在一个选项卡中,我在 lisview 中显示服务器数据,单击该列表项的详细信息页面将在新片段中打开。

但是当我从该详细信息页面按下后退按钮时,每次 oncreateview 调用上一页,所以每次创建 listview 并 new 获取新的服务器数据。那么如何防止这种情况在按下后退按钮时只显示以前的状态呢?

【问题讨论】:

【参考方案1】:

我知道给出这个答案已经太久了,但我猜你正在用另一个片段替换你的片段。我的意思是说你正在使用

ft.replace(R.id.realTabContent, fragment);

要移动到您在 onItemClick 中使用的其他片段,所以使用简单的解决方案

ft.add(R.id.realTabContent, fragment);

而不是替换您的片段。

了解 replaceadd 之间的区别。这将解决您的问题。

替换:它将替换原始片段并在您返回时重新创建视图添加:它只会添加一个新片段到堆栈。

希望这对面临同样问题的人有所帮助...

【讨论】:

如果我们设置Add,那么新片段会覆盖旧片段 这是不正确的:文档说 add 会将此片段添加到容器中,而不是将其添加到后台堆栈中。 developer.android.com/reference/android/app/… 对我来说,当我尝试在同一个容器中添加新片段时,屏幕仍然显示旧片段数据。在我的活动中,我有容器,因为我正在添加 Fragment1,当用户在 Fragment1 中单击“继续”时,它需要显示详细信息页面,为此,如果我尝试在同一个容器中添加新的 Fragment,我可以看到 onAttach 和调用了 Fragment2 的 onCreateView,但 UI 仍然显示 Fragment1。 有什么解决办法吗?。我正在使用 android.support.v4.app.Fragment 为了防止重叠,您可以在第二个片段的根视图中设置 android:background="@color/white" 以使其不透明。【参考方案2】:

我不认为阻止调用 onCreateView 是一个好主意,如果函数没有被调用,就会有异常,所以不,你不应该。我建议您将“创建的列表视图和新的获取新服务器数据”移动到另一个可以显式调用的地方(当你想要的时候,你想要的地方,onCreate() 是一个好地方),而不是这样做,不要放它在onCreateView()。希望这会有所帮助。

【讨论】:

【参考方案3】:

您应该将数据对象与视图变量分开缓存,因为如果您从服务器获取任何数据并且不想再次调用,则需要更新它们的引用,然后使用分支来分支出该代码。

创建一个 init() 方法,您可以在其中执行所有初始化和服务器调用,并在您不想调用 init() 时从逻辑上将调用分支到 init() 方法。

【讨论】:

以上是关于如何防止在android片段中按下后退按钮时调用onCreateView的主要内容,如果未能解决你的问题,请参考以下文章

如果在 WebView 片段中按下后退按钮,如何返回上一页?

在android中按下后退按钮后如何返回相同的选项卡?

使用导航控制器按下后退按钮后如何防止前一个片段显示?

在 Android 片段中使用 onBackPressed()

使用导航控制器按下后退按钮后,如何防止先前的片段出现?

如何确定后退按钮按下