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

Android布局文件中如何通过onClick带参数调用Fragment函数?

解决方案

完全可以实现你要的效果——不用在Fragment类里手动设置setOnClickListener,直接通过布局的Listener Binding调用带参数的goToNextScreen()方法,同时也能把PoultryAdapter作为XML变量传入布局使用。具体步骤如下:

1. 在布局文件中添加Adapter变量

在<data>块里新增一个类型为PoultryAdapter的变量,用于传递Fragment中创建的Adapter实例:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".PoultryFragment">

    <data>
        ...

        <variable
            name="poultryFragment"
            type="com.rgbstudios.breakfastapp.PoultryFragment" />
            
        <!-- 新增Adapter变量 -->
        <variable
            name="poultryAdapter"
            type="com.rgbstudios.breakfastapp.PoultryAdapter" />

    </data>

    <!-- 布局内容不变,修改Button的onClick属性 -->
    <androidx.constraintlayout.widget.ConstraintLayout>
        <LinearLayout>
            <LinearLayout>
                ...
                <Button
                    android:id="@+id/next_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    <!-- 传入poultryAdapter作为参数 -->
                    android:onClick="@{() -> poultryFragment.goToNextScreen(poultryAdapter)}"
                    android:text="@string/next_button"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent" />
            </LinearLayout>
        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

2. 在Fragment中为布局变量赋值

在onViewCreated的binding.apply代码块里,把创建好的adapter实例赋值给布局的poultryAdapter变量:

class PoultryFragment : Fragment() {
...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding?.apply {
            lifecycleOwner = viewLifecycleOwner

            viewModel = sharedViewModel
            val poultryOptions = datasource
            val adapter = PoultryAdapter(poultryOptions, sharedViewModel)
            poultryRecyclerView.adapter = adapter
            poultryRecyclerView.layoutManager = LinearLayoutManager(requireContext())
            // 新增:将adapter赋值给布局变量
            poultryAdapter = adapter
            poultryFragment = this@PoultryFragment
        }
    }
    fun goToNextScreen(adapter: PoultryAdapter) {
        updateCart(adapter)
        findNavController().navigate(R.id.action_poultryFragment_to_breweryFragment)
    }
}

原理说明

Data Binding框架支持将任意自定义对象作为变量注入布局文件,Listener Binding可以直接引用这些变量作为方法参数。这样布局就能直接调用Fragment中带参数的方法,完全不需要在Fragment里手动设置点击监听器。

内容的提问来源于stack exchange,提问作者Oladayo Babalola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:42:45