2017-01-21 7 views
0

Где посмотреть список всех атрибутов всех типов просмотров в Android?Почему атрибуты «включено» и «нажаты» работают для ImageButton?

У меня сложилось впечатление, что ImageButton не имеет enabled и pressed атрибутов. По крайней мере, они не работали, когда я устанавливал их в XML. Также я нашел множество «руководств» о том, как сделать эту кнопку отключенной и/или нажатой.

Одновременно, когда я связал их с привязкой данных

<ImageButton 
      android:id="@+id/locate_button" 
      android:layout_width="64dp" 
      android:layout_height="64dp" 
      android:layout_toRightOf="@id/bookmark_button" 

      android:enabled="@{activity.locateEnabled}" 
      android:pressed="@{activity.locatePressed}" 
      android:onClick="@{activity.onLocateClick}" 


      android:src="@drawable/locate_selector" 
      android:background="@null" 
      /> 

они просто работали. Оба нажаты и включены. В тот же момент pressed даже сообщается как неизвестное свойство по проверке орфографии Android Studion!

Итак, что это?

1) по-дизайн поведения, и я просто не понимаю, что-то (что?)

2) сахар из привязки данных библиотеки

3) хакерство

4) ????

Как узнать, как это возможно?

ответ

3

Ответ - 1 и 2. Связывание данных позволит вам использовать атрибут для вызова любого сеттера в представлении. Вы можете посмотреть на data binding guide's section on attribute setters.

Когда вы устанавливаете атрибут android:enabled, вы используете устройства автоматической привязки данных Android для звонков setEnabled(). Привязка данных Android видит имя атрибута (включено) и ищет сеттера с этим именем и находит setEnabled(). То же самое верно для android:pressed - существует метод setPressed(). Я согласен!

- настоящий атрибут, но привязка данных его не использует. Существует также метод setOnClick(). Вместо этого есть Binding Adapter, который устанавливает OnClickListener для вызова вашего метода onLocateClick(). В этом есть небольшая магия, которая полагается на обработчик аннотации, который использует привязка данных для проверки вашего кода, но достаточно сказать, что он делает это во время компиляции вместо использования времени выполнения.

Все слушатели событий должны иметь привязывающие адаптеры, написанные для них с тем же именем, что и событие (в отличие от имени слушателя). Например, вы также можете установить android:onLongClick. Вы также можете быть заинтересованы в lambda syntax for events.

Я не уверен, что вы подразумеваете под «портативным». Связывание данных можно использовать, по крайней мере, обратно в Gingerbread (мы утверждаем Froyo, но действительно, кто нацелен на Froyo?), Но вы не сможете перенести его в iOS или что-то в этом роде. Все привязки данных Android выполняются с помощью небольшой библиотеки времени выполнения и сгенерированного кода. Вам не нужно беспокоиться о конкретных версиях Android.