我创建了一个片段来显示回收器视图。所以我使用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()方法时,它并没有发生。
有谁能告诉我这两种方法有什么不同吗?

最佳答案

此方法允许您检索以前添加的片段实例,而无需保留对该片段实例的引用。两者之间的区别在于它们跟踪片段事务的方式,如果是使用给定的标记,则是在添加片段事务时先前分配给它的,或者只是通过检索给定容器中最后添加的片段。让我们看看这两种方法:
FindFragmentByTag:文件名:
此方法允许您使用给定的标记检索先前添加的片段的实例,而不必考虑该片段添加到的容器。按以下方式执行:
我们首先添加一个带有标记的片段:

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不为空,则意味着您获得了引用该片段标记的实例。请记住,使用此方法,即使获得实例,也不意味着片段可见或添加到容器中,这意味着如果要处理其视图中的某些内容,则应进行额外检查,方法是:
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我们知道它是给定容器的可见片段,所以您不需要检查它是否添加到容器中。

07-27 16:50