我创建了一个Fragment来显示我的Recycler视图.所以我使用方法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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用findFragmentByTag()方法时 ,它并没有发生.
愿任何人向我解释这两种方法有什么区别?
Ric*_*rdo 23
此方法允许您检索以前添加的片段实例,而无需保留对该片段实例的引用.两者之间的区别在于它们跟踪它的方式,如果它具有给定的TAG,您之前在添加时分配给片段事务,或者仅通过检索给定容器中的最后添加的片段.我们来看看这两种方法:
findFragmentByTag:
此方法允许您检索先前添加的具有给定标记的片段的实例,而不管它添加到哪个容器.这是通过以下方式完成的:
让我们首先添加一个带有TAG的片段:
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.place_holder,fragment,"myFragmentTag");
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
然后检索片段的实例:
fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag("myFragmentTag");
if(fragment != null){
// ok, we got the fragment instance, but should we manipulate its view?
}
Run Code Online (Sandbox Code Playgroud)
如果fragment不为null,则表示您获得了引用该片段TAG的实例.请记住,使用此方法,即使您获得实例,也不意味着片段可见或添加到容器中,这意味着如果您要在其视图中处理某些内容,则应进行额外检查,其中:
if(fragment != null && fragment.isAdded()){
// you are good to go, do your logic
}
Run Code Online (Sandbox Code Playgroud)
findFragmentById:
在此方法中,您将获取最后添加的片段的实例到给定容器.所以让我们假装我们在没有标签的情况下向容器中添加一个片段(注意你也可以给它一个标签并以这种方式检索它):
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
然后要检索它的实例,您使用容器ID:
fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if(fragment != null){
// you are good to go, do your logic
}
Run Code Online (Sandbox Code Playgroud)
此时,因为我们findFragmentById知道它是给定容器的可见片段,所以您不需要检查它是否被添加到容器中.
| 归档时间: |
|
| 查看次数: |
16373 次 |
| 最近记录: |