【问题标题】:Pop fragment directly at starting fragment creating an issue in android直接在开始片段时弹出片段,在 android 中创建问题
【发布时间】:2016-11-30 07:12:30
【问题描述】:

我有片段 A,B,C,D,E 并且导航流程是 A->B->C->D->E 。所以你可以说 A 是导航开始的基础片段。

导航流程

Add fragment with Backstack          Navigate to Fragment A         
A                                      E  
  -> B (Add B to backstack)                -> D (Remove E from backstack)  
B                                      D 
  -> C (Add C to backstack)                -> C (Remove D from backstack)  
C                                      C 
  -> D (Add D to backstack)                -> B (Remove C from backstack)
D                                      B 
  -> E (Add E to backstack)                -> A (Remove B from backstack)

                                      ** Trying to back from A and message pops

                                      (Press once again to exit!)

添加带有 backstack 的片段

public void pushFragmentWithBackState(Fragment DestinationFragment) throws Exception {
        try {
            Fragment SourceFragment = this;
            int viewResourceID = ((ViewGroup) SourceFragment.getView().getParent()).getId();
            FragmentManager fragmentManager = getFragmentManager();

            FragmentTransaction ft = fragmentManager.beginTransaction();
            ft.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
            ft.add(viewResourceID, DestinationFragment);
            ft.hide(SourceFragment);
            ft.addToBackStack(DestinationFragment.getClass().getName());
            ft.commit();
        } catch (Exception ex) {
            throw ex;
        }

    }

返回片段 A (选中导航到片段 A)

在这段代码中,我正在检查片段管理器中是否没有返回堆栈条目,这意味着我们在片段 A 上,并且我正在显示消息再次按下退出或只是从片段返回。

 @Override
    public void onBackPressed() {
        // code here to show dialog
        //super.onBackPressed();  // optional depending on your needs
        if (getSupportFragmentManager().getBackStackEntryCount() >= 1) {
            BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1);
            if (fragment != null) {

                if (!fragment.onFragmentBackPressed()) {
                    //super.onBackPressed();
                    if (back_pressed + 2000 > System.currentTimeMillis()) {
                        finish();
                    } else {
                        Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
                        back_pressed = System.currentTimeMillis();
                    }
                }
            } else {
                //super.onBackPressed();
                if (back_pressed + 2000 > System.currentTimeMillis()) {
                    finish();
                } else {
                    Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
                    back_pressed = System.currentTimeMillis();
                }

            }
        } else {
            if (back_pressed + 2000 > System.currentTimeMillis()) {
                finish();
            } else {
                Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
                back_pressed = System.currentTimeMillis();
            }
        }
    }

问题

如果我尝试从 E -> B 导航并删除所有堆栈独占

,我的问题就开始了

来自片段 E

 poptoBackStackFragment(B.class);

方法

public boolean poptoBackStackFragment(Class SourceFragmentClass) {
        getFragmentManager().popBackStack(SourceFragmentClass.getName(),0);
        return true;
    }

当我尝试这样做时,它不会从fragment manager 中清除片段列表(getSupportFragmentManager().getFragments()),并且位置错误,并且当再次为 ex 推送流量时。 B->C->D片段列表是这样的:

在返回片段 A 中找到这个

 BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1); 

例子:

  • 片段列表 1 位置有 B 片段
  • 片段列表4位置有C片段
  • 片段列表3位置有D片段
  • 片段列表大小也是 5 而不是 2
  • 在列表中添加片段没有顺序。通常它应该是位置 0,1,2 但它是 1,4,3

因此,我检查我是否在基本片段上的逻辑失败并且即使我不在开始片段上也会出现消息(再次按下退出)。

当我导航到 B 并删除所有片段到堆栈时,为什么片段列表不清晰? 我错过了什么吗?请帮忙。

注意:我还使用 FragmentManager.POP_BACK_STACK_INCLUSIVE 将其从堆栈中清除,但出现了同样的问题。

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    FragmentManager 上没有方法getFragments,或者说有,但它是隐藏的,不应该使用。它没有指定它应该如何在任何地方表现。我认为你应该改用getBackStackEntryAt,它应该有明确的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      相关资源
      最近更新 更多