【问题标题】:Unable to popBack to expected fragment in android无法popBack到android中的预期片段
【发布时间】:2016-07-22 15:15:50
【问题描述】:

我在 android 中遇到 popBackStack 的问题。我有 3 个导航抽屉 FragA、FragB、FragC 的 MenuItem。我的问题是,当我单击 FragA,然后单击 FragB,然后单击 FragC,我的总片段将计为 3。然后按回,它将删除 FragC 并恢复 FragB . 我希望当我按下 Back 时它会返回到 FragA。下面是我的代码。请给我一些解决方案。提前致谢。

添加片段堆栈时的代码。

Fragment fragment = null;
if(menuItem.getItemId() == R.id.home){
    fragment = new FirstFragment();
}
if(menuItem.getItemId() == R.id.setting){
    fragment = new SecondFragment();
}
if(menuItem.getItemId()==R.id.trash){
    fragment = new ThirdFragment();
}
this.replaceFragment2(fragment);

方法替换片段

private void replaceFragment2(Fragment fragment){
    String backStatName = fragment.getClass().getName();
    FragmentManager manager = getSupportFragmentManager();
    boolean fragmentPopped = manager.popBackStackImmediate(backStatName,0);
    if(!fragmentPopped){ //if fragment not in backstack
        FragmentTransaction transaction =  manager.beginTransaction();
        transaction.replace(R.id.flContent,fragment);
        transaction.addToBackStack(backStatName);
        transaction.commit();
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个

    Fragment fragment = null;
    if(menuItem.getItemId() == R.id.home){
        fragment = new FirstFragment();
    }
    if(menuItem.getItemId() == R.id.setting){
        fragment = new SecondFragment();
    }
    if(menuItem.getItemId()==R.id.trash){
        fragment = new ThirdFragment();
    }
    
    
         if (frag != null) {
    
                openFragment(frag);
                dLayout.closeDrawers();
                dLayout.closeDrawers();
                    return true;
                }
    
    
    
    
        public void openFragment(Fragment fragment) {
        String backStateName = fragment.getClass().getName();
        FragmentManager manager = getSupportFragmentManager();
        //fragment not in back stack, create it.
        FragmentTransaction ft = manager.beginTransaction();
        if (!fragments.contains(backStateName)) {
    
    
            // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
            ft.replace(R.id.frame, fragment);
            ft.addToBackStack(backStateName);
            ft.commit();
    
            fragments.add(backStateName);
            System.out.println("backStateName" + fragments);
    
        } else {
            // ft.setCustomAnimations(R.anim.right_in, R.anim.left_out,R.anim.left_in, R.anim.right_out);
            ft.replace(R.id.frame, fragment);
            ft.commit();
        }
    
    }
    

    ONCREATE

     final android.app.FragmentManager fm = getFragmentManager();
    
        fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
    
                if (getFragmentManager().getBackStackEntryCount() == 0) {
                    finish();
                }
    
            }
        });
    

    onBackPressed

      @Override
      public void onBackPressed() {
        if (dLayout.isDrawerOpen(GravityCompat.START)) {
            dLayout.closeDrawer(GravityCompat.START);
        } 
            super.onBackPressed();
        }
    

    【讨论】:

    • 谢谢。让我试试。
    【解决方案2】:

    试试这个,

    将您的FragA 替换为FragB 之类的,

    fragmentManager.beginTransaction().replace(R.id.fragmentContainer, new FragB()).disallowAddToBackStack();
    

    并添加您的活动

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

    【讨论】:

    • 你能解释一下为什么disallowAddToBackStack()吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多