标签: android-databinding

在布局绑定中使用属性资源(?attr /)?

数据Android中结合目前似乎支持以下参考资源(根据数据绑定引导): ,@array,@color,,@int ...,这将给参考值作为静态参数方法.@dimen@string@BindingAdapter

例如:

布局/ web_view.xml

<WebView
    app:htmlTextColor="@{@color/colorText}"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)

Bindings.java

@BindingAdapter({"bind:htmlTextColor"})
public static void setHtml(WebView webView, int textColor) {
    // binding logic
}
Run Code Online (Sandbox Code Playgroud)

但随着主题和风格,它更多的时候,我用一个属性的资源,例如?android:attr/textColorPrimary@color参考.对于这种情况,绑定"@{}"语法将如何?目前这是我如何使它工作,但也许有更好的方法?

布局/ web_view.xml

<WebView
    app:htmlTextColor="@{android.R.attr.textColorPrimary}"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)

Bindings.java

@BindingAdapter({"bind:htmlTextColor"})
public static void setHtml(WebView webView, int textColorAttr) {
    // binding logic
}
Run Code Online (Sandbox Code Playgroud)

android android-layout android-databinding

25
推荐指数
1
解决办法
3398
查看次数

数据绑定:如果属性不为null,则设置属性

无法理解......如果变量字段不为空,如何设置视图的某些属性?
例如

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

    <data>
        <variable
            name="item"
            type="com.test.app.Item" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:layout_margin="16dp"
            android:src="@{item.getDrawable()}"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginEnd="16dp"
            android:layout_marginLeft="72dp"
            android:layout_marginRight="16dp"
            android:layout_marginStart="72dp"
            android:layout_toLeftOf="@id/action"
            android:layout_toStartOf="@id/action"
            android:orientation="vertical">

            <TextView
                android:id="@+id/text1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:textColor="@color/black_87"
                android:textSize="16sp"
                android:text="@{item.getTitle()}"/>

            <TextView
                android:id="@+id/text2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:autoLink="web|email"
                android:linksClickable="false"
                android:singleLine="true"
                android:textColor="@color/black_54"
                android:textSize="14sp"
                android:text="@{item.getSubtitle()}"/>


        </LinearLayout>

    </RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

Item的某些字段可以为null,我不会不必要地调用布局视图的方法.我不会得到NullPointerException.如果属性不为null,我该怎么设置属性?
PS对不起英文.

android android-databinding

25
推荐指数
3
解决办法
2万
查看次数

Android数据绑定:包不存在

我正在尝试使用Android的数据绑定.

我不能再建立我的项目了.我收到了这个错误:

"错误:(13,46)错误:包ch.company.project.databinding不存在"

我在这里gradle:

http://pastebin.com/dkXd1Mxr

http://pastebin.com/n9hkFWGQ

这里的gradle输出:

https://pastebin.com/w93Rausg

data-binding android android-databinding

24
推荐指数
5
解决办法
3万
查看次数

视图绑定不适用于“包含”:不兼容的类型:ProgressBarLayoutBinding 无法转换为 ViewDataBinding

安卓工作室 3.6。金丝雀 12

构建.gradle:

