databinding(2)

1.绑定数据其他类型

实例代码activity_test.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                                   

TestActivity.java

public class TestActivity extends AppCompatActivity {    private List _list;    private Map _map;    private String[] arr={"数组一","数组二"};    private String str="我是key";    private int index=1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initData();        ActivityTestBinding testBinding=DataBindingUtil.setContentView(this,R.layout.activity_test);        testBinding.setKey(str);        testBinding.setIndex(index);        testBinding.setList(_list);        testBinding.setMap(_map);        //testBinding.setSparse(arr);    }    private void initData() {        _list=new ArrayList<>();        _map=new HashMap<>();        _map.put("age","88");        _list.add("集合一");        _list.add("集合二");    }}
Jetpack学习(二)——databinding(2)_第1张图片 device-2020-01-09-153735.png

2.还支持表达式语言

常见功能

表达式语言与托管代码中的表达式非常相似。您可以在表达式语言中使用以下运算符和关键字:

  • 算术运算符 + - / * %
  • 字符串连接运算符 +
  • 逻辑运算符 && ||
  • 二元运算符 & | ^
  • 一元运算符 + - ! ~
  • 移位运算符 >> >>> <<
  • 比较运算符 == > < >= <=
  • instanceof
  • 分组运算符 ()
  • 字面量运算符 - 字符、字符串、数字、null
  • 类型转换
  • 方法调用
  • 字段访问
  • 数组访问 []
  • 三元运算符 ?:

(请注意,< 需要转义为 <

实例代码

    android:text="@{String.valueOf(index + 1)}"    android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"    android:transitionName='@{"image_" + id}'    

缺少的运算

您可以在托管代码中使用的表达式语法中缺少以下运算:

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

某些资源需要显式类型求值,如下表所示:此处指的是引用res/values中的

类型 常规引用 表达式引用
String[] @array @stringArray
int[] @array @intArray
TypedArray @array @typedArray
Animator @animator @animator
StateListAnimator @animator @stateListAnimator
color int @color @color
ColorStateList @color @colorStateList

实例代码

       android:textColor="@{index>3?@color/star:@color/colorAccent}"

事件处理

3.事件绑定

<?xml version="1.0" encoding="utf-8"?>                                                                             
        ...        testBinding.setClickListener(this);        ...        //处理点击事件        @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.textView1:                Toast.makeText(TestActivity.this,"点击了11",Toast.LENGTH_SHORT).show();                break;            case R.id.textView2:                Toast.makeText(TestActivity.this,"点击了22",Toast.LENGTH_SHORT).show();                break;        }    }                

方法引用

    public class MyHandlers {        public void onClickFriend(View view) { ... }    }        
    <?xml version="1.0" encoding="utf-8"?>                                                                     
       testBinding.setHandlers(new MyHandlers());

4. 导入、变量和包含

数据绑定库提供了诸如导入、变量和包含等功能。通过导入功能,您可以轻松地在布局文件中引用类。通过变量功能,您可以描述可在绑定表达式中使用的属性。通过包含功能,您可以在整个应用中重复使用复杂的布局。

导入

通过导入功能,您可以轻松地在布局文件中引用类,就像在托管代码中一样。您可以在 data 元素使用多个 import 元素,也可以不使用。以下代码示例将 View 类导入到布局文件中:

            

导入 View 类可让您通过绑定表达式引用该类。以下示例展示了如何引用 View 类的 VISIBLE 和 GONE 常量:

类型别名
当类名有冲突时,包名不同类名相同就会冲突其中一个类可使用别名重命名。以下示例将 com.example.real.estate 软件包中的 View 类重命名为 Vista:

    

您可以在布局文件中使用 Vista 引用com.example.real.estate.View,使用 View 引用android.view.View

导入其他类
导入的类型可用作变量和表达式中的类型引用。以下示例显示了用作变量类型的 User 和 List:

                                    

注意:Android Studio 尚不处理导入,因此导入变量的自动填充功能可能无法在您的 IDE 中使用。您的应用仍可以编译,并且您可以通过在变量定义中使用完全限定名称来解决这个 IDE 问题。
您还可以使用导入的类型来对表达式的一部分进行类型转换。以下示例将 connection 属性强制转换为类型 User:

在表达式中引用静态字段和方法时,也可以使用导入的类型。以下代码会导入 MyStringUtils 类,并引用其 capitalize 方法:

                        

就像在托管代码中一样,系统会自动导入 java.lang.*。

变量

您可以在 data 元素中使用多个 variable 元素。每个 variable 元素都描述了一个可以在布局上设置、并将在布局文件中的绑定表达式中使用的属性。以下示例声明了 user、image 和 note 变量:

                                    

变量类型在编译时进行检查,因此,如果变量实现 Observable 或者是可观察集合,则应反映在类型中。如果该变量是不实现 Observable 接口的基类或接口,则变量是“不可观察的”。
如果不同配置(例如横向或纵向)有不同的布局文件,则变量会合并在一起。这些布局文件之间不得存在有冲突的变量定义。
在生成的绑定类中,每个描述的变量都有一个对应的 setter 和 getter。在调用 setter 之前,这些变量一直采用默认的托管代码值,例如引用类型采用 null,int 采用 0,boolean 采用 false,等等。
系统会根据需要生成名为 context 的特殊变量,用于绑定表达式。context 的值是根视图的 getContext() 方法中的 Context 对象。context 变量会被具有该名称的显式变量声明替换。

包含

通过使用应用命名空间和特性中的变量名称,变量可以从包含的布局传递到被包含布局的绑定。以下示例展示了来自 name.xml 和 contact.xml 布局文件的被包含 user 变量:

<?xml version="1.0" encoding="utf-8"?>                                                                         

数据绑定不支持 include 作为 merge 元素的直接子元素。例如,以下布局不受支持:

<?xml version="1.0" encoding="utf-8"?>                                                                     
  • 报错

错误: 找不到符号
符号: 类 ActivityTestBindingImpl
位置: 程序包 com.hwp.databindingdemo.databinding
当新手使用databinding出现这个错误的时候,一般来说就是xml文件中与databinding相关的写错

更多相关文章

  1. Android Q中外部存储盘路径正则表达式的理解
  2. FregClient进程,创建一个BpFregService类型的代理对象
  3. 设置Android SDK tools工作路径环境变量
  4. Mac配置Android环境变量
  5. android获取网络类型
  6. JNI基本数据类型转换
  7. Android 判断网络是否可用以及网络类型(WIFI,2G,3G,4G)
  8. 用Javascript判断访问来源操作系统, 设备, 浏览器类型
  9. Android环境变量作用--命令行操作

随机推荐

  1. Activity的四种启动模式下的生命周期(全)20
  2. Android(安卓)6.0特性(FloatingActionButt
  3. android apkbuilder.bat批处理
  4. android 如何替换系统的默认静态壁纸?
  5. 我的第一个android 游戏 打鸭子 (DuckHun
  6. 聊聊Android应用实现跨进程调用
  7. android 细节之An internal error occurr
  8. Android(安卓)Studio常见问题 -- uses-sd
  9. animation_
  10. 获取手机配置