点击RadioButton时ScrollView自动滚动到next_button并调用setMeal()方法
实现方案
你可以通过在Fragment中统一处理RadioButton点击事件,同步执行ViewModel方法调用和ScrollView滚动逻辑,不需要修改现有ViewModel代码,具体步骤如下:
1. 修改Fragment代码
在MainMeal类中新增公开的点击处理方法,内部先完成ViewModel的setMeal()调用,再执行滚动逻辑。注意滚动操作要放在post队列中执行,避免视图未完成测量导致滚动位置偏移。
// 处理餐品单选按钮点击事件 fun onMealItemSelected(mealName: String) { // 执行原有选餐逻辑 sharedViewModel.setMeal(mealName) // 等待布局绘制完成后执行滚动 binding.scrollView.post { // 增加16dp底部边距,避免按钮贴屏幕边缘 val bottomOffset = (16 * resources.displayMetrics.density).toInt() // 平滑滚动到next_button位置 binding.scrollView.smoothScrollTo(0, binding.nextButton.bottom + bottomOffset) } }
2. 修改XML中RadioButton的点击绑定
将所有RadioButton上原有的android:onClick属性(直接绑定ViewModel的setMeal方法),改为调用Fragment中新增的onMealItemSelected方法,传入对应餐品名称即可。
以第一个龙虾选项为例,修改后的RadioButton代码如下:
<RadioButton android:id="@+id/royal_lobster" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text='@{viewModel.menuItems["royal butter lobster"].name}' android:onClick='@{() -> mainMeal.onMealItemSelected("royal butter lobster")}' android:textAppearance="?attr/textAppearanceBody1" tools:text="Royal Butter Lobster" />
剩余kebbeh、shish_tawook两个RadioButton做相同修改,分别传入对应餐名字符串"kebbeh"、"shish tawook"即可。
补充说明
- 如果不需要平滑滚动动画,把
smoothScrollTo替换为scrollTo即可实现瞬间跳转。 - 你的布局中
next_button本身就在ScrollView内容的最底部,如果不需要精准定位控件,也可以直接用binding.scrollView.fullScroll(View.FOCUS_DOWN)实现滚到底部的效果。 - 该方案完全保留你现有的DataBinding、导航、ViewModel数据流转逻辑,没有侵入性修改。
内容的提问来源于stack exchange,提问作者Weaam Alagha
相关产品推荐
相关产品推荐

