其他分享
首页 > 其他分享> > android – 回到Fragments后的白屏

android – 回到Fragments后的白屏

作者:互联网

我有一个Android应用程序工作正常,但我发现了一个烦人的错误,我不知道还有什么办法解决它.

我的应用程序有一个Activity(称之为HomeActivity;好吧,加上Preferences Activity)和很多片段. HomeActivity使用这种方法管理每个片段的替换(在此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();
    }

}

要替换片段,我所做的是以下内容:

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

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

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

标签:back-stack,android,android-fragments
来源: https://codeday.me/bug/20190824/1705889.html