【问题标题】:White screen after going back through Fragments回到 Fragments 后出现白屏
【发布时间】:2016-06-09 09:41:51
【问题描述】:

我有一个运行良好的 Android 应用程序,但我发现了一个烦人的错误,我不知道还有什么办法可以解决它。

我的应用程序有一个 Activity(称为 HomeActivity;嗯,加上 Preferences Activity)和许多 Fragment。 HomeActivity 使用此方法管理每个 Fragment 的替换(在此 thread 中找到,尤其是在以下 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 个)。然后,我想回去,所以我按了 2 次。当我到达堆栈中的最后一个时,会显示一个白色屏幕(即在 Fragment 应该所在的位置显示白色)。奇怪的是,如果我长按主页按钮以显示最近的应用程序并再次选择我的应用程序,片段就会正确加载。

我认为我的 switchFragment 方法中可能有一些东西,例如它可能是与 backStack 相关的任何问题。一个重要的细节是我在每个 Fragment 中都编写了所谓的空构造函数。

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

编辑: 我认为必须输入我的 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();
        }
    }

}

【问题讨论】:

  • 您应该在此处发布您的活动以获取更多信息。当您添加到后台堆栈的所有片段都被弹出时,白屏显示 --> 结果,您的活动中没有视图。

标签: android android-fragments back-stack


【解决方案1】:

您可以像管理退出堆栈和屏幕一样

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

【讨论】:

    【解决方案2】:

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

    您在启动应用程序时恢复它的原因是因为您再次添加了片段。

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

    【讨论】:

    • 您的回答并没有直接解决我的问题,但它给了我“啊哈!”片刻。我在片段管理器中使用.replace() 而不是.add()。弹出 backstack 无法显示我之前的片段,因为没有片段。我用我的新片段替换了它!
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多