更改方向更改我在 DrawerLayout 中的片段
Change orientation change my fragment in DrawerLayout
我的 DrawerLayolut
中有三个 fragments
:
片段A
片段 B
片段 C
默认情况下(在应用程序的初始化中)我加载 FragmentA
:并且,如果我去,例如, FragmentB
效果很好。
问题: 当我在 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
不过,正如您所说,不推荐这样做,更好的解决方案是使用 onSavedInstanceState
和 onRestoreInstanceState
,例如:
@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
我的 DrawerLayolut
中有三个 fragments
:
片段A
片段 B
片段 C
默认情况下(在应用程序的初始化中)我加载
FragmentA
:并且,如果我去,例如,FragmentB
效果很好。
问题: 当我在 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
不过,正如您所说,不推荐这样做,更好的解决方案是使用 onSavedInstanceState
和 onRestoreInstanceState
,例如:
@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