#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 больше не работает и работает только один раз