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

ragment包含Retainstance=true,但是onCreate被称为

余弘毅
2023-03-14
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <fragment
        android:id="@+id/ID"
        class="com.teovald.app.MyFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

</FrameLayout>
 public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setRetainInstance(true);
    ....}

最后,我在它的活动onCreate中也恢复了对这个片段的引用:

 public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    FragmentManager fragmentManager = getSupportFragmentManager();
    mFragment = (MyFragment)  fragmentManager.findFragmentById(R.id.ID);    
    ...
}

但是,每次我旋转我的设备时,都会调用活动的onCreate,然后也会调用片段的onCreate!由于我将SetRetaInstance设置为true,所以不应该发生这种情况。这种行为有原因吗?

共有1个答案

吕霖
2023-03-14

我最近遇到了这个问题,并与它斗争了几个小时,直到我发现在包含onSaveInstanceState中保留的非UI片段的活动的代码(我从某个第三方库复制的代码)中,没有调用super.onSaveInstanceState()

事情是这样的:

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the mapview state in a separate bundle parameter
    final Bundle mapviewState = new Bundle();
    mMapFragment.onSaveInstanceState(mapviewState);
    outState.putBundle(BUNDLE_STATE_MAPVIEW, mapviewState);
}

所以我添加了缺失的呼叫,就像:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // Save the mapview state in a separate bundle parameter
    final Bundle mapviewState = new Bundle();
    mMapFragment.onSaveInstanceState(mapviewState);
    outState.putBundle(BUNDLE_STATE_MAPVIEW, mapviewState);
}
 类似资料:
  • 我有一个骆驼路线如下。虽然我设置了处理(true),但我不明白为什么defaul在所有重试都耗尽后,defaul的处理程序会调用的。 日志: 20.04.03 11:46:53.907 INFO ad #6 - timer://testRoute route1 面包屑 Id=ID-xxxxxx-1585894556662-0-4 |世界您好 20.04.03 11:46:53.913错误广告#6-

  • 定义 一个应用可以包含其他应用。一个被包含的应用有它自己的应用目录和 .app 文件,但是它是作为另一个应用的监督树的一部分被启动的。 一个应用只能被一个其他的应用所包含。 一个被包含的应用也可以包含其他应用。 一个不被任何其他应用所包含的应用被称之为主应用。 应用控制器在加载一个主应用的时候会自动加载任何被包含的应用,但并不会启动它们。被包含的应用的顶层督程应由进行包含的应用的某个督程来启动。

  • 问题内容: 我有一个的条目: 目前,我正在检查它是否包含真像这样: 这是检查布尔数组的 最快 方法吗?如果不是,执行此检查的最快方法是什么? 编辑: 通过在Android 4.03 Samsung S2设备上将其作为应用程序运行,我对您的答案中的方法进行了计时,如下所示: 在五次跑步中的时间排名最高,排名第一: 在5334和11584 ns之间: } return false; 在160542和1

  • 我必须用Java实现一个日志机制。所以我使用JEE,使用RequestFilter和拦截器。我把所有这些都放在一个叫做日志记录的包中。 我的类是:请求过滤器,响应过滤器和常量 所以我的问题是。因为类名已经存在于包中,所以不记录类名可以吗? 包日志记录和重复日志记录:请求过滤日志记录,响应过滤日志记录,ConstantsLogging

  • 我正在承担这个项目,但我在活动和保存状态方面遇到了一些问题。因此,我回到了最基本的方面,试图理解我遗漏了什么。然而,即使是一个非常简单的设置,我也有同样的问题。 因此,我从一个空项目开始,在activity_main.xml上放置了2个文本视图和1个按钮,在activity_2.xml上放置了1个按钮。用户将在文本框中输入一些文本,按下按钮前进到Activity2活动,然后按下按钮(在Activi

  • 问题内容: 我的交互式控制台的简要记录: 到底为什么呢? 编辑: 为了对比起见,请考虑运算符。 这使得有很大的意义,因为虽然和都意味着同样的事,作为一个条件语句,他们真的是不一样的东西。 再次编辑: 更有趣的后果: 问题答案: 因为Python中的Boolean是整数的子类型。从文档中: 布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以视为假或真)。在数字上下文中(例如