You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:51:22