Android DataBinding之布局中(layout)事件、运算逻辑、资源、工具类的使用与详解(七)

news2024/11/28 2:34:54

一、介绍

        如果你学习了我前面的六篇文章,基本能够熟悉的处理data binding在开发过程的大多数业务,但是由于layout中的数据不一定满足UI上的效果,正常都是提前处理好数据,如果我们在layout引入中事件、运算逻辑、资源、工具类?那么代码层会显的很自然和干净。

        了解了layout可以引入这些后,我们应该期待一下这些类的在layout的布局中如何使用?

二、使用详解

1.运算符逻辑使用

支持在布局文件中使用以下运算符、表达式和关键字

  • 算术 + - / * %
  • 字符串合并 +
  • 逻辑 && ||(&在xml表达是:&)
  • 二元 & | ^(&在xml表达是:&)
  • 一元 + - ! ~
  • 移位 >> >>> <<
  • 比较 == > < >= <=
  • instanceof
  • Grouping ()
  • character, String, numeric, null
  • Cast
  • 方法调用
  • Field 访问
  • Array 访问 []
  • 三元 ?:

目前不支持以下操作

  • this
  • super
  • new
  • 显示泛型调用

转义字符:

字符转义字符
>&gt;
<&lt;
&&amp;
"&quot;

数据:

<data class="MyDataBindDetail">

    <import type="android.text.TextUtils" />

    <variable
        name="data1"
        type="String" />

    <variable
        name="data2"
        type="String" />

    <variable
        name="data3"
        type="String" />


    <variable
        name="value"
        type="int" />

</data>

但是这里面我们不可能完全使用,从常用角度来列举一些

算术

+:android:text="@{String.valueOf(1+2)}"

-:android:text="@{String.valueOf(200-2)}"

/:android:text="@{String.valueOf(10/2)}"

*:android:text="@{String.valueOf((2*2))}"

%:android:text="@{String.valueOf(7%3)}"

字符连接:

+:android:text="@{ data1+data2+data3}"

其实在Impl会生成对应的逻辑:

 &&运算:

android:text="@{String.valueOf(value&gt;2 &amp;&amp; value&lt;6) }"

||运算:
android:text="@{String.valueOf(value&gt;2 || value&lt;6) }"

instanceof类型判断:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{data3+ &quot;   instanceof= &quot;}" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{data3 instanceof String ? &quot; String &quot; : &quot; notString &quot;}" />

三目运算 ?: 

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{value&gt; 2? &quot; 大于 &quot; : &quot; 小于等于 &quot;}" />

2.资源使用

资源目前支持string与dimens

string:只支持formate,或者单个引入,

<string name="txt1">你好%s%s%s</string>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{@string/txt1(data1,data2,data3)}" />

string需要指定正确的占位符(内容类型),不可使用{0},与Message.formate不一样

dimen:

支持逻辑运算

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{@string/txt1(data1,data2,data3)}"
    android:textSize="@{flag?@dimen/app_bar_height:@dimen/fab_margin}"
    />

3.静态类使用

        在布局中,我们可以通过静态类完成逻辑的修改。这样会更加方便。但是在静态类中,布局文件不可以使用类中的静态模块。

object MyUtil {


        fun text(txt: String): String {

            if (txt.equals("zhang")) {
                return "这不是老张嘛"
            }
            return "大家都是老王"
        }

        fun text(age: Int): String {


            return "老王今年${age}岁"
        }

}

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data class="ClassMethodUtil">

        <import type="com.example.wiik.testdemo.databinding.util.MyUtil" />

        <variable
            name="name"
            type="String" />

        <variable
            name="age"
            type="int" />


    </data>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{MyUtil.INSTANCE.text(name)}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{MyUtil.INSTANCE.text(age)}" />

    </LinearLayout>


</layout>

        静态的加入,可以简化大家在xml中复杂的逻辑计算。如果你不会使用布局中逻辑,对转义字符记不住可以通过静态类来处理。

注意:

布局中的类一定不能引用静态模块中的方法。错误

class MyUtil {


   
   companion object{

        fun text(txt: String): String {

            if (txt.equals("zhang")) {
                return "这不是老张嘛"
            }
            return "大家都是老王"
        }

        fun text(age: Int): String {


            return "老王今年${age}岁"
        }

       
   } 
    
}

4、类的方法调用

        类的方法和静态类使用差不多,一个是被初始化好了,一个是直接使用的。但是如果一些人使用MVVM的时候,喜欢把一些逻辑抽取在一个M层,也是一样使用。

,M层的内部类:

    inner class MyMethodEntity(var context:Context){



        fun  getName(resId:Int):String{
            return context.getString(resId)
        }

        fun getSizeName(name:String):String{
            return "${name}长度为=${name.length}"
        }
    }

