标签: android-databinding

android 数据绑定开关侦听器不起作用

所以我创建了val isSwitchChecked = ObservableBoolean(false)变量并像这样添加到开关上的 XML 中android:checked="@={viewmodel.isSwitchChecked()}",因为我想在加载数据时将其设置为布尔值检查,并且一切正常,直到我添加,OnCheckedChangeListener然后开关不会对侦听器做出反应,除非我删除它android:checked="@={viewmodel.isSwitchChecked()}"来自 XML。这是怎么回事?我怎样才能让它双向发挥作用?

xml android android-databinding

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

Android 数据绑定问题:表达式 XXX 不能反转

我是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

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

绑定 onTextChanged 用于编辑文本

我正在尝试将 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}"但仍然出现同样的错误。

有什么帮助吗?

android android-databinding

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

ListAdapter 没有类型参数 - 如何在 AndroidX 中创建单独的 ViewHolder 文件?

我一直在学习 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

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

启用数据绑定时的 java.lang.NullPointerException = true

每当我在我的应用程序 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 之前回滚我的代码并编译它时,它还显示“空点异常”,此时,除了“空点异常”之外,没有额外的消息。


android android-databinding androidx

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

值更新时不调用 Android BindingAdapter

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)

android android-databinding android-livedata

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

Kotlin协程+LiveData+DataBinding问题

我在使用 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

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

EditText imeOptions 和数据绑定不起作用

我正在尝试使用数据绑定在我的视图模型中处理 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}"

android android-databinding

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

数据绑定:如何解决“找不到访问器”问题

我正在使用数据绑定库在 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)

android kotlin android-databinding

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

如何在 Android 中使用 ViewBinding 来扩充 ViewStub

由于 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

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