buildscript {
    ext.kotlin_version = '1.3.50'
    ext.RETROFIT_VERSION = '2.6.0'
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.0-alpha12'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
Run Code Online (Sandbox Code Playgroud)

在 app/build.gradle 中:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: "kotlin-kapt"

android {
    viewBinding {
        enabled = true
    }
    dataBinding {
        enabled = true
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    compileSdkVersion …
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-studio-3.6 android-viewbinding

24
推荐指数
2
解决办法
7752
查看次数

Android绑定适配器传递多个参数会导致错误

我很新Android Data Binding.我正在学习本教程:数据绑定库.我正在尝试使用接收多个参数的适配器.这是我的代码:

XML

   <ImageView
            android:layout_width="@dimen/place_holder_size"
            android:layout_height="@dimen/place_holder_size"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_centerVertical="true"
            app:url="@{image.imageUrl}"
            app:size="@{@dimen/place_holder_size}"
            />
Run Code Online (Sandbox Code Playgroud)

绑定适配器类

public class ViewBindingAdapters extends BaseObservable {

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
    if (!Strings.isNullOrEmpty(url)) {
        Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
    }
}
....


}
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

java.lang.RuntimeException:发现数据绑定错误.****/数据绑定错误****消息:在android.widget.ImageView上找不到参数类型为java.lang.String的属性'app:url'的setter.file:... li_image_item.xml loc:30:27 - 30:40****\data binding error****

有谁知道为什么?

提前致谢!

android android-databinding

23
推荐指数
6
解决办法
1万
查看次数

Android 为什么在 RecyclerView 中使用 executePendingBindings

我最近一直在使用数据绑定,并且遇到了该executePendingBindings方法。该文档几乎没有介绍它,我无法理解它是如何工作的或何时使用它。

许多开发人员在 onBindViewHolder 回调中使用 executePendingBindings,但在使用与否时,我自己在回收器中没有看到任何差异。

有人可以解释为什么在回收站中使用很重要吗?谢谢

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

            Customer customer= List.get(position).second;
            ((CustomerViewHolder)holder).binding.setCustomer (customer)

            ((CustomerViewHolder)holder).binding.executePendingBindings();


}
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview android-databinding

23
推荐指数
1
解决办法
9739
查看次数

如何使用ToggleButton执行双向数据绑定?

我的ObservableBoolean活动类中有一个字段,它绑定到我ToggleButton喜欢的"checked"属性:

android:checked="@{activity.editing}"
Run Code Online (Sandbox Code Playgroud)

我希望这会在按钮和布尔值之间创建双向关系,但它只会从字段到按钮进行更改,而不是相反.我做错了什么,或者这不在Android的范围内DataBinding

data-binding android togglebutton android-databinding

22
推荐指数
2
解决办法
1万
查看次数

无法在Android数据绑定中引用其他View ID

我刚刚观看了高级数据绑定 - Google I/O 2016,并希望应用以下内容来减少在不同视图中使用的表达式的重复.

在此输入图像描述

但我不能让它在我的情况下工作:

<ImageButton
                android:id="@+id/btn_list"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_gravity="start"
                android:background="@drawable/btn_s01_list"
                android:visibility="@{bean.shouldHideControls? View.GONE: View.VISIBLE}"/>

            <ToggleButton
                android:id="@+id/btn_radar"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:background="@drawable/btn_radar_selector"
                android:checked="false"
                android:gravity="end"
                android:text=""
                android:textOff=""
                android:textOn=""
                android:visibility="@{btn_list.visibility}"/>
Run Code Online (Sandbox Code Playgroud)

我得到了

错误:(426,39)标识符必须具有XML文件中的用户定义类型.btn_list缺少它

编辑:

我在同一个谈话中错过了一个重要的观点...视图ID是骆驼式的.

在此输入图像描述

android android-databinding

22
推荐指数
1
解决办法
5037
查看次数

ClassNotFoundException:没有找到类"android.databinding.DataBinderMapper"

我正在使用android的数据绑定库来查看库项目中的视图

我在根gradle文件中添加了以下行

classpath 'com.android.databinding:dataBinder:1.0-rc1'
Run Code Online (Sandbox Code Playgroud)

并在模块的gradle文件中启用了dataBinding,如下所示

apply plugin: 'com.android.databinding'
...
...
android {
....
  dataBinding {
      enabled = true
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经在我的库项目中以及使用此库的主机应用程序中启用了multiDex但是在启动库的活动时我得到了这个堆栈的错误跟踪

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/DataBinderMapper;
    at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:31)
    at sdk.ui.activities.MyActivity.onCreate(MyActivity.java:76)
    at android.app.Activity.performCreate(Activity.java:6280)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1116)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2534)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2647)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1502)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:5763)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.databinding.DataBinderMapper" on path: DexPathList[[zip file "/data/app/testApp.dev-1/base.apk"],nativeLibraryDirectories=[/data/app/testApp.dev-1/lib/arm64, /data/app/testApp.dev-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:31) …
Run Code Online (Sandbox Code Playgroud)

data-binding android android-databinding

22
推荐指数
3
解决办法
1万
查看次数

将LiveData与数据绑定结合使用

随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.

我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.

这个问题已经报道过(GitHubStack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.

为了同时使用LiveDataData Binding,我创建了一个非常简单的类实现,它扩展了BaseObservable:

import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable

class ObservableMutableLiveData<T>() : BaseObservable() {

    private var data: MutableLiveData<T> = MutableLiveData()

    constructor(data: T) : this() {
        this.data.value = data
    }

    public fun set(value: T) {
        if (value != data.value) {
            data.value = value …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-databinding android-mvvm android-architecture-components

22
推荐指数
2
解决办法
1万
查看次数