layout的处理如下:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data class="ClassMethodUtil">


        <import type="com.example.wiik.testdemo.databinding.TestMethodActivity.MyMethodEntity" />

        <variable
            name="name"
            type="String" />

        <variable
            name="age"
            type="int" />

        <variable
            name="entity"
            type="MyMethodEntity" />

        <variable
            name="resId"
            type="int" />

    </data>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{entity.getName(resId)}" />


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{entity.getSizeName(name)}" />

 

    </LinearLayout>


</layout>

这样也是借助于类提供的方法处理。

5、事件绑定

        在android中,事件是一个动作的发生,特别是View,提供了各种事件的捕获,通过屏幕的传感捕获到再处理,传递底层,处理成对应的事件。

  • android:onClick
  • android:onLongClick

事件的绑定,可以不用通过在代码中通过set来完成,但是绑定也要按原来事件方法来完成。

例如:

android:onClick



object MyUtil {



    fun onClick(view: View) {
        Toast.makeText(view.context, "我点击l ", Toast.LENGTH_SHORT).show()
    }



}

xml布局中引入:

      <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{MyUtil.INSTANCE.onClick}"
            android:text="点击onClick" />

解释:

如果是参数只有当前对象,可以不传,直接引用

如果有返回值:

    fun onLongClick(view: View): Boolean {
        Toast.makeText(view.context, "我点击2 ", Toast.LENGTH_SHORT).show()
        return false
    }
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onLongClick="@{MyUtil.INSTANCE.onLongClick}"
            android:text="onLongClick" />

原生:

public interface OnLongClickListener {

    boolean onLongClick(View v);
}
public interface OnClickListener {

    void onClick(View v);
}

注意:

        自定义事件,参数和返回值一定要和系统匹配,否则会报错。

        自定义事件可以在M层内部类中,也可以在任何类中,只要方法负责自定义类都可以使用

6、Null Coalescing

??:如果第一个参数不为null,将会取第一个,否则取第二个值。

     <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{name??entity.getName(resId)}"

            />

三、总结

        通过上面的介绍,我们可以掌握了逻辑、事件、工具类在layout使用。这样我们可以很方面在布局中处理一些事情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【离散数学】代数系统 测试

1.判断题 代数系统中一个元素的左逆元一定等于该元素的右逆元。 正确答案&#xff1a; 错误 2.判断题 一个循环群的生成元不是唯一的。 正确答案&#xff1a; 正确 3.判断题 任何循环群必定是阿贝尔群&#xff0c;反之亦真。 正确答案&#xff1a; 错误 4.判断题 任何一个循环群…

gitlab-runner 的安装

Gitlab-ci说明 是GitLab内置的进行持续集成的工具&#xff0c;只需要在仓库根目录下创建.gitlab-ci.yml 文件&#xff0c;并配置GitLab Runner&#xff1b;每次提交的时候&#xff0c;gitlab将自动识别到.gitlab-ci.yml文件&#xff0c;并且使用Gitlab Runner执行该脚本 Gitl…

关于Redis数据库,我问了ChatGPT几个问题

最近互联网刮起了一阵ChatGPT风&#xff0c;从程序猿、产品经理、运营再到大学生&#xff0c;都在跟ChatGPT对话&#xff01;例如&#xff1a; 请帮我检查这段代码的BUG 请帮我设计一款功能像虹科VUZIX一样的智能AR眼镜 虹科Domo数据可视化工具有什么功能 帮我写一篇关于Weka并…

(C1)卷积层特点及torch.nn.Conv2d()

卷积层 文章目录卷积层一、常规卷积1.1 特点1.2 参数量 和 计算量二、可分离卷积2.1 逐深度卷积(Depthwise Convolution)2.2 逐点卷积(Pointwise Convolution)三、代码实现 ⭐一、常规卷积 参考资料 卷积神经网络之卷积层中的多输入多输出通道 卷积中参数量和计算量 有图文讲解…

数字孪生堆场集成箱的管理运维,可视化构建

为优化集装箱码头生产作业流程、提高生产效率&#xff0c;借鉴数字孪生在工业体系应用的经验&#xff0c;采用数字孪生技术对集装箱码头堆场这一典型的具有不确定性、多目标、复杂性的离散内部交通物流系统进行数字化运维&#xff0c;可显著提升作业效率。数字孪生技术正在成为…

(17)深度点云学习--python安装openni打开奥比中光RGBD

1、主要参考 &#xff08;1&#xff09;安装 点云数据处理之安装python-openni_mengjiexu_cn的博客-CSDN博客_openni python &#xff08;2&#xff09;打开摄像头 2、安装openni和测试摄像头 2.1 下载安装摄像头驱动 &#xff08;1&#xff09;去以下地址下载驱动 https…

为什么 OpenCV 计算的视频 FPS 是错的

作者 | 王伟、刘一卓 导读 网络直播功能作为一项互联网基本能力已经越来越重要&#xff0c;手机中的直播功能也越来越完善&#xff0c;电商直播、新闻直播、娱乐直播等多种直播类型为用户提供了丰富的直播内容。 随着直播的普及&#xff0c;为用户提供极速、流畅的直播观看体验…

