数据绑定onClick无法正常工作

Har*_*kor 4 data-binding android onclick android-databinding

我开始使用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));
}
Run Code Online (Sandbox Code Playgroud)

GameFragment.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;
}
Run Code Online (Sandbox Code Playgroud)

fragment_game.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" />
(...)
Run Code Online (Sandbox Code Playgroud)

load_image工作正常,但onClick却不执行任何操作...编译中没有错误,单击设备时没有崩溃,控制台中没有结果...

Car*_*iel 7

最简单的方法是设置视图模型并从布局中调用视图的 onClick 中的正确方法: 您的 xml:

<data>
    <variable
        name="viewModel"
        type="co.package.MyViewModel" />
</data>

<com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/my_id"
                        android:layout_width="@dimen/full_width"
                        android:layout_height="wrap_content"
                        android:onClick="@{() -> viewModel.doSomething()}" />
Run Code Online (Sandbox Code Playgroud)

但是,如果出于任何原因需要从片段或活动中调用方法,最好的建议是创建一个接口来处理该方法,实现该方法并将其设置为如下布局: 您的 xml

<data>
    <variable
        name="myHandlers"
        type="co.package.MyHandlersListener" />
</data>

<com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/my_id"
                        android:layout_width="@dimen/full_width"
                        android:layout_height="wrap_content"
                        android:onClick="@{() -> myHandlers.doSomething()}" />
Run Code Online (Sandbox Code Playgroud)

在您的 Fragment 或 Activity 中,您创建接口然后实现它: 您的活动/片段:

/* My Handler Methods */

interface MyHandlersListener {
    fun doSomething()
}
Run Code Online (Sandbox Code Playgroud)

然后实现侦听器,考虑到在您的活动/片段类中定义并实现了某些方法:

private val myHandlersListener: MyHandlersListener = object : MyHandlersListener {
    override fun doSomething() {
        something()
    }
}
Run Code Online (Sandbox Code Playgroud)

并且使用数据绑定,您可以将处理程序设置到您的布局类中(这可以在onCreateonCreateView方法中完成,具体取决于您分别使用的是和活动还是片段):

myBinding.myHandlers = myHandlersListener
Run Code Online (Sandbox Code Playgroud)

通过这种方式,它可以完美运行,您可以按照 Android 团队提供的指南进行操作:https : //developer.android.com/topic/libraries/data-binding/expressions#method_references


Raj*_*sar 6

请检查以下代码:

您编写了,以点击“图片点击”为:

 android:onClick="@{() -> gameViewModel.onClickItem(1,1)}"
Run Code Online (Sandbox Code Playgroud)

尝试编写如下内容,然后再次检查:

android:onClick="@{(v) -> gameViewModel.onClickItem(1,1)}"
Run Code Online (Sandbox Code Playgroud)

按照指导这不是实现体系结构原理的方法,我们可以按照MVVM体系结构按以下方式工作:1.创建一个接口2.将接口定义为布局文件中的处理程序,如下所示:

<variable
        name="handler"
        type="com.cityguide.interfaces.MustVisitItemListener"></variable>
Run Code Online (Sandbox Code Playgroud)

3.现在我们正在使用此处理程序将onclick定义为:

android:onClick="@{(v) ->handler.onGalleryItemClick(v,currentPosition,photo)}"
Run Code Online (Sandbox Code Playgroud)
  1. 使用我们的java类或Activity类实现Handler,然后将Handler与View绑定,如下所示:
private MustVisitItemListener mItemListener;
Run Code Online (Sandbox Code Playgroud)

mItemListener = new MustVisitItemListener(){};

5.设置具有绑定对象的接口处理程序,如下所示:

mbinding.setHandler(mItemListener);
Run Code Online (Sandbox Code Playgroud)