#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