【问题标题】:How to check if the fragment exists如何检查片段是否存在
【发布时间】:2016-09-30 08:27:19
【问题描述】:

我正在尝试与活动中的片段交谈。

在我的 MainActivity 中,我添加了多个片段,没关系。

我的主要要求是如果已经添加了片段,我不想添加。

那么我们如何检查这个条件呢?

请帮我一个。

代码:-

 private void intializingFragments(Fragment fragment) {

        FragmentManager fragmentManager = getSupportFragmentManager();

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

    private View.OnClickListener intialization() {

        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int getId = v.getId();

                if (getId == R.id.first) {
                    intializingFragments(new Fragment1());

                } else if (getId == R.id.second) {
                    intializingFragments(new Fragment2());

                } else if (getId == R.id.third) {
                    intializingFragments(new Fragment3());
                } 
            }
        };
    }

【问题讨论】:

  • 使用 getFragmentManager().findFragmentByTag() 或者你也可以通过 id 找到,只要确保在事务中添加片段时为片段分配标签。
  • 使用 isAdded() 方法检查。 if(yourFragment.isAdded(){//add}else{//not added}

标签: android android-fragments


【解决方案1】:

如何在不知道其资源ID或标签的情况下检查片段是否存在:

// MyActivity.kt
val exists: Boolean = supportFragmentManager
    .fragments
    .filterIsInstance<MyFragment>()
    .isNotEmpty()

【讨论】:

    【解决方案2】:

    您可以从片段管理器中获取之前添加的片段列表。然后只需检查列表是否包含您的片段对象。

    getSupportFragmentManager().getFragments().contains(yourFragment);
    

    【讨论】:

      【解决方案3】:

      你可以在片段管理器中找到片段:

      List<Fragment> frags = getSupportFragmentManager().getFragments();
      for (Fragment f : frags) { 
        <find what you want>... 
      }
      

      或者你可以添加带有标签的片段:

      getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.frame, new MyFragment(), "frag1")
        .commit();
      

      按标签查找

      getSupportFragmentManager().findFragmentByTag("frag1");
      

      【讨论】:

        【解决方案4】:

        您可以使用 findFragmentByTag() 或 findFragmentById() 函数来获取片段。如果提到的方法返回 null 则该片段不存在。

        Fragment fragmentA = fragmentManager.findFragmentByTag("frag1");
        if (fragmentA == null) {
          // not exist
        } else {
          // fragment exist
        }
        

        例如:-http://wiki.workassis.com/android-load-two-fragments-in-one-framelayout/

        【讨论】:

          【解决方案5】:

          您可以使用 popBackStack 从管理器的片段返回堆栈中弹出最后一个片段过渡。如果没有要弹出的内容,则返回 false。 enter link description here

          【讨论】:

            【解决方案6】:
            FragmentManager fragmentManager = getSupportFragmentManager();
                 FragmentTransaction transaction = fragmentManager.beginTransaction();
                            Fragment topFragment = fragmentManager.findFragmentById(R.id.container);
                            FragmentA fragmentA = new FragmentA();
                            if(topFragment!= null)
                            {
                                transaction.remove(topFragment);
                                transaction.add(R.id.container, fragmentA, "FA");
                                transaction.commit();
                            }
                            else
                            {
                                transaction.add(R.id.container, fragmentA, "FA");
                                transaction.commit();
                            }
            

            试试这个

            private void intializingFragments(Fragment fragment) {
                  FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    Fragment topFragment = fragmentManager.findFragmentById(R.id.container);
                    if(topFragment!= null)
                    {
                        fragmentTransaction.remove(topFragment);
                        fragmentTransaction.add(R.id.fragment_container, fragment);
                        fragmentTransaction.addToBackStack(null);
                        fragmentTransaction.commit();
                    }
                    else
                    {
                        fragmentTransaction.add(R.id.fragment_container, fragment);
                        fragmentTransaction.addToBackStack(null);
                        fragmentTransaction.commit();
                    }
            
                }
            

            【讨论】:

            • FA是什么意思?
            • 当你想替换或删除片段时,像这样重新计算 FragmentA FA = (FragmentA) fragmentManager.findFragmentByTag("FA");
            • Fragment topFragment = fragmentManager.findFragmentById(R.id.container);
            • 这一行中的“容器”是什么意思?
            • Fragment topFragment = fragmentManager.findFragmentById(R.id.fragment_container);
            【解决方案7】:

            您可以通过多种方式跟踪最后添加的片段。最简单的方法是在片段管理器中找到标签。这是它的示例代码:

            public boolean isFragmentPresent(String tag) {
                Fragment frag = getSupportFragmentManager().findFragmentByTag(tag);
                if (frag instanceof HomeFragment) {
                    return true;
                } else
                    return false;
            }
            

            或者,您可以使用自己的变量来检查最后添加的片段是否与当前片段相同。这是它的示例代码:

            public boolean isCurrentFragment(Fragment fragment) {
                if (fragment instanceof HomeFragment && getLastAddedFragment() instanceof HomeFragment) { // getLastAddedFragment() is a method which return the last added fragment instance
                    return true;
                } else
                    return false;
            }
            

            你可以像这样使用它:

            if (isCurrentFragment(new HomeFragment())) {
                // Last added Fragment is the HomeFragment
            }
            

            【讨论】:

              猜你喜欢
              • 2014-10-23
              • 1970-01-01
              • 2018-12-17
              • 1970-01-01
              • 1970-01-01
              • 2018-04-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多