Android:方向改变后Fragment的onCreateView方法再次调用

3

我实现了一个应用程序,其中包括横屏和竖屏两种布局。横屏模式下的布局位于layout-land中。我为竖屏布局分配了fragment1,并为横屏布局分配了fragment2。我在每个片段中重写了onCreateView方法。

我有一个静态变量来知道当前的片段。我在onCreateView中进行了分配(1表示fragment1,2表示fragment2)。

我的问题是当屏幕方向为横屏时,静态值仍然是1。

我调试了应用程序的方向。当我将方向从竖屏切换到横屏时,首先调用的是fragment2的onCreateView方法,然后再次调用fragment1的onCreateView方法。这样静态值就被覆盖了。

我不知道为什么会在调用fragment2的方法后再次调用fragment1的方法?我想为正确的片段分配正确的值。

非常抱歉我的英语不好。

谢谢。

4个回答

2

您不需要保存任何东西! 只需让您的活动处理方向更改即可。 在AndroidManifest.xml中放置此内容:

    <activity
        android:name=".MainActivity"
        android:configChanges="orientation|screenSize" >
    </activity>

1

你需要保存bundle,并且必须重写onsavedinstance方法以便activity不会再次创建。

首先,当方向被改变时,Android会检查savedinstancestate,并调用onsavedinstance方法(如果被实现)。


0
在每个片段的onCreate方法中,您必须调用该方法。
getActivity().setRequestedOrientation(requestedOrientation)

0
如果你的Fragments在横屏和竖屏有不同的“业务逻辑”,则应该有两个特殊的Fragment实现。如果它们只是布局不同,则使用1个Fragment实现,并创建2个布局,每个方向一个。
在Activity.onCreate()中实例化和创建您的Fragments。但是不要将当前Fragment保存在静态变量中。相反,询问FragmentManager是否已经添加了一个Fragment。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Fragment myFragment = getSupportFragmentManager().findFragmentByTag("myTag");
    if(myFragment == null){
        //no Fragment has been added
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(new MyFragment1(), "myTag");
        transaction.commit();
    }else{
        //the fragment has been added already, possibley before orientation change
        //you could check its type and replace it
        if(fragment instanceof MyFragment1){

        }else if(fragment instanceof MyFragment2{

        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接