首页 文章

Android Databinding不能与androidX一起使用

提问于
浏览
-1

我正在尝试新的android x库,它取代了android中的旧appCompat库 . 我遇到了一个问题 . 我想在recyclerView项目上加载图像,为此我想使用数据绑定 . 这是我的代码

<androidx.appcompat.widget.AppCompatImageView
                app:loadImageFromNetwork="@{car.model.photoUrl}" <- here I'm using binding class
                android:id="@+id/appCompatImageView"
                android:layout_width="170dp"
                android:layout_height="0dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

在这里我的绑定类

import androidx.appcompat.widget.AppCompatImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide

object Bindings {
    @JvmStatic
    @BindingAdapter("loadImageFromNetwork")
    fun loadImageFromNetwork(imageView: AppCompatImageView, url: String) {
        Glide.with(imageView.context).load(url).into(imageView)
    }
}

而且我收到了这个错误

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> android.databinding.tool.util.LoggedErrorException: Found data binding errors.
  ****/ data binding error ****msg:Cannot find the setter for attribute 'app:loadImageFromNetwork' with parameter type java.lang.String on android.widget.ImageView.
  file:S:\Downloads\ppp\MyApplication\app\src\main\res\layout\car_item_view.xml
  loc:26:44 - 26:61
  ****\ data binding error ****

有什么想法有什么不对吗?

编辑我也在我的 gradle.properties 文件中有这个

android.useAndroidX=true
android.enableJetifier=true

这是我的汽车课

data class Car(val id:  Int, val plateNumber: String, val location: Location, val model: Model)

data class Model(val id: Int, val title: String, val photoUrl: String)

2 回答

  • 0

    您的编译器无法找到方法 loadImageFromNetwork() ,因为它已添加到 object 中,因此请考虑将其放在类中:

    import androidx.appcompat.widget.AppCompatImageView
    import androidx.databinding.BindingAdapter
    import com.bumptech.glide.Glide
    
    class Bindings {
        companion object {
            @JvmStatic
            @BindingAdapter("loadImageFromNetwork")
            fun loadImageFromNetwork(imageView: AppCompatImageView, url: String) {
                Glide.with(imageView.context).load(url).into(imageView)
            }
        }
    }
    

    你很高兴去上课 .

  • 0

    试试这个

    class CarViewModel(var car: Car, val context: Context) {
    
    fun getImageCar() = car.model.photoUrl
    
    companion object {
        @JvmStatic @BindingAdapter("imageUrl")
        fun setImageUrl(imageView: ImageView, url: String) {
            Glide.with(imageView.context).load(url).into(imageView)
        }
      }
    }
    

    在您的XML文件中

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="android.view.View"/>
        <variable name="carViewModel"
                  type="your.package.CarViewModel"/>
    </data>
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <ImageView
                    android:id="@+id/iv_notice"
                    android:layout_width="120dp"
                    android:layout_height="120dp"
                    app:imageUrl="@{carViewModel.imageNotice}"/>
    
    </LinearLayout>
    

    它适用于我,您需要先获取URL,然后数据绑定将您的URL放入imageView . 我也使用androidX,不是用于图像,而是用于其他组件

相关问题