Android 配置更改后正在重置的片段

Android 配置更改后正在重置的片段,android,android-fragments,android-fragmentactivity,android-configchanges,Android,Android Fragments,Android Fragmentactivity,Android Configchanges,我目前正在使用蓝牙连接创建应用程序。连接在简单对象(HandleConnection)内处理。连接完成后,我的应用程序进入“远程”模式,这意味着我将用另一个使用“HandleConnection”对象的主片段(RemoteFragment)替换我的主片段 在一切顺利之前,因为在我的“onCreate”(在我的活动中)结束时,我设置了RemoteFragment的handleConnection属性: @Override public void onCreate(Bundle savedI

我目前正在使用蓝牙连接创建应用程序。连接在简单对象(HandleConnection)内处理。连接完成后,我的应用程序进入“远程”模式,这意味着我将用另一个使用“HandleConnection”对象的主片段(RemoteFragment)替换我的主片段

在一切顺利之前,因为在我的“onCreate”(在我的活动中)结束时,我设置了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属性为null。 它为什么这样做?如果我不重用前面的片段,我会理解(那么我会有两个不同的片段在彼此之上),但在这种情况下,这是没有意义的。 我通过调用onCreateView中的回调函数来获得HandleConnection对象,找到了一个解决方法,但是为什么在我之前调用setter时属性会为null呢


谢谢

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

在这种情况下,在旋转之后,将执行
onCreate()
方法中的
else
条件,从而执行您得到的行为。请查看文档以获得彻底的理解


您需要在AndroidManifes.xml中添加类似的活动注册:
文章

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

是的,但因为我调用了
remoteFragment.setHandleConnection(handleConnection);
remoteFragment在调用'handleConnection=retainedFragment.getHandleConnection()时,在else条件下输入onCreateView?时不应具有空指针;'此句柄连接是否为空?我猜这是空的。在将其设置为“remoteFragment”之前,您应该在此处进行空性检查。不,handleConnection不是空的。我一直在使用android文档中提到的RetainedFragment模式:请尝试以下
否则{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);getFragmentManager().beginTransaction().add(remoteFragment,remoteFragment.class.toString()).commit();}