3

I have extension function in app module

@BindingAdapter("imageSrc")
fun setImageUrl(view: ImageView, userId: Int) {

    try {

        val drawableRes = when {
            userId % 6 == 0 -> {
                R.drawable.avatar_1_raster
            }
            userId % 6 == 1 -> {
                R.drawable.avatar_2_raster
            }
            userId % 6 == 2 -> {
                R.drawable.avatar_3_raster
            }
            userId % 6 == 3 -> {
                R.drawable.avatar_4_raster
            }
            userId % 6 == 4 -> {
                R.drawable.avatar_5_raster
            }
            else -> {
                R.drawable.avatar_6_raster
            }
        }

        val requestOptions = RequestOptions()
        requestOptions.placeholder(R.drawable.ic_launcher_background)

        Glide
            .with(view.context)
            .setDefaultRequestOptions(requestOptions)
            .load(drawableRes)
            .into(view)

    } catch (e: Exception) {
        e.printStackTrace()
    }
}

it works fine when it's used in a layout in app module but when it's called from the same layout that is in a dynamic feature module results compile error below

[databinding] {"msg":"Cannot find a setter for
 \u003candroidx.appcompat.widget.AppCompatImageView app:imageSrc\u003e
 that accepts parameter type \u0027int\u0027\n\nIf a binding adapter
 provides the setter, check that the adapter is annotated correctly and
 that the parameter type
 matches.","file":"features/post_detail/src/main/res/layout/fragment_post_detail.xml","pos":[{"line0":19,"col0":28,"line1":19,"col1":38}]}

Layout that uses this binding

<?xml version="1.0" encoding="utf-8"?>
<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="item"
            type="com.smarttoolfactory.tutorial8_2dynamicfeatures_complexarchitecture.api.Post" />
    </data>


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/ivAvatar"
            imageSrc="@{item.userId}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:src="@drawable/avatar_1_raster"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/tvTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:gravity="center"
            android:text="@{item.title}"
            android:textSize="26sp"
           android:inputType="textCapWords"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="@id/ivAvatar"
            app:layout_constraintStart_toStartOf="@id/ivAvatar"
            app:layout_constraintTop_toBottomOf="@id/ivAvatar"
            tools:text="Sample Title" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/tvBody"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="16dp"
            android:text="@{item.body}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@id/ivAvatar"
            app:layout_constraintStart_toStartOf="@id/ivAvatar"
            app:layout_constraintTop_toBottomOf="@id/tvTitle"
            tools:text="Sample Body" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>
chand mohd
  • 2,363
  • 1
  • 14
  • 27
Thracian
  • 43,021
  • 16
  • 133
  • 222
  • Hi there, any news about this? Bumped into the same issue. Thanks! – smuk Dec 09 '20 at 17:19
  • @smuk unfortunately no. I create same binding adapter in each module. If you find more practical answer feel free to post it here. – Thracian Dec 09 '20 at 17:24
  • I have found a possible duplicate: https://stackoverflow.com/questions/62238993/access-binding-adapters-in-multi-module-project - still no answer :) – smuk Dec 09 '20 at 18:19
  • 2023 still no solution and I still have same issue. what i am trying to do to avoid code duplication is to create another module and move all my common ui and binding adapters to it. so both feature module and app module uses it. magically binding adapters work. – rakesh kashyap May 11 '23 at 02:24

0 Answers0