Это мой первый андроид-проект,

Фактически, это первый проект в области программирования.

У меня есть ImageButton, который я хочу скрыть , когда он отключен , Включенное / отключенное состояние выполняется с использованием xml-соединения с моделью просмотра, поэтому я не могу ссылаться на фрагмент, чтобы сделать это программно.

Я попытался использовать список селекторов для передачи серой версии изображения, но я хочу полностью скрыть кнопку, а не только изображение src.

кнопка в макете фрагмента:

        <ImageButton
            android:id="@+id/work_button"
            android:src="@drawable/ic_desktop_windows_black"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:enabled="@{timerViewModel.pcButtonState}"
            android:onClick="@{() -> timerViewModel.activityTypeWork()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/gaming_button"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.40"
            tools:ignore="ContentDescription" />

Переменная, управляющая отключенным / включенным состоянием:

 val pcButtonState = Transformations.map(lastSession){
        it == null
    }

Это сделано для того, чтобы кнопка была активна только тогда, когда последний сеанс был нулевым.

Так есть ли способ управлять android: visibility или android: alpha через селектор или что-то в этом роде?

Спасибо ...


Изменить

Проблема решена, мой ответ и ответ Генри Твиста верны,

Лично я предпочитаю подход Генри, потому что его проще реализовать и поддерживать.

0
Osama Omar 8 Мар 2021 в 17:26

2 ответа

Лучший ответ

Я не думаю, что есть необходимость делать решение таким сложным, если кнопка должна быть скрыта при отключении и видимой при включении, вам вообще не нужно использовать состояние включено / отключено, вы можете просто установить видимость зависит от timerViewModel.pcButtonState.

Так например:

android:enabled="true"
android:visibility="@{timerViewModel.pcButtonState ? View.VISIBLE : View.GONE}"

Изменить

Чтобы использовать внешние классы в привязке данных, вы должны импортировать их в свой тег data, поэтому:

<data>

    <import type="android.view.View" />
</data>
0
Henry Twist 8 Мар 2021 в 15:18

Просто так, если кто-нибудь еще сталкивался с подобной странной ситуацией

Я нашел обходной путь,

Настроив объект-наблюдатель во фрагменте, чтобы наблюдать за переменной, контролирующей состояние

val pcButton = binding.pcButton
      
        timerViewModel.pcButtonState.observe(viewLifecycleOwner, Observer { state ->
            state.let {
                if (it == true) {
                    binding.pcButton.visibility = View.VISIBLE
                }
            }
        })

Теперь я могу программно настраивать свойства кнопки в соответствии с состоянием переменной.

0
Osama Omar 8 Мар 2021 в 15:25