我正在尝试使用数据绑定到我现有的项目。作为其中的一部分,最初我试图摆脱所有 findViewById() 方法。
现在的问题是,我的布局如下:-
<merge >
<include
android:id="@+id/my_login_process_view"
layout="@layout/content_my_message_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</merge>
Run Code Online (Sandbox Code Playgroud)
将 android 绑定添加到此布局(将布局添加为父标签)后,它会抛出如下错误。
数据绑定不支持包含为合并元素的直接子元素
我遵循了android官方指南Android数据绑定。
我只是想摆脱上述布局文件的 findViewById 。
任何建议,将不胜感激。谢谢
我试图理解为什么设置值不会自动刷新用户界面。如果我调用 binding.setItem,UI 就会刷新。
我知道绑定对象包含更新的值,但在设置 item.name 和 item.checked 后,UI 没有刷新。
我究竟做错了什么?我需要每次调用setItem来刷新UI吗?我认为这是不必要的,因为 UI 会在设置值后自动更新。
项目.java:
public class Item {
public String name;
public Boolean checked;
}
Run Code Online (Sandbox Code Playgroud)
MainActivity.java:
public class MainActivity extends AppCompatActivity {
public Item item;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
item = new Item();
item.checked = true;
item.name = "a";
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setItem(item);
}
public void button_onClick(View v) {
item.checked = !item.checked;
item.name = item.name + "a";
///binding.setItem(item); --> ??? this updates UI, do …Run Code Online (Sandbox Code Playgroud) 我试图根据返回布尔值的方法更改 TextView 的背景属性。这就是我的 TextView 的样子
<data>
<variable
name="model"
type="fit.cure.meetingdisplay.MeetingModel" />
</data>
.....
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@{model.isAvailable() ? @color/colorAvailable : @color/colorUnavailable, default=@color/colorAvailable"
android:gravity="center"
android:text="@{model.getAvailabilityText(), default=Available}"
android:textAllCaps="true"
android:textAppearance="@android:style/TextAppearance.Holo.Large.Inverse" />
Run Code Online (Sandbox Code Playgroud)
模型如下——
public class MeetingModel {
private boolean isAvailable = false;
public boolean isAvailable() {
return isAvailable;
}
public void setAvailable(boolean available) {
isAvailable = available;
}
public String getAvailabilityText() {
if (isAvailable) {
return "available";
}
return "unavailable";
}
}
Run Code Online (Sandbox Code Playgroud)
但我在构建项目时遇到此错误 -
error: '@{model.isAvailable() ? @color/colorAvailable : @color/colorUnavailable, default=@color/colorAvailable' is incompatible with …Run Code Online (Sandbox Code Playgroud) 举例来说,我的数据绑定 XML 中有以下变量。
<layout ...>
<data>
<variable name="listener" type="com.xyz.Listener" />
<!-- and other variables -->
</data>
...
</layout>
Run Code Online (Sandbox Code Playgroud)
我在每一个数据绑定布局中都使用此变量,并且我需要在几乎每一个@BindingAdapter. 例如,我的绑定适配器大多看起来像这样。
@BindingAdapter("board")
fun setBoard(view: TextView, board: Board) {
view.setText(board.name)
view.setOnClickListener {
listener.onBoardClicked(board)
}
}
@BindingAdapter("topic")
fun setTopic(view: TextView, topic: Topic) {
view.setText(topic.name)
view.setOnClickListener {
listener.onTopicClicked(topic)
}
}
// and a few others like that
Run Code Online (Sandbox Code Playgroud)
我这样使用它们
@BindingAdapter("board")
fun setBoard(view: TextView, board: Board) {
view.setText(board.name)
view.setOnClickListener {
listener.onBoardClicked(board)
}
}
@BindingAdapter("topic")
fun setTopic(view: TextView, topic: Topic) {
view.setText(topic.name)
view.setOnClickListener {
listener.onTopicClicked(topic) …Run Code Online (Sandbox Code Playgroud) 这是我的 xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/a"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.a.AFragment">
<data>
<import type="android.databinding.ObservableArrayMap"/>
<variable name="user" type="ObservableArrayMap"/>
</data>
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
我在运行时收到以下错误:
引起的原因: android.view.InflateException:二进制 XML 文件第 9 行:二进制 XML 文件第 9 行:膨胀类数据时出错 引起的:android.view.InflateException:二进制 XML 文件第 9 行:膨胀类数据时出错 引起的: java.lang.ClassNotFoundException:在路径上找不到类“android.view.data”:DexPathList[[zip文件“/data/app/xxx-2/base.apk”,zip文件“/data/app/xxx” -2/split_lib_dependency_apk.apk”,zip 文件“/data/app/xxx-2/split_lib_slice_0_apk.apk”,zip 文件“/data/app/xxx-2/split_lib_slice_1_apk.apk”,zip 文件“/data/app/ xxx-2/split_lib_slice_2_apk.apk”,zip 文件“/data/app/xxx-2/split_lib_slice_3_apk.apk”,zip 文件“/data/app/xxx-2/split_lib_slice_4_apk.apk”,zip 文件“/data/app /xxx-2/split_lib_slice_5_apk.apk”,zip 文件“/data/app/xxx-2/split_lib_slice_6_apk.apk”,zip 文件“/data/app/xxx-2/split_lib_slice_7_apk.apk”,zip 文件“/data/ app/xxx-2/split_lib_slice_8_apk.apk", zip 文件"/data/app/xxx-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/xxx-2/lib/arm, /system/lib, /供应商/lib]]
错误就在这一<data>行(开始标签)。
是什么原因导致此错误以及如何修复它?
我正在尝试按照官方文档将我的应用程序迁移到 AndroidX 。我运行重构选项:迁移到 AndroidX。
起初,我遇到了一些错误,但已通过重新启动和清理我的项目来解决。然后我遇到了一个问题STRING_TOO_LARGE(参见Stack Overflow 问题),我通过将 gradle 构建工具降级到 3.1.3 来解决。
但现在我在数据绑定方面遇到了困难。迁移工具取代了我所有的
import android.databinding.**
Run Code Online (Sandbox Code Playgroud)
经过
import androidx.databinding.**
Run Code Online (Sandbox Code Playgroud)
但我有错误消息
无法解析 androidx.databinding。
他们有什么我应该做的事情才能让它发挥作用吗?
databinding我试图通过退缩来回到过去
import android.databinding.**
Run Code Online (Sandbox Code Playgroud)
而不是那个,但我随后在使用内部 xml 布局androidx时出现错误,说LiveData
找不到参数类型为 androidx.lifecycle.MutableLiveData 的属性的设置器。
我想使用数据绑定将 android:textAlignment 应用于 TextView,如下所示:
android:textAlignment="@{viewModel.switcher ? START : CENTER}"
Run Code Online (Sandbox Code Playgroud)
现在我已经实现了它抛出重力:
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@{viewModel.text}"
android:textAlignment="gravity"
android:gravity="@{viewModel.switcher ? Gravity.LEFT : Gravity.CENTER}"
android:textSize="14sp"/>
Run Code Online (Sandbox Code Playgroud)
但是我可以直接抛出数据绑定来实现textAlignment吗?
我对我的代码有一个快速的问题。我正在使用 Android MVVM 和 LiveData 编写一个应用程序。我想创建加载布局,它将包含在许多视图中。主要目标是能够传递实时数据,这些数据表示布局是否应该可见以及应使用进度条显示哪些文本信息。
到目前为止,我创建了加载指示器布局,并定义了两个变量“indicatorVisibility”和“progressText”。在附加的代码中,值之一被注释掉。我还创建了 BindingAdapters 来设置控件的可见性和文本。
这是我的带有进度条的布局
<data>
<variable
name="indicatorVisibility"
type="android.arch.lifecycle.LiveData"/>
<!--<variable-->
<!--name="progressText"-->
<!--type="android.arch.lifecycle.LiveData"/>-->
</data>
<android.support.constraint.ConstraintLayout
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/layout_loading_background"
>
<ProgressBar
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyle"
android:layout_width="@dimen/layout_loading_progress_bar_size"
android:layout_height="@dimen/layout_loading_progress_bar_size"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textView7"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--android:text="@{progressText}"-->
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="TextView"
android:textColor="@color/layout_loading_text"
android:textSize="@dimen/layout_loading_text_size"
app:layout_constraintBottom_toBottomOf="@+id/progressBar2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/progressBar2"
app:layout_constraintTop_toTopOf="@+id/progressBar2" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
这就是我将其包含在片段布局中的方式
<include layout="@layout/layout_loading_info"
app:indicatorVisibility="@{viewModel.isBusy}"
/>
Run Code Online (Sandbox Code Playgroud)
这些是我的绑定适配器:
@BindingAdapter("android:visibility")
fun getVisibility(view: View, liveData: LiveData<Boolean>){
liveData.observe(view.getLifecycleOwner(), Observer {
view.visibility = if(it == true) View.VISIBLE else View.INVISIBLE
})
}
@BindingAdapter("app:text")
fun …Run Code Online (Sandbox Code Playgroud) 我想将按钮单击绑定到视图模型内的挂起函数。
这是我的代码:
RegistrationActivityViewModel.kt
suspend fun register() {
if (validateFields()) {
val result = SourceplusplusApiService.invoke().registerUser(username.value!!, email.value!!, password.value!!).await()
isRegistrationCompleted.value = getResultValue(result)
}
}
Run Code Online (Sandbox Code Playgroud)
活动注册.xml
<Button
android:text="Register"
android:onClick="@{()->viewmodel.register()}"
android:textSize="16sp" />
Run Code Online (Sandbox Code Playgroud)
我收到一个数据绑定错误,提示ActivityRegistrationBindingImpl未生成。经过大量搜索后,我意识到当我删除suspend关键字并注释里面的代码时,它工作正常,但它必须是一个挂起的函数。
有谁知道如何修理它?
我想onClick()在布局 xml 中触发两个视图模型的两种方法。
代码:
<Button
android:onClick="@{() -> model.onButtonClick()}"
... />
Run Code Online (Sandbox Code Playgroud)
上面的代码调用一个方法,我希望它从不同的视图模型调用另一个方法。
我想添加的函数调用:model2.onButtonClick()
是否可以?如果是,请添加一个最小的例子。(期待 xml 解决方案)
注意:视图模型作为 xml 中的参数传递。(数据绑定变量)
编辑 1:两个函数都位于两个不同的视图模型中。所以我(经过一些研究)知道在另一个视图模型中使用/声明/初始化一个视图模型并不是一个好的做法。
我可以在我的片段中创建一个点击侦听器并在那里调用这两个函数。但我想消除片段中的点击侦听器(按照 MVVM 进行视图)。
我并不是在寻找某种可能的方法。我正在寻找一种最佳实践方法,打算在其中实现 MVVM、关注点分离和数据绑定。