返回片段后出现白屏 [英] White screen after going back through Fragments

查看:386
本文介绍了返回片段后出现白屏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个运行良好的Android应用程序,但是我发现了一个令人讨厌的错误,我不知道该怎么解决.

I've got an Android application which is working fine, but I've found an annoying bug which I don't know what else do to solve it.

我的应用程序只有一个活动(称为HomeActivity;好,加上首选项活动")和很多片段. HomeActivity使用此方法管理每个Fragment的替换(可在以下 thread ,并特别关注以下评论):

My application has a single Activity (call it HomeActivity; well, plus the Preferences Activity) and lots of Fragments. HomeActivity manages the replacement of every Fragment using this method (found in this 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();
    }

}

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

To replace a Fragment, what I do is the following:

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

这是问题所在:我浏览了几个片段(例如,其中3个).然后,我想返回,所以我按了两次.当我到达堆栈中的最后一个时,将显示白色屏幕(即在应该放置片段的位置显示白色).奇怪的是,如果我长按主页按钮以显示最近的应用程序,然后再次选择我的应用程序,则片段会正确加载.

Here it's the problem: I navigate through several Fragments (say, 3 of them). Then, I wanna go back, so I press back 2 times. When I arrive to the last within the stack, a white screen is shown (i.e. white is shown in the place where the Fragment should be). The odd thing is that if I do a long press to my home button to show the recent apps and I choose again my application, the fragment gets loaded correctly.

我假设我的switchFragment方法中可能有某些内容,例如可能是与backStack相关的任何问题.一个重要的细节是,我在每个Fragment中都编写了所谓的空构造函数.

I assume there might be something within my switchFragment method, e.g. it may be any issue related to the backStack. One important detail is that I've got written the so called empty constructor in every Fragment.

有人可以帮我吗?如果有人要求,我可以提供其他代码段.

Can anybody lend me a hand? I can provide further code pieces if anybody request them.

修改: 我认为必须输入我的sss方法:

I've considered compulsory to type my sss method:

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

}

我认为我应该重写这一部分:

I think I should rewrite this part:

}else {
     super.onBackPressed();
     popFragment();
}

解决方案: 正如@Ajay Pandya所建议的那样,我以这种方式离开了onBackPressed():

Solution: As @Ajay Pandya suggested, I leave the onBackPressed() that way:

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

}

推荐答案

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

You can manage back stack and screen for exit like

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

这篇关于返回片段后出现白屏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