Android数据绑定提供了几个Observable数据接口,包括ObservableList.但SortedList(在最新版本的RecyclerView库中引入)根本不扩展List.
我如何使用SortedList for RecyclerView与Android数据绑定库?
我基于LinearLayout创建自定义视图.类扩展了LinearLayout类,我在布局中有:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<merge>
some staff here
</merge>
</layout>
Run Code Online (Sandbox Code Playgroud)
Android Studio会显示警告Element merge is not allowed here,但应用有效.
怎么了?
我想有条不紊地将TextView的文本设置为其中一个或另一个.
Android数据绑定文档建议您可以在文本是视图模型的属性时有条件地设置文本.例如
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
Run Code Online (Sandbox Code Playgroud)
但有没有办法从strings.xml中设置文本而不是在我的视图模型中添加它?我想要这样的东西 -
android:text="@{viewModel.expanded ? @string/collapse : @string/expand}"
Run Code Online (Sandbox Code Playgroud)
XML看起来有点像这样:
<?xml version="1.0" encoding="UTF-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto">
<data class="TravellerInfoBinding">
<import type="android.view.View" />
<variable name="viewModel" type="com.myproject.viewmodel.TravellerInfoViewModel" />
</data>
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/expandable_arrow_blue" />
<TextView style="@style/primary_pair_element_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.expanded ? @string/taxes_fees_detail : @string/hide_taxes_fees_detail}"
android:textSize="12sp" />
</LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
这是我的视图模型 -
package com.myproject.viewmodel;
imports...
public class TravellerInfoViewModel extends BaseObservable {
@Bindable
private final TaxDetailsViewModel taxDetailsViewModel;
@Bindable
private boolean expanded;
Constructor....
public boolean isExpanded() …Run Code Online (Sandbox Code Playgroud) 我正在实施DataBinding,它工作得很完美,但它不允许我使用jackOptions.它Data Binding does not support Jack builds yet在构建时抛出错误.
这是我的 build.gradle
android {
defaultConfig {
...
dataBinding {
enabled true
}
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Run Code Online (Sandbox Code Playgroud) data-binding android android-jack-and-jill android-databinding
如果在编译期间有任何错误,则不会生成数据绑定类 - 因此,我得到了大量的错误,如下所示:
symbol: class DataBindingComponent
location: class TrainingActivityCompletedSetBinding
e: S:\ProjectLocation\TrainingActivityCompletedSetBinding.java:60: error: cannot find symbol
@Nullable DataBindingComponent component)
Run Code Online (Sandbox Code Playgroud)
问题是编译错误根本不与数据绑定有关,因此我不知道实际上是什么导致它 - 我必须手动挖掘文件才能找到问题.
在上面的例子中,我只是@Inject从需要它的构造函数中省略.在这种情况下看到来自Dagger的错误消息是很可爱的,这样我就可以立即找到它,而不必深入挖掘所有项目类来手动找到它.
任何帮助将大大感激!
Android Studio和数据绑定目前都是3.1.3版本,至少从3.0开始就出现了错误.
使用Kotlin V1.2.41和kapt生成代码.
尝试增加编译器显示的最大错误数,遗憾的是没有区别.
暂时,解决方法是android.databinding.enableV2=true在gradle.properties中简单地禁用数据绑定V2 : . 尽管如此,仍然需要更好的解决方案
我是数据绑定的新手,这是我的代码,但在构建时出现此错误
class DatabindingViewModel :ViewModel() {
val currentFruitName:LiveData<String>
get() = FakeRepository.currentName
fun changeNameOnClick()=FakeRepository.changeRandomFoodName()
//two way LiveData
@Bindable
val editTextContext= MutableLiveData<String>()
private val _displayEditTexfContent=MutableLiveData<String>()
val displayEditTexfContent:LiveData<String>
get()=_displayEditTexfContent
fun onDisplayEtText(){
_displayEditTexfContent.value=editTextContext.value
}
Run Code Online (Sandbox Code Playgroud)
这是我的 xml 布局代码:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="binding"
type="ir.persiandesigners.myapplication.databinding.viewmodel.DatabindingViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginLeft="50dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="50dp"
android:layout_marginRight="50dp"
android:text="@{binding.currentFruitName}"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:onClick="@{()->binding.changeNameOnClick()}"
android:text="Get Random Name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<EditText
android:id="@+id/editText" …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用数据绑定加载图像。但我从来没有克服它。我的问题在哪里?下面是我的代码和布局结构。
MyItemViewModel.kt
@BindingAdapter("imageUrl")
fun loadImage(view: RoundedImageView, url: String) = Glide.with(view.context).load(url).into(view)
Run Code Online (Sandbox Code Playgroud)
布局文件
<data>
<variable
name="viewModel"
type="com.myapp.app.ui.activity.albumlist.AlbumItemViewModel"/>
</data>
<com.makeramen.roundedimageview.RoundedImageView
android:layout_width="60dp"
android:id="@+id/ivRoundedAlbum"
android:layout_marginStart="@dimen/unit_20_dp"
app:riv_corner_radius="8dp"
app:imageUrl="@{viewModel.data.cover}"
android:layout_height="60dp"/>
Run Code Online (Sandbox Code Playgroud) 我正在研究android数据绑定,并遇到了我们可以使用以下两种方式设置模型的场景:
User user = new User("User", "Abc"); // this is a model
dataBinding.setVariable(BR.user, user);
dataBinding.executePendingBindings(); // and we have to do this... Why?
Run Code Online (Sandbox Code Playgroud)
我们也可以这样设置:
binding.setUser(user);
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这两者之间有什么区别?
用户模型:
public class User{
public String fName;
public String lName;
public User(String fName, String lName){
this.fName = fName;
this.lName = lName;
}
}
Run Code Online (Sandbox Code Playgroud) 非常基本,我想根据是否读取文本,使消息标题变为粗体.我似乎找不到解决方案.
这是我的XML代码:
<TextView
android:text="@{message.title}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:layout_toLeftOf="@+id/timestamp"
android:textSize="18sp"
android:textStyle='@{message.isRead() ? "bold" : "normal"}'
android:textColor='@{message.isRead() ? 0xff313131 : 0xff0662ab}' />
Run Code Online (Sandbox Code Playgroud)
颜色变化很好,只有粗体文字给我一些问题.
错误:任务':app:compileDebugJavaWithJavac'的执行失败.
java.lang.RuntimeException:发现数据绑定错误.****/数据绑定错误****msg:在android.widget.TextView上找不到参数类型为java.lang.String的属性'android:textStyle'的setter.file:D:...... xml loc:39:41 - 39:79****\data binding error****
我现在正试图在我的项目中使用android数据绑定,遇到这种问题,例如:我有3个复选框作为复选框组,如果选中第一个复选框,则变量type为1.第二个使得type为2 ,第三个使得type3.所以我以这种方式实现代码.
// layout.xml
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="50dp"
android:checked="@{userInfoViewModel.type == 1}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 1)}"
/>
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="55dp"
android:checked="@{userInfoViewModel.type == 2}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 2)}"
/>
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="55dp"
android:checked="@{userInfoViewModel.type == 3}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 3)}"
/>
Run Code Online (Sandbox Code Playgroud)
// viewModel
public void onTypeChecked(boolean checked, int i) {
if (checked) {
// if it is a check. set the type
type.set(i);
} else {
// if it is a uncheck. set type to …Run Code Online (Sandbox Code Playgroud)