Как передать запечатанный класс через привязку данных

#android #android-studio #kotlin #data-binding #viewmodel

#Android #android-студия #kotlin #привязка данных #viewmodel

Вопрос:

У меня есть следующий запечатанный класс:

 sealed class Pot(
    val ball: Ball,
    val potType: PotType,
    val potAction: PotAction
) {
    class HIT(hitBall: Ball) : Pot(hitBall, PotType.HIT, PotAction.CONTINUE)
    object SAFE : Pot(Ball.NOBALL, PotType.SAFE, PotAction.SWITCH)
    object MISS : Pot(Ball.NOBALL, PotType.MISS, PotAction.SWITCH)
    class FOUL(foulBall: Ball, foulAction: PotAction): Pot(foulBall, PotType.FOUL, foulAction)
    class REMOVERED(removeBall: Ball): Pot(removeBall, PotType.REMOVERED, PotAction.CONTINUE)
    object ADDRED: Pot(Ball.RED, PotType.ADDRED, PotAction.CONTINUE)
}
 

Я хочу передать это из xml в модель представления как таковую:

 <data>
    <import type="com.example.snookerscore.fragments.game.Pot"/>
    // other variables
</data>
 

Затем я использую лямбды в представлениях, которые мне нужны, чтобы передать информацию обработчику кликов:

 <TextView
    android:id="@ id/game_btn_act_safe"
    style="@style/temp_btn"
    android:onClick="@{() -> gameViewModel.updateFrame(Pot.SAFE)}"
    // Other view Properties 
/>
 

Я получаю эту ошибку:

Не удалось найти идентификатор «Горшок». Убедитесь, что идентификатор написан правильно и что теги or отсутствуют.

Я также пытался импортировать Pot.SAFE напрямую, но он по-прежнему не работает

Ответ №1:

Привязка данных использует Java для генерации кодов, и в ваших XML-файлах вы должны кодировать на Java (например, троичные условия записываются с condition ? A : B помощью вместо Kotlin if/else )

Итак, вам нужно получить доступ к этим объектам, используя синтаксис Java, что-то вроде:

 android:onClick="@{v -> gameViewModel.updateFrame(Pot.SAFE.INSTANCE)}"
 

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

1. Я также заметил это () вместо v в начале onClick . что может вызвать некоторые проблемы (я обновил свой ответ, на самом деле я скопировал ваш и отредактировал его). Кроме того, когда вы Cmd/Ctrl B или Cmd Click Pot при импорте, приводит ли это вас к определению? Возможно, в пакете действительно есть опечатка или что-то в этом роде

2. На самом деле это работало в сочетании с <import type="com.example.snookerscore.fragments.game.Pot"/> . Я протестировал оба () , v и оба они работают в моем случае.

Ответ №2:

используется;

 <variable
            name = "sealedName"
            type="com.example.snookerscore.fragments.game.Pot"/>
 

Удалено

 <import type="com.example.snookerscore.fragments.game.Pot"/>
 

Финал;

 android:onClick="@{() -> gameViewModel.updateFrame(sealedName.SAFE)}"
 

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

1. Я все еще получаю сообщение об ошибке: не удалось найти средство доступа com.example.snookerscore.fragments.game.Pot.SAFE