更改方向更改我在 DrawerLayout 中的片段

Change orientation change my fragment in DrawerLayout

我的 DrawerLayolut 中有三个 fragments:

问题: 当我在 FragmentB 中旋转屏幕时,我回到 FragmentA

我不知道如何避免这种情况。我尝试使用 AppCompatActivity:

onCreate 中的下一个代码
Fragment mFragment = null;

if(getSupportFragmentManager().findFragmentById(R.id.myframe) == null) {

   mFragment = new CalendarioFragment();
   getSupportFragmentManager().beginTransaction().add(R.id.myframe, mFragment ).commit();

} else {

   if(mFragment instanceof FragmentA){
       mFragment = (FragmentA) getSupportFragmentManager().findFragmentById(R.id.myframe);

   }else if(mFragment instanceof FragmentB){
       mFragment = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.myframe);

   }else if(mFragment instanceof FragmentC){
       mFragment = (FragmentC) getSupportFragmentManager().findFragmentById(R.id.myframe);

   }
}

但是没有像我预期的那样工作...有人可以帮我解决我的问题吗?拜托,欢迎任何帮助

我读到了另一个解决方案:

<activity android:name="CalActivity" android:configChanges="orientation|keyboardHidden"/>

但我认为这不值得推荐...(并且对我不起作用)

<activity android:name="CalActivity" android:configChanges="orientation|keyboardHidden"/> 一起,您需要在 Activity 中调用 onConfigurationChanged()。它应该看起来像这样:

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);
    // Your code here to replace fragments correctly
}

这是关于该主题的 Android API 指南:Handling Runtime Changes

不过,正如您所说,不推荐这样做,更好的解决方案是使用 onSavedInstanceStateonRestoreInstanceState,例如:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putInt("currentFragment", 2);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    int fragmentNum = savedInstanceState.getInt("currentFragment");
    // Restore fragment based on fragmentNum
}

查看此问题了解更多:Saving Activity State on Android