通过 Fragments 返回后出现白屏
White screen after going back through Fragments
我有一个 Android 应用程序,它运行良好,但我发现了一个烦人的错误,我不知道还有什么办法可以解决它。
我的应用程序有一个 Activity(称之为主页Activity;好吧,还有首选项 Activity)和许多片段。 HomeActivity 使用此方法管理每个 Fragment 的替换(在此 thread and especially looking into the following comment 中找到):
public void switchFragment(Fragment pFragment, String pTagFragment){
String backStateName = pTagFragment;
boolean fragmentPopped = mFragmentManager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped){ //fragment not in back stack, create it.
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(R.id.content_frame, pFragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
要替换一个 Fragment,我的做法是:
switchFragment(new FragmentEuskalmet(), FragmentEuskalmet.FRAGMENT_NAME);
这就是问题所在:我浏览了多个片段(例如,其中 3 个)。然后,我想回去,所以我按了两次。当我到达堆栈中的最后一个时,会显示一个白色屏幕(即白色显示在片段应该出现的地方)。奇怪的是,如果我长按我的主页按钮以显示最近的应用程序,然后再次选择我的应用程序,片段就会正确加载。
我假设我的 switchFragment
方法中可能有一些东西,例如这可能是与 backStack 相关的任何问题。一个重要的细节是我在每个片段中都写了所谓的空构造函数。
有人可以帮我吗?如果有人需要,我可以提供更多代码片段。
编辑:
我认为必须输入我的 sss 方法:
@Override
public void onBackPressed(){
invalidateOptionsMenu();
if(CURRENT_FRAGMENT != FragmentMapa.FRAGMENT_NAME){//"com.ingartek.bizkaimove.ui.FragmentMapa"){
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightRelativeLayout);
}
if(mDrawer.isDrawerOpen(GravityCompat.START)){
mDrawer.closeDrawer(GravityCompat.START);
setToolbarSubtitle(mSubtitleAux);
}else{
setToolbarSubtitle(getString(R.string.app_name_subtitle));
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
//finish();
showExitDialog();
}else {
super.onBackPressed();
popFragment();
}
}
}
我觉得我应该重写这部分:
}else {
super.onBackPressed();
popFragment();
}
解法:
正如@Ajay Pandya 所建议的那样,我将 onBackPressed() 留在原处:
@Override
public void onBackPressed(){
invalidateOptionsMenu();
if(CURRENT_FRAGMENT != FragmentMapa.FRAGMENT_NAME){//"com.ingartek.bizkaimove.ui.FragmentMapa"){
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightRelativeLayout);
}
if(mDrawer.isDrawerOpen(GravityCompat.START)){
mDrawer.closeDrawer(GravityCompat.START);
setToolbarSubtitle(mSubtitleAux);
}else{
setToolbarSubtitle(getString(R.string.app_name_subtitle));
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
//finish();
showExitDialog();
}else{
mFragmentManager.popBackStackImmediate();
}
} else {
super.onBackPressed();
}
}
}
这是因为您正在以编程方式添加所有片段。在按下后退按钮时,您最终也删除了您添加的第一个片段。
你在启动应用程序时得到它的原因是因为你再次添加了片段。
我建议覆盖您的后退按钮。每当你弹出片段时,检查它是否不是你的第一个片段然后弹出它。
您可以像
一样管理返回堆栈和退出屏幕
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
我有一个 Android 应用程序,它运行良好,但我发现了一个烦人的错误,我不知道还有什么办法可以解决它。
我的应用程序有一个 Activity(称之为主页Activity;好吧,还有首选项 Activity)和许多片段。 HomeActivity 使用此方法管理每个 Fragment 的替换(在此 thread and especially looking into the following comment 中找到):
public void switchFragment(Fragment pFragment, String pTagFragment){
String backStateName = pTagFragment;
boolean fragmentPopped = mFragmentManager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped){ //fragment not in back stack, create it.
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(R.id.content_frame, pFragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
要替换一个 Fragment,我的做法是:
switchFragment(new FragmentEuskalmet(), FragmentEuskalmet.FRAGMENT_NAME);
这就是问题所在:我浏览了多个片段(例如,其中 3 个)。然后,我想回去,所以我按了两次。当我到达堆栈中的最后一个时,会显示一个白色屏幕(即白色显示在片段应该出现的地方)。奇怪的是,如果我长按我的主页按钮以显示最近的应用程序,然后再次选择我的应用程序,片段就会正确加载。
我假设我的 switchFragment
方法中可能有一些东西,例如这可能是与 backStack 相关的任何问题。一个重要的细节是我在每个片段中都写了所谓的空构造函数。
有人可以帮我吗?如果有人需要,我可以提供更多代码片段。
编辑: 我认为必须输入我的 sss 方法:
@Override
public void onBackPressed(){
invalidateOptionsMenu();
if(CURRENT_FRAGMENT != FragmentMapa.FRAGMENT_NAME){//"com.ingartek.bizkaimove.ui.FragmentMapa"){
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightRelativeLayout);
}
if(mDrawer.isDrawerOpen(GravityCompat.START)){
mDrawer.closeDrawer(GravityCompat.START);
setToolbarSubtitle(mSubtitleAux);
}else{
setToolbarSubtitle(getString(R.string.app_name_subtitle));
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
//finish();
showExitDialog();
}else {
super.onBackPressed();
popFragment();
}
}
}
我觉得我应该重写这部分:
}else {
super.onBackPressed();
popFragment();
}
解法: 正如@Ajay Pandya 所建议的那样,我将 onBackPressed() 留在原处:
@Override
public void onBackPressed(){
invalidateOptionsMenu();
if(CURRENT_FRAGMENT != FragmentMapa.FRAGMENT_NAME){//"com.ingartek.bizkaimove.ui.FragmentMapa"){
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightRelativeLayout);
}
if(mDrawer.isDrawerOpen(GravityCompat.START)){
mDrawer.closeDrawer(GravityCompat.START);
setToolbarSubtitle(mSubtitleAux);
}else{
setToolbarSubtitle(getString(R.string.app_name_subtitle));
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
//finish();
showExitDialog();
}else{
mFragmentManager.popBackStackImmediate();
}
} else {
super.onBackPressed();
}
}
}
这是因为您正在以编程方式添加所有片段。在按下后退按钮时,您最终也删除了您添加的第一个片段。
你在启动应用程序时得到它的原因是因为你再次添加了片段。
我建议覆盖您的后退按钮。每当你弹出片段时,检查它是否不是你的第一个片段然后弹出它。
您可以像
一样管理返回堆栈和退出屏幕@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}