配置更改后片段被重置
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 的值为空)。
我目前正在使用蓝牙连接创建应用程序。连接在一个简单对象 (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 的值为空)。