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
相关产品推荐
相关产品推荐

