无需将Fragment容器设为match_parent,如何让Fragment内元素居中于屏幕
解决方案
方案1:修改ScrollView属性(最优,代码改动最小)
你只需要给MainActivity布局里的ScrollView添加android:fillViewport="true"属性即可,这是ScrollView的原生特性:
- 当该属性设为true时,ScrollView的子View会自动填充ScrollView的可视区域
- 如果子View(也就是你的FragmentContainerView里加载的Fragment内容)高度超过屏幕高度,页面依然可以正常滚动,完全不影响其他需要滚动的Fragment的适配效果
修改后的MainActivity里的ScrollView代码如下:
<ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:name="androidx.navigation.fragment.NavHostFragment" app:defaultNavHost="true" app:navGraph="@navigation/mobile_navigation" /> </ScrollView>
这里顺便把FragmentContainerView的高度改成match_parent即可,因为有fillViewport限制,内容不够的时候占满全屏,内容够的时候自动撑开滚动,完全满足你的需求,不需要修改其他任何代码,第一个Fragment里的Button自然就会居中。
方案2:动态设置首个Fragment高度(如果不能修改Activity布局的情况下使用)
你之前代码报错是因为不能直接给View的height属性赋值,Android中View的高度参数存放在布局参数(LayoutParams)中,需要通过修改LayoutParams调整高度,正确的动态设置高度的代码如下,在StartOrderFragment的onViewCreated方法里添加:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 动态设置Fragment根布局高度为屏幕可用高度 val displayMetrics = resources.displayMetrics val screenHeight = displayMetrics.heightPixels // 如果需要扣除状态栏高度可以启用下方代码 // val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") // val statusBarHeight = if (resourceId > 0) resources.getDimensionPixelSize(resourceId) else 0 // val finalHeight = screenHeight - statusBarHeight binding.layoutStartOrder.layoutParams = binding.layoutStartOrder.layoutParams.apply { height = screenHeight // 也可替换为上面计算的finalHeight } binding.startOrderBtn.setOnClickListener { findNavController().navigate(R.id.action_startOrderFragment_to_entreeMenuFragment) } }
这个方案不需要修改Activity的布局代码,只需要修改首个Fragment的代码即可实现按钮居中。
内容的提问来源于stack exchange,提问作者Vaishnav Kanhirathingal
相关产品推荐
相关产品推荐

