【问题标题】:How to add BackStackEntry to BackStack if not exists如果不存在,如何将 BackStackEntry 添加到 BackStack
【发布时间】:2016-09-25 19:18:17
【问题描述】:

我已经在我的 Fragment 中添加了自定义键盘,现在我想在后按时实现关闭键盘。

class CustomKeyboard
{
    public void init(Context context) {
        //...

        FragmentManager fragmentManager = ((Activity) context).getFragmentManager();
        boolean fragmentPopped = fragmentManager.popBackStackImmediate(TAG, 0);
        if (!fragmentPopped) {
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.addToBackStack(TAG);
            fragmentTransaction.commit();
        }
    }
}

问题是每次屏幕旋转时都会调用init,因为我在public void onActivityCreated(final Bundle savedInstanceState)中创建了CustomKeyboard

fragmentPopped=false 每次,所以 CustomKeyboard 可能会多次添加到 BackStack。

我的问题:
如果不存在而不使用,是否可以将 BackStackEntry 添加到 BackStack getBackStackEntryCount()方法?

【问题讨论】:

  • 您想直接回答您的问题还是想解决您的多次通话问题?
  • @Elltz 我想直接回答我的问题
  • 我相信您的代码中某处存在错误。您应该发布更多代码。
  • 您想说您必须使用 getBackStackEntryCount() 以外的其他方法检查回栈条目,如果它为 0,则添加片段对吗?

标签: android back-stack fragment-backstack


【解决方案1】:

试试下面更新的代码。

public void init(Context context) { 

    FragmentManager fragmentManager = ((Activity) context).getFragmentManager();
    boolean fragmentPopped = fragmentManager.popBackStack(TAG, 0);
    if (!fragmentPopped) {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.addToBackStack(TAG);
        fragmentTransaction.commit();
    }
}

【讨论】:

    【解决方案2】:

    希望这段代码对你有帮助

        @Override
    public void replaceFragment (Fragment fragment, String backStackTag){
        AppAndroidUtils.hideKeyboard(this);
    
        if(StringUtils.isEmpty(backStackTag))
            backStackTag =  fragment.getClass().getName();
        FragmentManager manager = getSupportFragmentManager();
        boolean fragmentPopped = manager.popBackStackImmediate(backStackTag, 0);
    
        if (!fragmentPopped && manager.findFragmentByTag(backStackTag) == null){
            FragmentTransaction ft = manager.beginTransaction();
            ft.replace(R.id.frame_container, fragment, backStackTag);
            ft.addToBackStack(backStackTag);
            ft.commit();
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

           FragmentManager fm= getSupportFragmentManager();
      
          if(fm!=null && getSupportFragmentManager().getFragments()!=null) {
      
              boolean fragmentPopped = fm.popBackStackImmediate(TAG, 0);
      
              if (!fragmentPopped && getSupportFragmentManager().getFragments().size() == 0) {
      
                  FragmentTransaction ft = fm.beginTransaction();
                  ft.addToBackStack(TAG);
                  ft.commit();
              }
          }
      

      你也可以像这样先清理你的 Backstack,然后替换你的片段:

        private void cleanBackStack() {
          FragmentManager fm = getSupportFragmentManager();
          if (fm != null && fm.getFragments() != null) {
              if (fm.getFragments().size() > 1) {
      
                  for (int entry = 0; entry < fm.getFragments().size(); entry++) {
                      fm.popBackStackImmediate();
                  }
              } else if (fm.getFragments().size()==1){
      
                  fm.popBackStack();
              }else if(fm.getFragments().size()==0){
                    //REPLACE YOUR FRAGMENT
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-31
        • 2019-07-20
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 2018-03-07
        • 2011-12-16
        相关资源
        最近更新 更多