有个需求,大概就是点击FragmentA的按钮跳转到FragmentB,搜了一下,解决方法是这样的:
1 @Override//核心代码
2 public void onClick(View v) {
3 //获取fragment的实例
4 Fragment fragment=new Fragment();
5 //获取Fragment的管理器
6 FragmentManager fragmentManager=getFragmentManager();
7 //开启fragment的事物,在这个对象里进行fragment的增删替换等操作。
8 FragmentTransaction ft=fragmentManager.beginTransaction();
9 //跳转到fragment,第一个参数为所要替换的位置id,第二个参数是替换后的fragment
10 ft.replace(R.layout.fragment1_layout,fragment);
11 //提交事物
12 ft.commit();
13 }
But,有个问题就是,FragmentA是在ViewPager2里面,我怎么知道replace()的第一个参数怎么填......
主要难点在于,我不知道当前这个FragmentA的id是什么。所以,现在要解决的问题就是找到FragmentA的id。方法其实很简单:
this@FragmentA.parentFragment.id
跳转的代码:
val fragmentManager = this@FragmentA.activity?.supportFragmentManager
this@FragmentA.parentFragment?.let { it1 ->
fragmentManager?.beginTransaction()?.replace(
it1.id, FragmentA())?.commit()
}
现在可以跳转了,没什么问题,但是,为什么要经过parentFragment?
断点看了一下,FragmentA的id值为0,FragmentA.parentFragmentd的id值是2131231036
思考了一下,这里的代码不应该这样写,正确的写法应该是:
val fragmentManager = this@AccountFragment.activity?.supportFragmentManager
var fragment: Fragment? = this@AccountFragment
var fragmentId = fragment?.id
while (fragmentId == 0 && fragment != null) {
fragment = fragment.parentFragment
fragmentId = fragment?.id
}
fragmentId?.let { it1 ->
fragmentManager
?.beginTransaction()
?.replace(it1, AddAccountFragment())
?.commit()
}
即,从FragmentA开始向上查找,直到找到一个Fragment id为止。
就是说,FragmentB替换的可能不止是FragmentA,还可能是嵌套了FragmentA的更高层的Fragment。
仔细观察了一下表现,跳转的时候确实覆盖了FragmentA没有覆盖的部分(viewPager高度设小一点),符合预期。