当前位置: 首页 > 知识库问答 >
问题:

通过Fragments返回后的白色屏幕

璩涵衍
2023-03-14

我有一个运行良好的Android应用程序,但我发现了一个恼人的bug,我不知道还能做些什么来解决它。

我的应用程序只有一个活动(称之为HomeActivity;加上Preferences活动)和许多片段。HomeActivity使用此方法管理每个片段的替换(可在此线程中找到,尤其是查看以下注释):

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();
    }

}

要替换一个片段,我要做的是以下操作:

switchFragment(new FragmentEuskalmet(), FragmentEuskalmet.FRAGMENT_NAME);

问题就在这里:我浏览了几个Fragments(比如说,其中的3个)。然后,我想返回,所以我按了2次后退。当我到达堆栈中的最后一个时,会显示一个白色屏幕(即在片段应该在的地方显示白色)。奇怪的是,如果我长按我的home按钮以显示最近的应用程序并再次选择我的应用程序,片段会被正确加载。

我假设在我的switchFragment方法中可能存在一些问题,例如,它可能是与backbackback相关的任何问题。一个重要的细节是,我已经在每个片段中编写了所谓的空构造函数。

谁能帮我一把吗?如果有人要求,我可以提供更多的代码片段。

编辑:我已经考虑强制输入我的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();
        }
    }

}

共有2个答案

易俊驰
2023-03-14

这是因为您正在以编程方式添加所有片段。在按下后退按钮时,最终也会删除添加的第一个片段。

您在启动应用程序时重新获得它的原因是因为您再次添加了片段。

我建议覆盖你的后退按钮。无论何时弹出片段,请检查它是否不是第一个片段,然后弹出它。

毕富
2023-03-14

您可以像这样管理后台堆栈和退出屏幕

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
 类似资料:
  • 我的有问题,当我在手机上启动应用程序时,它会显示约0.5秒的白色屏幕。扩展了,在中,我声明为启动器,肖像模式为。 代码: XML:

  • 我已经创建了一个初始屏幕,它一开始工作得很好,但之后,它会向我显示一个白色空白屏幕,而不是我的初始屏幕图像文件。我不知道为什么会发生这种情况。 我试图改变我的风格.xml父主题,但有些主题使我的应用程序崩溃,只有主题.AppCompat.Light.NoActionBar可以工作,并给我一个空白的白屏。 styles.xml 飞溅.java 屏幕序列、线程Hibernate时间和其他一切都正常工作

  • 我以前也发布过同样的问题,但我现在再次发布,因为我在代码中发现了更多的错误并更正了它们。然而,我仍然面临着和以前一样的问题! 原始帖子:我几周前刚开始学习Python,我正在学习一个教程,用pygame构建一个数独解算器! 我现在面临的问题是,每当我尝试运行代码时,只会弹出一个黑色的空白窗口。我已经一遍又一遍地检查我的代码,但我似乎找不到问题。。。我不确定我的代码中到底是哪里出了问题,所以请原谅我

  • 问题内容: 有人遇到过这个问题吗?这看起来像是苹果代码中的错误,如果人们同意该代码应按我认为的方式工作,我将提交雷达报告。我对颜色管理不是很熟悉,因此我在问苹果问题报告之前询问我。 这是直接来自模板项目的,唯一的非模板代码是您在下面看到的内容。请注意,红色,绿色和蓝色均显示正确的组件值,但不显示白色或黑色。 如果先更改顺序,例如黑色和白色,然后更改红色,绿色和蓝色,则问题仍然存在。 这是Swift

  • 我运行以下代码: 当我运行代码时,pygame窗口打开,但它是一个空白(黑色)屏幕。我还收到以下错误消息:Traceback(最近一次呼叫last): 文件"C:/用户/Draco/OneDrive/文档/编程/graphics.py",第13行,screen.blit(img(0,0))TypeError:'pyplay.Surface'对象不可调用 我试图打开的图像保存为JPG文件。图像保存在

  • 我正在使用类似于创建简单通知的代码来创建和显示来自网络调用的通知。 问题是,我希望响应通知的活动做它的业务,然后单击backbutton将以前活动的活动放回前台,其背面堆栈保持不变。这是不考虑之前的活动是我的应用程序的一部分或其他人。 当前它正在跟踪生成的TaskStackBuilder。将其引导到应用程序层次结构上,并输出到主屏幕。这是糟糕的UI设计,因为它打破了任何人使用设备的工作流程,迫使他