В чем смысл android:layout_height=?attr/actionBarSize

Я пытаюсь понять строку кода в заголовке. Я так понял, что ? означает, что значение будет взято из темы. Но когда он с префиксом attrs, я понимаю, что он определен где-то в системе Android. Также я увидел, что выбранная тема в приложении является дочерней по отношению к Theme.AppCompat.NoActionBar, которая не определяет значение для actionBarSize:

<style name="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>



<declare-stylable name="Theme">
<attr name="actionBarSize" format="dimension" >
        <enum name="wrap_content" value="0" />
    </attr>

Я также нашел тему (с названием Theme) на каком-то ресурсе GitHub, который действительно присваивает значение actionBarSize, но эта тема не кажется родителем ни в одной родительской цепочке новых API Android: Theme.xml


person Eitanos30    schedule 14.03.2020    source источник


Ответы (1)


Как вы обнаружили, .NoActionBar предоставляет только два атрибута:

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

Остальные атрибуты наследуются от родителя этого стиля. В цепочке родительских стилей для .NoActionBar есть Base.V21.Theme.AppCompat.Light, который устанавливает actionBarSize:

<item name="actionBarSize">?android:attr/actionBarSize</item>

В этом случае префикс ?android: означает, что он исходит непосредственно от платформы Android, которая устанавливает для него значение 56dp.

Вы можете увидеть все это, если посмотрите краткую документацию по вашему стилю:

введите здесь описание изображения


Кроме всего прочего, android:layout_height="?attr/actionBarSize" означает, что представление должно быть той же высоты, что и панель действий. На самом деле не имеет значения, что окончательное значение окажется 56dp; дело в том, что каким бы ни было значение, этот вид будет именно таким высоким.

person Ben P.    schedule 14.03.2020
comment
Большое спасибо, но я не мог правильно понять ваш ответ. Прежде всего, в соответствии с кодом, который я приложил, Theme.AppCompat.NoActionBar не имеет родителя, поэтому как вы можете подняться в цепочке до Base.V21.Theme.AppCompat. Свет? Во-вторых, я прикрепил ‹attr name=actionBarSize format=dimension ›, так что же такое ‹attr name=actionBarSize format=dimension ›, который вы написали? Кроме того, я не понял, что ваш последний скриншот. Извини :( - person Eitanos30; 15.03.2020
comment
я только хочу найти стиль (тему), который устанавливает значение actionBarSize и тему Theme.AppCompat.NoActionBar, наследуемую от него. Но это кажется невозможным, поскольку в соответствии с кодом, который я нашел (может быть, есть способ добавить его сюда), тема NoActionBar не наследуется ни от какой темы :( - person Eitanos30; 15.03.2020
comment
после поиска в миллион раз, я думаю, мой вопрос должен заключаться в том, почему NoActionBar не имеет родителя? - person Eitanos30; 15.03.2020
comment
Каждый раз, когда в имени стиля есть точки, то, что находится перед последней точкой, является родителем (если только parent не указано явно). Таким образом, родителем Theme.AppCompat.NoActionBar является Theme.AppCompat. developer.android.com/guide/topics/ui/look- and-feel/themes ctrl+f для записи через точку - person Ben P.; 15.03.2020
comment
<attr name="actionBarSize" format="dimension"> — это объявление атрибута, говорящее о том, что темам теперь разрешено устанавливать значение dimension для чего-то с именем actionBarSize. - person Ben P.; 15.03.2020
comment
я выглядел как сумасшедший более двух часов (также по URL-адресу, который вы мне прислали) и не нашел точечную нотацию, пока вы не сказали мне :( . Большое спасибо !!! - person Eitanos30; 15.03.2020