通过商业智能(BI)可视化数据分析了解布洛芬的产销情况

我们都知道&#xff0c;在我们的生活中&#xff0c;处处都是数据。但是只有数据&#xff0c;比如1、2、45、68、137.5&#xff0c;这些数据单一来看并不能反映任何问题。必须通过数据的分析才能将这些单一、无意义的数字变成我们能了解的信息。简单来说&#xff0c;就是数据≠信…

将多个Word表格中的指定值提取到Excel中,方便查看、统计、汇总。Word精灵

01需求说明 图1是简历样&#xff0c;简历中各项数据都放在表格中。现要求将图2中所有简历表的姓名、性别、出生日期、学历、籍贯、民族等等信息逐一提取出来&#xff0c;整理到Excel中&#xff0c;方便查看及汇总。 图1 简历表 图2 要汇总的简历表 02操作步骤 要提取所有简…

C#启程—开发环境搭建

文章目录ideRider下载和安装创建C#基础工程&#xff08;.Net_Desktop_Form&#xff09;Rider去除语法警告C#笔记namespace找不到某个class&#xff08;命名空间&#xff09;ide Rider ide我们选择Rider 为何不选vs&#xff1f;vs占硬盘内存太高了&#xff08;20多G&#xff0…

DATAKIT CrossManager 2022.4 Crack

CrossManager 是一款独立软件&#xff0c;可让您转换大多数 CAD 格式的文件。 使用 Cross Manager&#xff0c;您只需选择一个或多个 CAD 文件&#xff0c;即可将它们自动翻译成您想要的格式。 DATAKIT CrossManager是一款独立软件&#xff0c;可让您转换大多数 CAD 格式的文件…

java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)

在很多平台软件中&#xff0c;咱们登录之后都有一些验证&#xff0c;例如图片数字验证&#xff0c;还有现在流行的滑块验证码&#xff0c;点选验证码&#xff0c;这么复杂的事情&#xff0c;我们程序员当然要用程序的方式解决啦&#xff0c;所以也有一些平台提供了快捷验证的方…

ElasticSearch的读写更新数据流程

读数据流程 客户端向 Node1&#xff08;协调节点&#xff09; 发送获取请求。节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。为了负载均衡&#xff0c;可以轮询所有节点&#xff0c;最后它将请求转发到 Node 2 。Node 2 将文档返回给 N…

通达信接口最新版wind量化特征

通达信接口最新版wind量化特征 1、通达信接口最新版交易接口用于什么&#xff1f; MetaTrade.dll它是一个股票交易接口&#xff0c;可以用于股票程序交易。通过将你的交易策略编写为代码&#xff0c;并通过调用接口股票、撤单、查询&#xff0c;从而实现股票自动交易的程序化。…

【开发工具】Office Tool Plus 安装 Office

一、安装Office&#xff1a; 第一步&#xff1a;打开Office Tool Plus&#xff0c;没有的去官网下载&#xff1a; Office Tool Plus 官方网站 - 一键部署 OfficeOffice Tool Plus 是一个用于部署、激活 Office、Visio、Project 的小工具。借助本工具&#xff0c;你可以快速地…

web前端期末大作业——开心旅游网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

STM32F4 | SYSTEM文件夹介绍 | delay文件夹 | sys文件夹 | usart文件夹

文章目录一、delay 文件夹代码介绍1.delay_init 函数2.delay_us 函数3.delay_ms函数二、sys 文件夹代码介绍1.IO 口的位操作实现三、usart 文件夹代码介绍1.printf 函数支持在 新建工程模板——库函数版本中&#xff0c;我们用到了一个 SYSTEM 文件夹里面的代码&#xff0c;此…

基于java+springboot+mybatis+vue+mysql的智慧养老平台

项目介绍 随着社会的发展我国的人口老龄化严重&#xff0c;为了让这些在年前是给社会做出过贡献的老人老有所依&#xff0c;老有所养&#xff0c;度过一个安详的晚年&#xff0c;很多地方都实现了智慧养老&#xff0c;为此我们通过springbootvueelementUI 开发了本次基于java的…

1.用Python写了一个进销存管理的软件~需求分析界面设计数据库设计技术路线选择~

一、需求分析 总体来说&#xff0c;就是一个在游泳馆使用的进销存管理软件&#xff0c;记录商品的入库、出库情况&#xff0c;以及统计销售的金额等~ 整个系统有三类用户&#xff0c;系统管理员、公司管理员和公司销售员&#xff0c;系统管理员负责录入公司信息以及分配用户&…

ActiveMQ、RabbitMQ、RocketMQ、Kafka区别

1、4种消息中间件比较 特性ActiveMQRabbitMQRocketMQKafka开发语⾔javaerlangjavascala单机吞吐量万级万级10万级10万级时效性ms级us级ms级ms级以内可⽤性⾼(主从架构)⾼(主从架构)⾮常⾼(分布式架构)⾮常⾼(分布式架构)功能特性 成熟的产品&#xff0c; 在很多公司得到应⽤&a…