findFragmentById()和findFragmentByTag()

时间:2017-04-20 13:16:45

标签: android fragment

我创建了一个片段来显示我的回收者视图。所以我使用方法 findFragmentById()来查找我的xml文件。问题是每次我旋转屏幕时,它都会在另一个上面再创建一个回收站视图堆栈。 这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListFragment savedFragment = (ListFragment) getSupportFragmentManager().findFragmentById(R.id.list_recyclerview);

    if(savedFragment == null)
    {
        ListFragment fragment  = new ListFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.place_holder,fragment);
        fragmentTransaction.commit();

    }
}

但是当我使用方法 findFragmentByTag()时,它没有发生。

任何人都可以向我解释这两种方法有什么区别?

1 个答案:

答案 0 :(得分:19)

此方法允许您检索以前添加的片段实例,而无需保留对该片段实例的引用。两者之间的区别在于它们跟踪它的方式,如果它具有给定的TAG,您之前在添加时分配给片段事务,或者仅通过检索给定容器中的最后添加的片段。让我们来看看这两种方法:

<强> findFragmentByTag

此方法允许您检索先前添加的具有给定标记的片段的实例,无论其添加到哪个容器。这是通过以下方式完成的:

让我们先添加一个带有TAG的片段:

MyFragment fragment  = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.place_holder,fragment,"myFragmentTag");
fragmentTransaction.commit();

然后检索片段的实例:

fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag("myFragmentTag");
if(fragment != null){
    // ok, we got the fragment instance, but should we manipulate its view?
}

如果fragment不为null,则表示您获得了引用该片段TAG的实例。请记住,使用此方法,即使您获得实例,也不意味着片段可见或添加到容器中,这意味着您应该额外检查是否要处理其中的某些内容&#39;的观点,用:

if(fragment != null && fragment.isAdded()){
    // you are good to go, do your logic
}

<强> findFragmentById

在此方法中,您将获得最后添加的片段的实例到给定容器。因此,让我们假设我们在没有标签的情况下向容器中添加一个片段(注意你也可以给它一个标签并以这种方式检索它):

MyFragment fragment  = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();

然后检索它的实例你使用容器ID:

fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if(fragment != null){
    // you are good to go, do your logic
}

此时,由于我们使用了findFragmentById,因此我们知道它是给定容器的可见片段,因此您无需检查它是否已添加到容器中。