gpt4 book ai didi

android - findFragmentById() 和 findFragmentByTag()

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:56 26 4
gpt4 key购买 nike

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

@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()时,它并没有发生。

谁能给我解释一下这两种方法有什么区别?

最佳答案

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

通过标签查找 fragment :

此方法允许您使用给定标签检索先前添加的 fragment 的实例,而不管它被添加到哪个容器。这是通过以下方式完成的:

让我们首先添加一个带有标签的 fragment :

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

然后检索 fragment 的实例:

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

如果 fragment 不为空,则意味着您获得了引用该 fragment TAG 的实例。请记住,使用此方法,即使您获得了实例,也不意味着该 fragment 可见或已添加到容器中,这意味着如果您打算在其 View 中处理某些内容,则应进行额外检查:

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

findFragmentById:

在此方法中,您将获取给定容器中最后添加 fragment 的实例。因此,假设我们向容器中添加了一个没有标签的 fragment (请注意,您也可以给它一个标签并以这种方式检索它):

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,我们知道它是给定容器的可见 fragment ,因此您无需检查它是否已添加到容器中。

关于android - findFragmentById() 和 findFragmentByTag(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com