Android 在popbackstack之后获取空片段

Android 在popbackstack之后获取空片段,android,android-fragments,Android,Android Fragments,当我按下后退按钮时,得到的碎片为空。无法恢复先前的片段。尝试了许多解决方案,但都不起作用。解决这个问题的办法是什么?我不知道怎么解决这个问题 private void displayView(int position) { Fragment fragment = null; switch (position) { case 0: fragment = mHomeFragmentInstance; break; case 1:

当我按下后退按钮时,得到的碎片为空。无法恢复先前的片段。尝试了许多解决方案,但都不起作用。解决这个问题的办法是什么?我不知道怎么解决这个问题

private void displayView(int position) {
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = mHomeFragmentInstance;
        break;
    case 1:
        fragment = mOrderFragmentInstance;
        break;
    case 2:
        fragment = mOrdersheetFragmentInstance;
        break;
    case 3:
        fragment = mMyorderwidgetFragmentInstance;
        break;
    case 4:
        Intent intent=new Intent(this,LoginActivity.class);
        startActivity(intent);
        clearValues();
        finish();
        return;
    default:
        fragment = mHomeFragmentInstance;
        break;
    }

    if (fragment != null) {
        replaceFragment(fragment, position);
    }

}


/**
 * When using the ActionBarDrawerToggle, you must call it during
 * onPostCreate() and onConfigurationChanged()...
 */

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

public void replaceFragment(Fragment fragment){     
    if (fragment != null) {
        Fragment currentFragment = this.getSupportFragmentManager().findFragmentById(R.id.frame_container);
        if(null != currentFragment ){
            if(currentFragment.equals(fragment)){
                return;
            }else{
                getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
            }
        }

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.frame_container, fragment);
        ft.addToBackStack(null);
        ft.commit();

    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

public void replaceFragment(Fragment fragment, int position){
    adapter.selectItem(position);
    Log.i("TAG", "replaceFragment:"+fragment.getClass().getName()+":"+position);
    replaceFragment(fragment);
    Log.i("TAG", "Add"+fragment.getClass().getName()+"backStackFragment");

    if(fragment.equals(mHomeFragmentInstance)){
        Log.i("TAG", "clear backStackFragment");
        backStackFragment.clear();
        backStackFragment.add(mHomeFragmentInstance);
    }

    mDrawerList.setItemChecked(position, true);
    mDrawerList.setSelection(position);
    setTitle(navMenuTitles[position]);
    mDrawerLayout.closeDrawer(drawerContainer);
}


@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    //getActionBar().setTitle(Html.fromHtml("<font color='#983A1B'>" + title + "</font>"));
    View view = getActionBar().getCustomView();
    //((TextView)view.findViewById(R.id.title)).setText(Html.fromHtml("<font color='#983A1B'>" + title + "</font>"));
    ((TextView)view.findViewById(R.id.title)).setText(Html.fromHtml("<font color='"+ ApplicationInfo.getPlfColor(this)+"'>" + title + "</font>"));
}

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    if(fm.getBackStackEntryCount() > 1) {
        fm.popBackStack();
    }else {
        //super.onBackPressed();
        finish();
    }
}

}
private void显示视图(int位置){
片段=空;
开关(位置){
案例0:
fragment=mHomeFragmentInstance;
打破
案例1:
fragment=mOrderFragmentInstance;
打破
案例2:
fragment=mOrdersheetFragmentInstance;
打破
案例3:
fragment=mMyorderwidgetFragmentInstance;
打破
案例4:
Intent Intent=新Intent(这是LoginActivity.class);
星触觉(意向);
clearValues();
完成();
返回;
违约:
fragment=mHomeFragmentInstance;
打破
}
if(片段!=null){
替换片段(片段,位置);
}
}
/**
*使用ActionBarDrawerToggle时,必须在
*onPostCreate()和onConfigurationChanged()。。。
*/
@凌驾
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@凌驾
公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
公共无效替换碎片(碎片碎片){
if(片段!=null){
Fragment currentFragment=this.getSupportFragmentManager().findFragmentById(R.id.frame_容器);
if(null!=currentFragment){
if(currentFragment.equals(fragment)){
返回;
}否则{
getSupportFragmentManager().beginTransaction().remove(currentFragment.commit();
}
}
FragmentManager fm=getSupportFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ft.更换(R.id.框架/容器,碎片);
ft.addToBackStack(空);
ft.commit();
}否则{
//创建片段时出错
Log.e(“MainActivity”,“创建片段时出错”);
}
}
公共void replaceFragment(片段片段,int位置){
适配器。选择项目(位置);
Log.i(“TAG”、“replaceFragment:+fragment.getClass().getName()+”:“+position”);
替换片段(片段);
Log.i(“TAG”、“Add”+fragment.getClass().getName()+backStackFragment”);
if(fragment.equals(mHomeFragmentInstance)){
Log.i(“标记”,“清除反背景碎片”);
backbackfragment.clear();
添加(mHomeFragmentInstance);
}
mDrawerList.setItemChecked(位置,true);
mDrawerList.setSelection(职位);
setTitle(导航工具[位置]);
mDrawerLayout.closeDrawer(抽屉容器);
}
@凌驾
公共无效设置标题(字符序列标题){
mTitle=标题;
//getActionBar().setTitle(Html.fromHtml(“+title+”);
视图=getActionBar().getCustomView();
//((TextView)view.findviewbyd(R.id.title)).setText(Html.fromHtml(“+title+”));
((TextView)view.findviewbyd(R.id.title)).setText(Html.fromHtml(“+title+”));
}
@凌驾
public void onBackPressed(){
FragmentManager fm=getSupportFragmentManager();
if(fm.getBackbackEntryCount()>1){
fm.popbackbackstack();
}否则{
//super.onBackPressed();
完成();
}
}
}

在片段之间转换时,只需添加addToBackStack,如下所示:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();

如果您编写addToBackStack(null),它将自行处理,但如果您提供标记,则应手动处理。

write onBackPressed()方法并显示所需内容。这是一种活动方法。或者重写方法实际上它在活动中被重写。通过删除这些行Fragment currentFragment=this.getSupportFragmentManager().findFragmentById(R.id.frame_容器)来检查此问题;if(null!=currentFragment){if(currentFragment.equals(fragment)){return;}否则{getSupportFragmentManager().beginTransaction().remove(currentFragment.commit();}}