数据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) 无法理解......如果变量字段不为空,如何设置视图的某些属性?
例如
<?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的数据绑定.
我不能再建立我的项目了.我收到了这个错误:
"错误:(13,46)错误:包ch.company.project.databinding不存在"
我在这里gradle:
和
这里的gradle输出:
安卓工作室 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
我很新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****
有谁知道为什么?
提前致谢!
我最近一直在使用数据绑定,并且遇到了该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) 我的ObservableBoolean活动类中有一个字段,它绑定到我ToggleButton喜欢的"checked"属性:
android:checked="@{activity.editing}"
Run Code Online (Sandbox Code Playgroud)
我希望这会在按钮和布尔值之间创建双向关系,但它只会从字段到按钮进行更改,而不是相反.我做错了什么,或者这不在Android的范围内DataBinding?
我刚刚观看了高级数据绑定 - 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的数据绑定库来查看库项目中的视图
我在根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) 随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.
我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.
这个问题已经报道过(GitHub和Stack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.
为了同时使用LiveData和Data 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
android ×10
data-binding ×3
android-architecture-components ×1
android-mvvm ×1
kotlin ×1
togglebutton ×1