所以我创建了val isSwitchChecked = ObservableBoolean(false)变量并像这样添加到开关上的 XML 中android:checked="@={viewmodel.isSwitchChecked()}",因为我想在加载数据时将其设置为布尔值检查,并且一切正常,直到我添加,OnCheckedChangeListener然后开关不会对侦听器做出反应,除非我删除它android:checked="@={viewmodel.isSwitchChecked()}"来自 XML。这是怎么回事?我怎样才能让它双向发挥作用?
我是android数据绑定的新手。我想将多个 SeekBars 绑定到一个浮点数集合,例如
SeekBar1.progress <---> modelArray[0]
SeekBar2.progress <---> modelArray[1]
...
Run Code Online (Sandbox Code Playgroud)
由于SeekBar的进度是Int类型,我觉得用Converter会更好,下面是转换器代码:
import android.databinding.InverseMethod
import android.util.Log
import kotlin.math.roundToInt
class Converter {
@InverseMethod("progressToFloat")
fun floatToProgress(value: Float): Int {
val result = (value * 100.0f).roundToInt()
Log.i("MODEL", "convert $value to $result(Int)")
return result
}
fun progressToFloat(value: Int): Float {
return value.toFloat()/100.0f
}
}
Run Code Online (Sandbox Code Playgroud)
模型结构如下所示:
class Model {
val params by lazy {
ObservableArrayMap<Int, Float>()
}
//....
}
Run Code Online (Sandbox Code Playgroud)
我的xml如下:
<layout 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">
<data class="MyBinding">
<variable name="Converter" type="com.mypackage.model.Converter"></variable>
<variable
name="Converter"
type="com.mypackage.model.Converter"></variable>
<variable
name="model"
type="com.mypackage.model.Model"></variable>
</data> …Run Code Online (Sandbox Code Playgroud) data-binding android kotlin android-databinding two-way-binding
我正在尝试将 edittext 绑定onTextChanged到视图模型。
这是我的 XML:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="mvvm.f4wzy.com.samplelogin.ui.login.viewmodel.LoginViewModel" />
</data>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="text"
android:onTextChanged="@{viewmodel.onEmailChanged}"
android:paddingStart="5dp"
android:textColor="#383838"
android:textSize="20sp"/>
</layout>
Run Code Online (Sandbox Code Playgroud)
LoginViewModel.kt
class LoginViewModel(application: Application) : AndroidViewModel(application) {
fun onEmailChanged(s: CharSequence) {
//some code
}
}
Run Code Online (Sandbox Code Playgroud)
kapt 给我一个关于文本更改的错误,它说:
[kapt] 发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。****/ 数据绑定错误 ****msg: 无法解析 viewmodel.onEmailChanged 的类型
我已经尝试过android:onTextChanged="@{(s) -> viewmodel.onEmailChanged}",android:onTextChanged="@{viewmodel::onEmailChanged}"但仍然出现同样的错误。
有什么帮助吗?
我一直在学习 AndroidX,我想ViewHolder在我自己的Adapter类中创建一个非嵌套的类。到目前为止,我正在做类似的事情
主适配器.kt
class MainAdapter : ListAdapter<MainResponse, MainAdapter.MainViewHolder>(MainDiffCallback()) {
//onCreate
//onBind
//...
class MainViewHolder(
private val binding: ListItemMainBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(listener: View.OnClickListener) {
with(binding) {
this.listener = listener
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想将它们创建为单独的文件,例如
主适配器.kt
class MainAdapter : ListAdapter<MyObject, MainViewHolder>(MainDiffCallback()) {
//onCreate
//onBind
//...
}
Run Code Online (Sandbox Code Playgroud)
MainViewHolder.kt
class MainViewHolder(private val binding: ListItemMainBinding): RecyclerView.ViewHolder(binding.root) {
fun bind(listener: View.OnClickListener, manufacturer: String, color: Int) {
with(binding) {
binding.listener = listener
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用不同的文件,我不确定这将如何在MainAdapter. 这会class …
generic-type-argument android-recyclerview android-databinding androidx android-listadapter
每当我在我的应用程序 gradle 中启用它时
dataBinding {
enabled = true
}
Run Code Online (Sandbox Code Playgroud)
然后同步 -> 完全成功。
但是当我“运行”它时,它构建失败并显示此错误
java.lang.NullPointerException at android.databinding.tool.store.LayoutFileParser.parseOriginalXml(LayoutFileParser.java:135) at android.databinding.tool.store.LayoutFileParser.parseXml(LayoutFileParser.java:93) ...
我的应用程序很少有 Kotlin 代码,android 版本是 3.5,minSdkVersion 19,targetSdkVersion 28,并升级到 androidX
我该如何解决这个问题?我应该搜索哪个部分来解决这个问题???
除了上面的代码,一切都很完美。
编辑 当我在升级到 androidX 之前回滚我的代码并编译它时,它还显示“空点异常”,此时,除了“空点异常”之外,没有额外的消息。
一Activity、二Fragment有共同点ViewModel。我已经验证每个片段中的视图模型引用都是相同的。
在片段一的布局 XML 中,有一个TextInputLayout. 片段二用布尔值更新视图模型。文本输入布局正在观察该值,并且应该BindingAdapter在该值更改时调用 a 。
当片段实例化并且它们的布局膨胀时,绑定适配器会触发,所以我知道视图正在观察这个值。但是,稍后,当片段二更新值时,片段一中的视图不会触发绑定适配器。
这是onCreateView()片段一中的内容:
registrationViewModel = activity?.run {
ViewModelProviders
.of(this, RegistrationViewModelFactory(prefs, dataFetcherService))
.get(RegistrationViewModel::class.java)
} ?: throw Exception("Invalid Activity")
Run Code Online (Sandbox Code Playgroud)
这是观察该视图模型的视图:
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/reg_auth_code_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
bind:errorState="@{registrationViewModel.registrationData.authorizationError}"
bind:errorMessage="@{@string/invalid_auth_code}">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/reg_auth_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{registrationViewModel.registrationData.authCode}"
android:hint="@string/enter_auth_code"
android:maxLines="1"
android:inputType="text"
android:imeOptions="actionDone"
app:autoSizeTextType="uniform"/>
</com.google.android.material.textfield.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)
至于片段二,onCreateView() 中的代码相同:
registrationViewModel = activity?.run {
ViewModelProviders
.of(this, RegistrationViewModelFactory(prefs, dataFetcherService))
.get(RegistrationViewModel::class.java)
} ?: throw Exception("Invalid Activity")
Run Code Online (Sandbox Code Playgroud)
单击按钮时,片段二会在视图模型中触发一个活动:
private fun attemptNavigationToUserData() {
viewModelScope.launch {
isAuthorized = runBlocking { …Run Code Online (Sandbox Code Playgroud) 我在使用 Kotlin 协程 + LiveData + DataBinding 时遇到问题。
我的代码如下
class TempViewModel: ViewModel() {
val creatorInfo: LiveData<CreatorInfo> = liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
val data = CreatorInfoSettingRepository.requestCreatorInfo().body()
emit(data!!)
}
}
Run Code Online (Sandbox Code Playgroud)
和 xml 像这样使用数据绑定
<TextView
android:text="@{viewModel.creatorInfo.email}" />
<TextView
android:text="@{viewModel.creatorInfo.phone}" />
....
Run Code Online (Sandbox Code Playgroud)
我检查从服务器(retrofit2)获取数据(CreatorInfo)是否成功,但数据未通过数据绑定应用于UI。
另外,当像下面这样检查观察时,观察块也会被调用。
viewModel.creatorInfo.observe(fragment, Observer { creatorInfo ->
Log.d("ssong","test")
})
Run Code Online (Sandbox Code Playgroud)
有谁可以帮忙吗?
android kotlin android-databinding android-livedata kotlin-coroutines
我正在尝试使用数据绑定在我的视图模型中处理 imeOption actionDone。
还有一些其他帖子没有提供我正在寻找的解决方案。我想用 BindingAdapter 在 XML 中设置它来处理 actionDone 事件。在其他帖子的解决方案之后,我不断收到不同的数据绑定错误。
我真的希望我能找到一个概述所有数据绑定 XML 语法的文档,以及为什么工作会导致很多文档(包括官方 Android 文档)使用 lambdas not/passing params 的混合而不加解释。稍微改变它并在gradle构建中绑定错误。
xml
<EditText
android:id="@+id/passwordEdit"
android:layout_width="0dp"
android:layout_height="42dp"
android:ems="10"
android:text="@={mainViewModel.password}"
android:inputType="textPassword"
android:imeOptions="actionDone"
app:onEditorActionDone="@{(view) -> mainViewModel.onEditorActionDone(view)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/passwordTitle" />
Run Code Online (Sandbox Code Playgroud)
视图模型
@BindingAdapter({"onEditorActionDone"})
public void onEditorActionDone(EditText view) {
AppLog.d(TAG, "-> onEditorActionDone()");
view.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) {
//do login
}
//do nothing
});
}
Run Code Online (Sandbox Code Playgroud)
我试过了
app:onEditorActionDone="@{mainViewModel::onEditorActionDone}"
app:onEditorActionDone="@{(view) -> mainViewModel.onEditorActionDone()}"
app:onEditorActionDone="@{mainViewModel.onEditorActionDone}"
我正在使用数据绑定库在 recyclerview 中绑定数据,但我不断收到以下错误,我不明白错误在哪里,我已经多次检查我的代码,并且我已经尝试了互联网上所有可能的解决方案,但什么也没有正在工作。请帮我解决这个问题。先感谢您。
错误
Could not find accessor com.apis.models.MoviesPageModel.movies
at android.databinding.tool.util.L.printMessage(L.java:134)
at android.databinding.tool.util.L.e(L.java:107)
Run Code Online (Sandbox Code Playgroud)
视图模型
class MoviesPageModel(private val api: ServiceApi): BaseViewModel() {
private val _moviesList: MutableLiveData<List<Section>> = NotNullMutableLiveData(arrayListOf())
val movies: MutableLiveData<List<Section>> get() = _moviesList
fun getMovies() {
addToDisposable(api.getMoviesRE().with()
.doOnSubscribe {}
.doOnSuccess {}
.doOnError {}.subscribe({
if(it != null){
_moviesList.value = it.Sections
}
}, {
})
)
}
}
Run Code Online (Sandbox Code Playgroud)
xml
<layout 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">
<data>
<variable
name="vm" type="com.models.MoviesPageModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui_fragments.Movies">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:moviesAdapter="@{vm.movies}"
app:viewModel="@{vm}" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud) 由于 Kotlin Synthetics 已被弃用,我们正在迁移到 ViewBinding。
我已经尝试了很多关于 ViewStub、ViewBinding 的谷歌搜索和阅读文档,并且已经为 Fragments 活动实现了 ViewBinding,包括、合并标签,但是我找不到任何使用 ViewBinding 来膨胀 ViewStub 的方法。
<ViewStub
android:id="@+id/viewStubLayout"
tools:layout="@layout/view_demo_layout" />
Run Code Online (Sandbox Code Playgroud)
请忽略宽度和高度属性,它们是作为样式添加的,并已从此代码段中删除。
您能否分享如何使用 ViewBinding 动态地使用另一个 xml 布局来扩展此视图。
即使在 ViewStub.java 文件中,类级别的注释也指出,
执行布局资源膨胀的首选方法如下:
ViewStub 存根 = findViewById(R.id.stub); 查看充气 = stub.inflate();
这是否意味着,我必须继续使用 R.layout.xxx_xx 来膨胀视图存根。我不能使用该特定 xml 文件的绑定对象来扩展视图吗?
android kotlin kotlin-android-extensions android-databinding android-viewbinding