首页 > 其他分享 >Android DataBinding ——事件处理

Android DataBinding ——事件处理

时间:2023-09-22 20:32:49浏览次数:45  
标签:事件处理 onClick 绑定 监听器 DataBinding Android 监听 表达式 View

DataBinding允许您编写表达式去处理从View分发的事件。例如onClick()方法。事件属性名称由监听器方法的名称确定,但有少数例外。例如,View.OnClickListener有一个方法onClick(),因此此事件绑定的属性为android:onClick。 有一些专门的点击事件处理者(注:它们也接受View.OnClickListener参数)需要使用android:onClick以外的属性来避免冲突。您可以使用以下属性来避免这些类型的冲突:

Class

Listener setter

Attribute

SearchView

setOnSearchClickListener(View.OnClickListener)

android:onSearchClick

ZoomControls

setOnZoomInClickListener(View.OnClickListener)

android:onZoomIn

ZoomControls

setOnZoomOutClickListener(View.OnClickListener)

android:onZoomOut

您可以使用以下机制来处理事件:

  • 方法引用:在表达式中,可以引用符合监听器方法签名的方法。当表达式计算为方法引用时,DataBinding将方法引用和所有者对象封装到一个监听听器中,并设置到该View上。如果表达式的计算结果为null,则DataBinding不会创建监听器,该View这个属性的监听器为null。
  • 监听器绑定:这些是在事件发生时计算的lambda表达式。DataBinding总是创建一个监听器,并设置到这个View。当事件被分发时,监听器将计算lambda表达式。

1. 方法引用

事件可以直接绑定到处理方法上,类似于android:onClick可以分发到Activity中的方法。与View的onClick属性相比,一个主要优点是表达式在编译时处理,因此,如果该方法不存在或其签名不正确,则会收到编译时错误。 方法引用和监听器绑定之间的主要区别在于,实际的监听器实现是在绑定数据时创建的,而不是在触发事件时创建的。如果希望在事件发生时对表达式求值,则应使用监听器绑定。 若要将事件分配给其处理程序,请使用普通绑定表达式,该值为要调用的方法名。例如,考虑以下布局数据对象示例:

class MyHandlers {
    fun onClickFriend(view: View) { ... }
}

绑定表达式可以将视图的单击监听器分发给onClickFriend()方法,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.MyHandlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

注释:这里表达式里是直接引用的函数。这个函数的签名要和onClickListener的onClick的签名一样

2. 监听者绑定

监听者绑定是在事件发生时运行的绑定表达式。它们类似于方法引用,但允许您运行任意的数据绑定表达式。此功能可与Gradle 2.0及更高版本的Android Gradle插件一起使用。 在方法引用中,方法的参数必须与事件监听者的参数匹配。在监听者绑定中,只要返回值必须与监听者的预期返回值匹配(除非它预期为void)即可。例如,考虑以下具有onSaveClick() 方法示例:

class Presenter {
    fun onSaveClick(task: Task){}
}

然后,您可以将click事件绑定到onSaveClick() 方法,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="task" type="com.android.example.Task" />
        <variable name="presenter" type="com.android.example.Presenter" />
    </data>
    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:onClick="@{() -> presenter.onSaveClick(task)}" />
    </LinearLayout>
</layout>

在表达式中使用回调时,DataBinding会自动创建必要的监听者并为事件注册它。当视图激发事件时,DataBinding将计算给定的表达式。与正则绑定表达式一样,在评估这些监听者表达式时,您仍然可以获得DataBinding的空安全和线程安全性。 在上面的例子中,我们还没有定义传递给onClick(view)的视图参数。监听者绑定为监听者参数提供了两种选择:可以忽略方法的所有参数,也可以命名所有参数。如果您喜欢命名参数,可以在表达式中使用它们。例如,上面的表达式可以写如下:

android:onClick="@{(view) -> presenter.onSaveClick(task)}"

或者,如果您想在表达式中使用参数,它可以按如下方式工作:

class Presenter {
    fun onSaveClick(view: View, task: Task){}
}
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

可以将lambda表达式与多个参数一起使用:

class Presenter {
    fun onCompletedChanged(task: Task, completed: Boolean){}
}
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

如果正在监听的事件返回的值的类型不是void,则表达式也必须返回相同类型的值。例如,如果要监听长按事件,则表达式应返回布尔值。

class Presenter {
    fun onLongClick(view: View, task: Task): Boolean { }
}
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

