FragmentManager开启事务加载Fragment如何不需要传入容器ID?
关于Fragment加载是否可不用容器ID或直接传入FragmentContainerView实例的解答
- 可以直接通过FragmentContainerView实例获取ID传入,无需手动写固定R.id常量
原生FragmentTransaction的replace、add方法要求传入容器ID,而View本身自带getId()方法,直接调用实例的该方法即可,示例代码:// 先拿到FragmentContainerView实例 FragmentContainerView fragmentContainer = findViewById(R.id.fragment_container_view); // 直接用实例的ID加载Fragment,无需手动传入ID常量 fragmentManager.beginTransaction() .replace(fragmentContainer.getId(), mapFragment) .commit(); - 完全不用预先定义容器ID的实现方式
如果不想提前在XML中定义容器ID,可通过动态生成ID的方式实现,全程只操作FragmentContainerView实例即可,API 17及以上可使用View.generateViewId()生成全局唯一ID,示例代码:// 动态创建FragmentContainerView实例,无需提前在XML布局中声明 FragmentContainerView customContainer = new FragmentContainerView(this); // 为容器生成唯一ID customContainer.setId(View.generateViewId()); // 将容器添加到页面根布局,也可添加到你需要的任意父布局中 ((ViewGroup) findViewById(android.R.id.content)).addView(customContainer); // 加载Fragment fragmentManager.beginTransaction() .replace(customContainer.getId(), mapFragment) .commit();
注意:原生FragmentManager的事务逻辑底层依赖容器ID定位挂载父布局,不存在完全绕开ID的嵌入式Fragment加载方案。如果是弹窗类的DialogFragment,本身不需要嵌入页面布局,调用
show(fragmentManager, tag)方法时无需传入容器ID,属于特殊场景的例外。
内容的提问来源于stack exchange,提问作者user15260712
相关产品推荐
相关产品推荐

