android - 数据绑定 onClick 不起作用
问题描述
我开始使用 DataBinding,但我的 onClick 出了点问题。
GameViewModel.java
public void onClickItem(int row, int col){
Log.d("click","row: "+row+" col: "+col);
}
@BindingAdapter("load_image")
public static void loadImage(ImageView view,int imageId) {
view.setImageResource(getDrawable(imageId));
}
游戏片段.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//View view=inflater.inflate(R.layout.fragment_game, container, false);
FragmentGameBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_game, container, false);
View view = binding.getRoot();
ButterKnife.bind(this,view);
binding.setGameViewModel(gameViewModel);
gameViewModel= ViewModelProviders.of(getActivity()).get(GameViewModel.class);
gameViewModel.init();
return view;
}
片段游戏.xml
<?xml version="1.0" encoding="utf-8"?>
<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=".view.GameFragment">
<data>
<import type="android.support.v4.app.Fragment"/>
<import type="android.view.View"/>
<variable
name="gameViewModel"
type="harkor.addus.viewmodel.GameViewModel" />
</data>
<android.support.constraint.ConstraintLayout
(...)>
<TextView
(...)>
<android.support.constraint.ConstraintLayout
(...)>
<ImageView
android:id="@+id/image_puzzle11"
android:src="@android:color/holo_green_dark"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="1dp"
android:layout_marginRight="1dp"
android:onClick="@{() -> gameViewModel.onClickItem(1,1)}"
app:load_image="@{0}"
app:layout_constraintBottom_toTopOf="@+id/image_puzzle21"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintEnd_toStartOf="@+id/image_puzzle12"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
(...)
load_image 正在工作,但 onClick 什么都不做...编译没有错误,单击设备时按钮没有崩溃,控制台没有结果...
解决方案
请检查以下代码:
您已将单击图像调用为:
android:onClick="@{() -> gameViewModel.onClickItem(1,1)}"
尝试如下编写并再次检查:
android:onClick="@{(v) -> gameViewModel.onClickItem(1,1)}"
根据指南,这不是实现架构原则的方法,我们可以按照 MVVM 架构如下工作: 1. 创建一个接口 2. 将接口定义为布局文件中的处理程序:
<variable
name="handler"
type="com.cityguide.interfaces.MustVisitItemListener"></variable>
3.现在我们使用这个处理程序将 onclick 定义为:
android:onClick="@{(v) ->handler.onGalleryItemClick(v,currentPosition,photo)}"
- 在将 Handler 与 View 绑定之前,使用我们的 java Class 或 Activity 类实现 Handler,如下所示:
private MustVisitItemListener mItemListener;
mItemListener = new MustVisitItemListener() { };
5.使用绑定对象设置接口处理程序,如下所示:
mbinding.setHandler(mItemListener);
推荐阅读
- wix - WiX排除特定文件夹下的某些文件或某些文件类型?
- highcharts - 如何在highchart中制作气泡图在加载时选择了一个气泡
- javascript - 浏览器直接调用后端 URL 而不是 UI 应用 URL
- php - 将包含整数的变量解构为数组
- excel - 使用 VBA 在 Excel 中旋转 3D 模型
- angular - 来自 IdP 的 Saml 响应后的自定义身份验证
- gruntjs - grunt-contrib-connect/grunt-contrib-watch livereload:拒绝应用来自 [path] 的样式,因为它的 MIME 类型
- haskell - 为 Reader 实现 monoid
- hadoop - 将 parquet-tools 与 Kerberos CDH 一起使用
- javascript - 在切换开关内添加开/关文本