如果由于null对象而无法计算表达式,则数据绑定将返回该类型的默认值。例如,引用类型返回null,int返回0,boolean返回false等。 如果需要将表达式与谓词一起使用(例如,三元),可以使用void作为一个符号值。

android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"

3. 避免复杂的监听者

监听者表达式非常强大,可以使代码非常易于阅读。另一方面,包含复杂表达式的监听者会使布局难以阅读和维护。这些表达式应该像将可用数据从UI传递到回调方法一样简单。您应该在监听者表达式调用的回调方法中实现任何业务逻辑。(注:业务逻辑都写到ViewModel的一个入口函数,databing绑定那个函数即可)

标签:事件处理,onClick,绑定,监听器,DataBinding,Android,监听,表达式,View
From: https://blog.51cto.com/u_16175630/7571090

相关文章

  • android-bottom_navigation 菜单不显示问题
    protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);binding=ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());BottomNavigationViewnavView=findViewById(R.id.nav_view)......
  • android短视频开发,两个ViewPager联动效果
    android短视频开发,两个ViewPager联动效果activity_main.xml <?xmlversion="1.0"encoding="utf-8"?><android.support.v4.widget.NestedScrollViewxmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://......
  • 【Android面试】2023最新大厂面试专题一:关于HashMap那些事儿
    1、 请说一说HashMap,SparseArrary原理,SparseArrary相比HashMap的优点、ConcurrentHashMap如何实现线程安全?这道题想考察什么?1、HashMap,SparseArrary基础原理?2、SparseArrary相比HashMap的优点是什么?3、ConcurrentHashMap如何实现线程安全?考察的知识点HashMap,SparseArrary、Concurre......
  • 使用亚马逊云服务器在 G4 实例上运行 Android 应用程序
    随着Android应用程序和游戏变得越来越丰富,其中有些甚至比PC上的软件更易于使用和娱乐,因此许多人希望能够在云上运行Android游戏或应用程序,而在EC2实例上运行Android的解决方案可以让开发人员更轻松地测试和运行Android应用程序。在这篇博客文章中,我们将展示如何使用N......
  • 从Android事件分发机制看滑动冲突解决方案
    事件分发机制从ViewGroup的dispatchTouchEvent入手publicbooleandispatchTouchEvent(MotionEventev){...finalbooleanintercepted;if(actionMasked==MotionEvent.ACTION_DOWN||mFirstTouchTarget!=null){fi......
  • Android Framework原理解决大龄程序员的催命符
    有人说对于咱们程序员而言:每过一年,都像是在催命。35岁的坎是每个程序员都逃不过的宿命,每过一年离这个坎就又近一步。所以大家都很焦虑,而这份焦虑恰恰又被各种自媒体,公众号,博客等等平台所利用,每年都有人在说互联网又寒冬了,某某公司又大规模裁员了,Android开发不行了这类的负面的消息......
  • Android端如何实现拉取RTSP/RTMP流并回调YUV/RGB数据然后注入轻量级RTSP服务?
    技术背景我们在对接开发Android平台音视频模块的时候,遇到过这样的问题,厂商希望拉取到海康、大华等摄像机的RTSP流,然后解码后的YUV或RGB数据回给他们,他们做视频分析或处理后,再投递给轻量级RTSP服务模块或RTMP推送模块,实现处理后的数据,二次转发,本文以拉取RTSP流,解析后再注入轻量级RTS......
  • Fragment初学7——Fragment在Android开发中的应用1
    Fragment的常用功能通过getFragmentManager()方法,可以得到FragmentManager对象,主要完成下面的功能(1).得到已经存在Fragment对象如果该fragment在布局文件中指定了id,通过findFragmentById()得到对象,或者指定了tag可以通过findFragmentByTag()得到对象Fragment fragment = getFra......
  • Fragment初学8——Fragment在Android开发中的应用2
    Fragment都是依附于Activity的,通信方式大致也分为如下几种:如果Activity中包含自己管理的Fragment的引用,可以通过直接引用访问所有的Fragment的public方法 如果Activity中未保存任何Fragment的引用,那么可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得......
  • Android 妙用TextView实现左边文字,右边图片
    有时候,需要文字在左边,右边有个箭头,我个人之前会有两种做法:使用线性布局来实现或者使用约束布局,一个左对齐,一个右对齐这几天突然想到是否可以使用TextView的设置图标的方式实现,研究发现确实可以实现我的需求,也是记录下文字和图标左右显示效果:代码:<TextViewandroid:id="@+id/......