Fragment跳转——如何获取Fragment Id

有个需求,大概就是点击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高度设小一点),符合预期。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android中,可以使用FragmentManager来管理Fragment跳转。具体步骤如下: 1. 获取FragmentManager对象: FragmentManager fragmentManager = getSupportFragmentManager(); 2. 开始Fragment事务: FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 3. 创建要跳转Fragment对象: MyFragment myFragment = new MyFragment(); 4. 调用FragmentTransaction的replace方法,将当前Fragment替换为要跳转FragmentfragmentTransaction.replace(R.id.container, myFragment); 5. 调用FragmentTransaction的commit方法,提交事务: fragmentTransaction.commit(); 其中,R.id.container是一个FrameLayout,用于显示Fragment的布局容器。 ### 回答2: 在Android中,使用Fragment的一个常见的需求是在一个Fragment中点击某个按钮或者view后跳转到另一个Fragment,也就是所谓的Fragment跳转Fragment。 在实现这个需求之前,需要先明确一些基本概念。在Android中,使用Fragment的最基本的方式是使用FragmentTransaction来进行添加、移除、替换、隐藏等操作。当一个新的Fragment需要被展示时,也就是所谓的Fragment跳转Fragment时,我们需要使用FragmentTransaction来进行以下步骤: 1. 创建要跳转Fragment实例。 2. 使用FragmentManager获取FragmentTransaction实例。 3. 调用FragmentTransaction的替换方法(replace)来将当前Fragment替换为要跳转Fragment。 4. 添加到回退栈(addToBackStack)中。 5. 调用FragmentTransaction的提交方法(commit)来提交这一操作。 示例代码如下: ``` FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, new MyFragment()); transaction.addToBackStack(null); transaction.commit(); ``` 在这段代码中,我们使用了SupportFragmentManager来获取了一个FragmentTransaction对象,并将其替换为了新的Fragment,并将其添加到回退栈中。最后,调用了提交方法来提交这一操作。 需要注意的是,在跳转Fragment时,我们也可以传递一些数据给新的Fragment,例如某些参数、对象等。我们可以使用Bundle将这些数据打包传递给新的Fragment。在新的Fragment中,我们可以使用getArguments()方法获取这些数据。 总体来说,Fragment跳转FragmentAndroid中常见的一种场景,使用FragmentTransaction进行操作可以轻松地实现这一需求。在进行操作时,需要注意保存当前状态并添加到回退栈中,以便用户可以使用返回按钮返回上一个Fragment。 ### 回答3: Fragment 跳转 Fragment 是指在一个 Fragment 中通过代码的方式启动另一个 Fragment。在实际开发中,这种方式常常被用于实现页面之间的跳转或者数据的传递等操作。 在 Android 中,Fragment 跳转 Fragment 有多种方式,其中最常用的方式是使用 FragmentManager 开启一个新的 Fragment,具体流程如下: 1. 首先需要获取FragmentManager 对象,可以通过 getActivity().getSupportFragmentManager() 方法获取当前 Fragment 所在的 Activity 的 FragmentManager 对象。 2. 创建一个新的 Fragment 对象,这个对象可以在 FragmentManager 中进行管理,在后面我们会用到。 3. 随着 Fragment 的增多,一个问题也就显现出来,如何在父 Fragment 中实现多个 Fragment 之间的切换?这个时候可以选择使用 FragmentTransaction 对象,通过 add()、replace() 等方法实现对 Fragment 的增删操作。 代码实现如下: // 获取 FragmentManager 对象 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); // 创建一个新的 Fragment 对象 SecondFragment fragment = new SecondFragment(); // 开启一个事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); // 通过 add()、replace() 等方法实现对 Fragment 的增删操作 transaction.replace(R.id.container, fragment); transaction.addToBackStack(null); // 提交事务,启动 Fragment transaction.commit(); 在这段代码中,R.id.container 表示存放 Fragment 的容器,这个可以根据实际需要进行修改。 同时,我们还需要注意 addToBackStack() 方法的使用。这个方法可以将当前 Fragment 加入 BackStack 中,也就是将当前 Fragment 放入到一个栈中,方便用户在返回时直接返回到上一个 Fragment。需要注意的是,如果不使用 addToBackStack() 方法,则用户在返回时会直接退出当前 Activity。 总之,Fragment 跳转 Fragment 功能十分重要,能够帮助开发者实现程序中各种场景的操作。通过 Fragment 嵌套来实现页面嵌套,通过 Fragment 之间的跳转来实现页面之间的切换,是 Android 开发中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值