Kotlin在现有Fragment嵌入root_preferences不显示问题
故障原因与修复方案
两个故障点分别对应不同的代码问题,逐一修复即可:
1. 偏好项内容完全不显示
核心原因是嵌套Fragment使用了错误的FragmentManager:在Fragment内部加载子Fragment时,必须使用当前Fragment持有的childFragmentManager,当前代码调用的是requireActivity().supportFragmentManager,属于Activity级别的Fragment管理器,无法正确匹配当前Fragment内的容器ID,会导致子Fragment事务提交失败、生命周期绑定异常,SettingsFragment根本没被正确加载到FrameLayout里。
另外要确认SettingsFragment的基础实现正确,作为PreferenceFragmentCompat的子类,必须重写onCreatePreferences方法加载偏好配置文件,漏写这行也会出现空白。
2. FrameLayout高度显示为250dp而非设置的300dp
核心原因是<include>标签的布局参数失效:使用include标签引入外部布局时,如果没在include标签上显式声明android:layout_width和android:layout_height属性,被引入布局根节点的宽高属性会被父布局的默认测量规则覆盖,尤其父布局是ConstraintLayout时,缺失约束的控件会按最小尺寸测量,最终尺寸和你在被引入布局里设置的值不一致。
修复步骤
- 替换ContainerSettingsFragment中的FragmentManager实现,修正后代码如下:
class ContainerSettingsFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_container_settings, container, false) // 嵌套子Fragment使用childFragmentManager childFragmentManager .beginTransaction() .replace( R.id.settings, SettingsFragment() ) .commit() return view } }
- 检查SettingsFragment代码,确认已正确加载偏好配置文件,正确的基础实现如下:
class SettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { // 必须调用这行加载root_preferences.xml配置 setPreferencesFromResource(R.xml.root_preferences, rootKey) } }
- 修改布局中
<include>标签的属性,显式声明宽高,若父布局为ConstraintLayout还要补充对应约束:
<!-- 示例:外层是垂直方向LinearLayout的写法 --> <include android:id="@+id/summaryPrefs" android:layout_width="250dp" android:layout_height="300dp" layout="@layout/fragment_container_settings" />
如果外层父布局是ConstraintLayout,需要额外给include标签添加位置约束,例如:
<include android:id="@+id/summaryPrefs" android:layout_width="250dp" android:layout_height="300dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" layout="@layout/fragment_container_settings" />
内容的提问来源于stack exchange,提问作者Shimon Rothschild
相关产品推荐
相关产品推荐

