配置更改后片段被重置

Fragment being reset after configuration change

我目前正在使用蓝牙连接创建应用程序。连接在一个简单对象 (HandleConnection) 中处理。建立连接后,我的应用程序进入 "remote" 模式,这意味着我将我的主要片段替换为另一个使用 "HandleConnection" 对象的片段 (RemoteFragment)。

直到一切顺利,因为在我的 "onCreate" 结束时(在我的 activity 内)我设置了 RemoteFragment 的 handleConnection 属性:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);


    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    if (savedInstanceState == null) {
        retainedFragment = new RetainedFragment();
        getFragmentManager().beginTransaction().add(retainedFragment, RetainedFragment.class.toString()).commit();
        handleConnection = new HandleConnection(this, handler);
        retainedFragment.setHandleConnection(handleConnection);

    } else {

        remoteFragment = (RemoteFragment) getFragmentManager().findFragmentByTag(RemoteFragment.class.toString());
        retainedFragment = (RetainedFragment) getFragmentManager().findFragmentByTag(RetainedFragment.class.toString());

        if (remoteFragment == null)
            remoteFragment = new RemoteFragment();

        handleConnection = retainedFragment.getHandleConnection();
        remoteFragment.setHandleConnection(handleConnection);
    }

    fragmentTransaction.commit();

}

除了我进入横屏模式外,一切正常。 然后(在调试模式下播放后),似乎在我的 setter 被调用后我的 RemoteFragment 被重新创建,这显然意味着我的 handleConnection 属性为空。 为什么要这样做?如果我不重用之前的片段我会理解(然后我会有两个不同的片段相互叠加)但在这种情况下它没有意义。 我通过在 onCreateView 中调用回调函数来获取 HandleConnection 对象来解决此问题,但是为什么在我之前调用 setter 时该属性为空?

谢谢!

Fragment 的生命周期直接受宿主 activity 的生命周期影响。当 activity 被销毁时,所有片段也被销毁。在布局更改期间,activity 被销毁并重新创建。

在这种情况下,轮换后,onCreate() 方法中的 else 条件将执行,因此将执行您获得的行为。查看文档以获得透彻的理解。

http://developer.android.com/guide/components/fragments.html

您需要在 AndroidManifes.xml 的 activity 注册中添加类似这样的内容:<activity android:configChanges="orientation|screenSize"/>

阅读this篇文章

显然我的问题是我没有使用正确的 RemoteFragment 实例,这意味着我当前的引用(在我的 activity 中)对我的对象具有正确的非空值,但是显示的片段不是这个片段(它是重新创建的旧片段,因此 handleConnection 的值为空)。