0

我正在使用蓝牙连接创建应用程序。连接在一个简单对象(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(); 

} 

一切正常,除非我变成横向模式的罚款。 然后(在调试模式下播放后),看起来我的调用器被调用后重新创建了RemoteFragment,这显然意味着我的handleConnection属性为null。 它为什么这样做?我会理解,如果我没有重用前一个片段(那么我会有两个不同的片段在另一个之上),但在这种情况下,它是没有意义的。 我通过调用onCreateView中的回调函数来获得HandleConnection对象,但是为什么当我之前调用setter时该属性为null?

谢谢!

回答

0

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

0

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

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

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

+0

是的,但因为我调用''''remoteFragment.setHandleConnection(handleConnection);''''进入onCreateView时,remoteFragment不应该有空指针? – pLesur

+0

在你的其他情况下,当你调用'handleConnection = retainedFragment.getHandleConnection();'这个句柄连接null?我想这是空的。在将其设置为'remoteFragment'之前,您应该有一个可空性检查。 – Sabeeh

+0

不,handleConnection不为空。我一直在使用Android doc中提到的RetainedFragment模式:[link](http://developer.android.com/guide/topics/resources/runtime-changes.html) – pLesur

0

您需要添加到您的活动登记AndroidManifes.xml类似的东西:<activity android:configChanges="orientation|screenSize"/>

阅读this文章