Атрибуты файла XML

Интерфейс, диалоги, темы, стили, меню
Ответить
Paket236
Сообщения: 5
Зарегистрирован: 08 авг 2014, 21:17

Атрибуты файла XML

Сообщение Paket236 » 08 авг 2014, 21:22

Всем добрый вечер!
Недавно начал изучать Android API, а сегодня более менее разобрал основы синтакиса XML.
Затем стал разбирать следующий пример:

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="top"
    android:orientation="vertical" >
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Кнопка 1" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Кнопка 2" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Кнопка 3" />
 
</LinearLayout>
В документации написано, что в классе LinearLayout объявлены атрибуты android:gravity и android:orientation. Поэтому вопросов по ним вроде нет. Дальше возникли вопросы:

1) Откуда берутся атрибуты android:layout_width и android:layout_height в элементе LinearLayout? Они не объявлены в классе LinearLayout и не присутствуют в списке унаследованных (Inherited XML Attributes). Я поискал и нашёл их во вложенном классе ViewGroup.LayoutParams класса ViewGroup. Т.е. вроде как эти атрибуты наследуются вместе со вложенным классом, но тогда почему они не указываются в Inherited XML Attributes ?

2) Откуда берутся атрибуты android:layout_width и android:layout_height в элементе Button? Ни в одном классе иерархии (View-TextView-Button) я их не нашёл...

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Атрибуты файла XML

Сообщение altwin » 10 авг 2014, 14:32

оба они являются Indirect Subclasses для android.view.View, в исходниках самого View есть такая строчка: https://github.com/android/platform_fra ... java#L2791 там в комментариях к ней все написанно.
Изображение

Paket236
Сообщения: 5
Зарегистрирован: 08 авг 2014, 21:17

Re: Атрибуты файла XML

Сообщение Paket236 » 11 авг 2014, 17:57

altwin, благодарю за ответ!
Уже сам смог разобраться, частично помог урок 16:
http://startandroid.ru/ru/uroki/vse-uro ... krana.html

Оказывается, иерархия атрибутов по-своему организована. Вот пара картинок для наглядности:
ИзображениеИзображение
После того, как более-менее разобрался, что и откуда берётся, сделал некоторые выводы (надеюсь, что в целом правильные; немного сложновато сформулированы, но может кому-нибудь пригодятся :) ):

Итак, с ViewGroup-элементом связаны атрибуты, объявленные в классах ViewGroup и ViewGroup.LayoutParams.
Атрибуты класса ViewGroup (+унаследованные) ViewGroup-элемента доступны только для самого себя.
Атрибуты класса ViewGroup.LayoutParams (+унаследованные) ViewGroup-элемента доступны только для непосредственных (в XML-иерархии) View- и ViewGroup-элементов-наследников. Для самого себя атрибуты собственного вложенного класса недоступны.
В свою очередь, для {View-элемента-наследника || ViewGroup-элемента-наследника} доступны атрибуты класса ViewGroup.LayoutParams (+унаследованные) непосредственного (в XML-иерархии) ViewGroup-элемента-родителя, а также атрибуты всех классов-родителей (в java-иерархии) {View-элемента-наследника || ViewGroup-элемента-наследника соответственно}.

Но кое в чём я не смог разобраться: почему в каждом элементе доступен атрибут android:layout_gravity ? Насколько я знаю, такой атрибут объявлен в LinearLayout.LayoutParams, но, как видно на скриншоте ниже и приведённом xml-коде, он без проблем указывается в элементе RelativeLayout:
Изображение

Код: Выделить всё

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300px"
    android:layout_height="300px"
    android:layout_gravity="bottom|right"
    android:gravity="left"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
Это какой-то особенный атрибут, исключение из правил?

Да, и ещё походу в Eclipse есть глюк (v4.4.0): для содержимого (т.е. для непосредственных элементов-наследников) элемента TableRow недоступны атрибуты android:layout_column и android:layout_span, объявленные в TableRow.LayoutParams (по крайней мере, отсутствуют в списке). В Android Studio всё нормально.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Атрибуты файла XML

Сообщение altwin » 11 авг 2014, 18:31

View является родителем для ViewGroup, который есть абстрактный класс со всеми вытекающими. LayoutParams - это inner класс для ViewGroup и используется он для указания родителям их поведения, в частности он лишь определяет ширину и высоту. Все остальное поведение определяется для каждого элемента, тот эе gravity - это отдельный класс - https://github.com/android/platform_fra ... y.java#L24 и RelativeLayout только работает с ним. Точно я не помню и лень разбираться но помоему этот метод: https://github.com/android/platform_fra ... .java#L312

P.S. в общем если хотите разобраться в работе классов - документация вам не поможет, запускайте дебагер и смотрите какие методы вызываются и когда, исходникидоступны и вы можете их изучать. Врятли кто -то это все помнит, в каждом случае можно зайти, посмотреть и забыть.
Изображение

Paket236
Сообщения: 5
Зарегистрирован: 08 авг 2014, 21:17

Re: Атрибуты файла XML

Сообщение Paket236 » 11 авг 2014, 19:33

altwin, я Вас поправлю, наверное не inner, а nested (static nested class).

Но ведь речь идёт об XML, как мне тут проверить в отладчике?

Вопрос ведь про 1 единственный атрибут. Хочется понять, почему он работает не как остальные.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Атрибуты файла XML

Сообщение altwin » 11 авг 2014, 20:46

Paket236 писал(а):altwin, я Вас поправлю, наверное не inner, а nested (static nested class).

Но ведь речь идёт об XML, как мне тут проверить в отладчике?

Вопрос ведь про 1 единственный атрибут. Хочется понять, почему он работает не как остальные.
в принципе да nested более подходит в качестве термина, просто потому, так принято, я имелл ввиду просто внутренний, если вложенный нравится больше - пожалуйста, хотя да статические классы inner называть не принято... По поводу того, что это артибут xml - это не так важно. Вы же можете все это делать программно, соответсвенно выставив точки остановы, но оно вам и не надо. Если вы сделаете это программно то все итак очевидно. Чтобы не выдумывать простой пример из кода:
[syntax=java5]
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
params.weight = 1.0f;
params.gravity=Gravity.TOP;

button.setLayoutParams(params);
[/syntax]
там важна по сути одна строчка и конкретно в ней вызов Gravity.TOP, ссылку на класс я давал в предыдущем сообщении и обращаясь к нему не из LinearLayout по сути ничего не меняется. Вы можете использовать этот класс как угодно, в томчисле переопределяя и важно не столько, что это свойство работает для RelativeLayout, сколько то, что работает оно иначе.
Изображение

Paket236
Сообщения: 5
Зарегистрирован: 08 авг 2014, 21:17

Re: Атрибуты файла XML

Сообщение Paket236 » 11 авг 2014, 21:14

Правильно ли я уловил мысль, что в java-коде, в отличие от xml-кода, можно использовать, грубо говоря, что хочешь и где хочешь?
Т.е., получается, что нет ничего странного, что в xml-коде android:layout_gravity может находиться в любом элементе (ведь тоже самое можно реализовать в java-коде?). Но то, что в xml-коде остальные атрибуты (по крайней мере из тех, что я видел) на такое не способны, делает данный атрибут исключением из "правил", верно?

upd:
Я немного погорячился, всё же android:layout_gravity доступен не всем подряд элементам, а только самому первому ViewGroup-элементу (не считая тех случаев, что я во втором посте озвучил).
А вот действительно доступны всем элементам - это атрибуты android:layout_height и android:layout_width (сразу не обратил на это внимание).

Ответить