Android 通过碎片返回后的白色屏幕

Android 通过碎片返回后的白色屏幕,android,android-fragments,back-stack,Android,Android Fragments,Back Stack,我有一个Android应用程序,它工作得很好,但我发现了一个恼人的bug,我不知道还能做些什么来解决它 我的应用程序只有一个活动(称为HomeActivity;加上Preferences活动)和许多片段。HomeActivity使用此方法管理每个片段的替换(可在此找到,特别是查看以下内容): 要替换片段,我将执行以下操作: switchFragment(new FragmentEuskalmet(), FragmentEuskalmet.FRAGMENT_NAME); 问题在于:我浏览了几个片

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

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

要替换片段,我将执行以下操作:

switchFragment(new FragmentEuskalmet(), FragmentEuskalmet.FRAGMENT_NAME);
问题在于:我浏览了几个片段(比如说,其中的3个片段)。然后,我想回去,所以我按了两次。当我到达堆栈中的最后一个时,将显示一个白色屏幕(即,在碎片应该所在的位置显示白色)。奇怪的是,如果我长按“我的主页”按钮以显示最近的应用程序,然后再次选择我的应用程序,片段就会正确加载

我假设在我的
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();
        }
    }

}

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

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


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

您可以管理后堆栈和屏幕,以便退出

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

你应该在这里发布你的活动以获取更多信息。当您添加到后台堆栈的所有片段弹出-->时,白色屏幕显示,结果是活动中没有视图。您的回答没有直接解决我的问题,但它给了我“啊哈!”的时刻。我在片段管理器中使用了
.replace()
而不是
.add()
。弹出背景无法显示我以前的片段,因为没有。我用我的新碎片替换了它!
@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}