方向更改后,Android保留片段不可见

方向更改后,Android保留片段不可见,android,android-fragments,android-lifecycle,android-orientation,Android,Android Fragments,Android Lifecycle,Android Orientation,我尝试减少视图层次结构,并使用android.R.id.content视图添加一个片段,该片段使用setRetainInstance(true)保持其实例的活动状态 我的活动很简单 public class MainActivity extends ActionBarActivity { @Override protected void onCreate( final Bundle savedInstanceState ) { super.onCreate( s

我尝试减少视图层次结构,并使用android.R.id.content视图添加一个片段,该片段使用setRetainInstance(true)保持其实例的活动状态

我的活动很简单

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );

        // ensure that the view is available if we add the fragment
        findViewById( android.R.id.content ).post( new Runnable(){
            @Override
            public void run() {
                // add the fragment only once to manager
                if( savedInstanceState == null ) {
                    getSupportFragmentManager()
                        .beginTransaction()
                        .add( android.R.id.content, new LoginFragment() )
                        .commit();
                }
            }
        } );
    }
}
片段创建自己的视图并使用onCreate()中的setRetainInstance(true)方法。
我的问题是,在方向更改后,我的片段没有重新添加到活动中,并且活动为空。

旋转屏幕后,savedInstanceState可能不为空,因此片段没有添加到活动中

虽然片段本身不会被杀死,但活动会被杀死,您必须再次将片段重新添加到活动中

FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentWithTag("TAG");
if(fragment == null){
    fragment = new LoginFragment();
}else{
    fm.beginTransaction()
        .add(android.R.id.content, fragment, "TAG")
        .commit();
}

顺便说一句,setRetainInstance(true)并不打算以这种方式使用。您应该允许片段被杀死并与活动一起重新创建。

我在这里找到了解决方案。但在我看来,这是一种奇怪的行为。它之所以有效,是因为活动不会被杀死。除非你有很好的理由,否则当方向改变时,你应该允许活动被终止并重新创建。