Изменение URL-адреса ImageView с использованием привязки данных при нажатии на кнопку

#android #android-databinding

#Android #android-привязка данных

Вопрос:

В моем простом приложении я пытаюсь обновить ImageView URL-адрес, чтобы изменить изображение в приложении, я создаю простой класс привязки данных для его реализации, но не работает, и я не получаю никаких ошибок

Мой класс модели как User :

 class User(baseContext: Context) : BaseObservable() {
    val context:Context = baseContext
    var username: String? = null
    var password: String? = null
    var profilePicUrl: String? = null
        @Bindable
        set(profilePicUrl) {
            field = profilePicUrl
            notifyPropertyChanged(BR.profilePicUrl)
        }

    companion object {
        @JvmStatic
        @BindingAdapter("android:profilePicUrl")
        fun loadImage(view: ImageView, imageUrl: String) {
            if (!imageUrl.isEmpty()) {
                Picasso.get().load(imageUrl).into(view)
            }
        }
    }

    @Bindable
    fun getProfilePicVisibility(): Int {
        return if (profilePicUrl == null || profilePicUrl!!.isEmpty()) View.GONE else View.VISIBLE
    }
}
  

LoginActivity класс:

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding: LoginActivityBinding = DataBindingUtil.setContentView(this, R.layout.login_activity)
    binding.viewModel = ViewModelProviders.of(this, LoginViewModelFactory(this)).get(LoginViewModel::class.java)

    val user = User(baseContext)
    user.username = "my name"
    user.password = "my family"
    user.profilePicUrl = ""

    binding.user = user

    val handlers = ClickHandler(this)
    handlers.user = user
    binding.handlers = handlers
}
  

а затем ClickHandler класс

 class ClickHandler(private val context: Context) {
    var user: User? = null

    fun clickOnLoginButton(view: View) {
        user?.profilePicUrl = "https://www.androidhive.info/RxJava/wp-content/uploads/2018/02/1-370x247.jpg"
    }
}
  

после нажатия на кнопку я ожидаю, что URL-адрес ImageView может быть обновлен, и loadImage функция может работать, чтобы получить изображение с URL-адреса и прикрепить к нему

мой упрощенный макет:

 <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="viewModel"
            type="ir.instacheeta.application.ui.login.viewModel.LoginViewModel" />

        <variable
            name="user"
            type="ir.instacheeta.application.ui.login.model.User" />

        <variable
            name="handlers"
            type="ir.instacheeta.application.ui.login.viewModel.ClickHandler" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/grey_10">

        ...

                        <Button
                            ...
                            android:onClick="@{handlers::clickOnLoginButton}"
                            ... />

                        ...

            ...

            <com.mikhaellopez.circularimageview.CircularImageView
                ...
                android:profilePicUrl="@{user.profilePicUrl}"
                android:src="@drawable/img_wizard_1"
                android:tint="@color/mdtp_white"
                android:visibility="@{user.profilePicVisibility, default=gone}"
                ... />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </RelativeLayout>
</layout>
  

Комментарии:

1. Во время отладки вы можете подтвердить, что в вашем адаптере привязки вы действительно вводите внутри своего оператора if?

2. как вы устанавливаете переменные, такие как ViewModel, обработчики? Работает ли ваша функция щелчка?

3. нажатие работает нормально. я проверил это с помощью Toast

4. и как вы обновляете свой пользовательский объект? поскольку в предоставленном коде ваш пользовательский объект всегда будет иметь значение null

5. при входе в систему я создаю новый экземпляр из этого, возможно, вы правы. и мой пользователь неверен

Ответ №1:

Вы объявили пользовательскую переменную в своем классе-обработчике, которая равна null, поэтому вы должны передать объект user из вашего XML в методе clickOnLoginButton в качестве параметра.

 <data>

    <import type="android.view.View" />

    ...
</data>

<Button
...
android:onClick="@{(view) -> handler.clickOnLoginButton(view,user)}"
... />
  

и также обновите свой метод

 fun clickOnLoginButton(view: View,user:User)
  

Комментарии:

1. после добавления <import type="android.view.View" /> это решит вашу проблему с кодом, но после нажатия кнопки URL-адрес imageview не может обновиться

2. можете ли вы проверить, удалив android:visibility=»@{user.profilePicVisibility, default = gone} из imageview. Я только что протестировал то же самое, и это работает для меня

3. я удалил и снова проверил, URL-адрес не может измениться после нажатия на кнопку

4. проблема в том, что после нажатия кнопки BindingAdapter как LoadImage больше не работает и работает только один раз