#java #android #layout #attr
#java #Android #макет #attr
Вопрос:
Прежде всего, я знаю, что есть много сообщений об этой проблеме, и я думаю, что прочитал их все. Если кто-нибудь спросит, я приложу их для утверждения 🙂
У меня проблема с attrs. Проблема в том, что иногда я вижу, как программисты используют его при создании пользовательского представления, но иногда я вижу, что они также используются при создании темы. Например:
<declare-styleable name="Main_Theme">
<attr name="background" format="reference" />
<attr name="backgroundCard" format="reference" />
<attr name="secondaryTextColor" format="reference" />
<attr name="primaryTextColor" format="reference" />
<attr name="primaryColor" format="reference" />
<attr name="secondaryColor1" format="reference" />
<attr name="secondaryColor2" format="reference" />
<attr name="secondaryColor3" format="reference" />
<attr name="dividerColor" format="reference" />
и затем они создают тему, используя ее.
Например:
<item name="background">@color/dark_theme_background</item>
<item name="backgroundCard">@color/dark_theme_card_background</item>
<item name="secondaryTextColor">@color/dark_theme_scores_new</item>
<item name="primaryTextColor">@color/dark_theme_primary_text_color</item>
<item name="primaryColor">@color/dark_theme_primary_color</item>
<item name="secondaryColor1">@color/dark_theme_secondary_1_color</item>
<item name="secondaryColor2">@color/dark_theme_secondary_2_color</item>
<item name="secondaryColor3">@color/dark_theme_secondary_3_color</item>
<item name="dividerColor">@color/dark_theme_divider_color</item>
Затем я увидел, что они используют эти элементы в качестве значений для атрибутов в XML-файле layout activity
Так что я действительно не могу понять разнообразие использования attrs.
Я надеюсь, что кто-нибудь может помочь мне понять, потому что я чувствую себя очень смущенным
Ответ №1:
attr используется при создании пользовательского представления с пользовательским атрибутом. Если вы определяете attr, вы можете использовать его в XML-файле.
В обычном представлении используются атрибуты по умолчанию, такие как ширина, высота, фон, текст и т. Д. Таким образом, вы можете использовать его в XML-файле.
<TextView
android:width="match_parent"
android:height="wrap_content"
android:background="@color/white"
android:text="@string/app_name" />
Но для вашего пользовательского представления нет атрибута.
Если для вашего пользовательского представления требуется атрибут dividerColor, вы не можете использовать его android: dividerColor следующим образом.
<YourCustomView
android:width="match_parent"
android:height="wrap_content"
android:background="@color/white"
android:dividerColor="@color/black" /> // it caused compile error.
Итак, вам нужен ваш атрибут для использования в XML-файле.
Для этого вам нужно объявить attrs в attrs.xml досье. (имя файла xml может измениться.)
<declare-styleable name="Main_Theme">
<attr name="dividerColor" format="reference" />
</declare-styleable>
И затем вы можете использовать новый атрибут в просмотре XML-файла.
<YourCustomView
xmlns:app="http://schemas.android.com/apk/res-auto" // need define app
android:width="match_parent"
android:height="wrap_content"
android:background="@color/white"
app:dividerColor="@color/black" /> // it's works
PS: Вам нужен дополнительный код для использования пользовательского attr в файле класса YourCustomView.
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.Main_Theme);
dividerColor = ta.getColor(R.styleable.MainTheme_divider_color, Color.WHITE);
Комментарии:
1. Прежде всего, я думаю, что для того, чтобы ваш последний пример работал
Main_Theme
, его необходимо заменитьYourCustomView
.. Во-вторых, я не могу понять, как<declare-styleable
можно использовать для пользовательского представления, а также в качестве значения для атрибутов в макете xml2. Вам нужен некоторый код в пользовательском классе представления для получения пользовательского атрибута. Я написал комментарий в своем ответе.
3. Стилизуемое имя может быть любым. вы можете просто использовать его в коде в R.styleable. «Стилизуемое имя».
4. Можете ли вы сослаться на блок кода с именем элемента = ? В дополнение к вашему примеру .. divide_color теперь может быть атрибутом TextView , например?
Ответ №2:
Attr представляет атрибут в элементе. Проще говоря, attrs — это допустимые величины, которые определены в схеме, связанной с документом.
Всякий раз, когда мы создаем пользовательское представление, мы не хотим, чтобы представление принимало все возможные значения под небом, поэтому мы определяем несколько значений, которые могут быть приняты представлением с помощью интерфейса attr. эти атрибуты определяются с помощью declare-stylable, который позволяет определять атрибуты для пользовательских представлений.например:
<resources>
<declare-styleable name="PieChart">
<attr name="showText" format="boolean" />
<attr name="labelPosition" format="enum">
<enum name="left" value="0"/>
<enum name="right" value="1"/>
</attr>
</declare-styleable>
</resources>
это пользовательское представление принимает атрибуты showText и label. showText принимает логическое значение, а labelPosition принимает значения: left и right . как в примере ниже
<PieChart
showText="false"
labelPosition="left"/>
аналогично в темах нам нужно определить определенные атрибуты, которые можно использовать внутри темы, например, если мы создаем 2 темы и хотим определить другой основной цвет, который будет использоваться приложением при использовании любой темы. сначала мы объявляем цвет attr следующим образом в attrs.xml:
<declare-styleable name="Main_Theme">
<attr name="color_primary" format="color" />
</declare-stylable>
а затем внутри styles.xml мы определяем значения для параметра color_primary attr для 2 тем
<style name="theme_one">
<item name="color_primary">#ff0000</item> // red
</style>
<style name="theme_two">
<item name="color_primary">#00ff00</item> // green
</style>
затем это значение можно было бы использовать в файлах макета следующим образом: ?attr/color_primary
аналогичным образом attr можно использовать для определения широкого спектра вещей. сам элемент attr имеет 2 атрибута: имя, с которым вы ссылаетесь на него в других частях кода, и формат, который может быть color
, boolean
, и т.д. dimension
float
например, перечисления могут быть определены как:
<attr name="some_enum_attr">
<enum name="value_one" value="1" />
<enum name="value_two" value="2" />
</attr>
Комментарии:
1. Что «мешает» color_primary быть атрибутом представления в layout xml (точно так же, как в PieChart)?
<attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum">
Можно ли использовать в качестве атрибута любого представления внутри layout xml?2. речь идет не столько о предотвращении, сколько о том, что представление распознает как законные и незаконные значения. вы не можете использовать showText и labelPosition в качестве атрибутов представлений, которые не объявили эти атрибуты в своей схеме, как показано в ответе, пожалуйста, простите меня, если я неправильно понял ваш вопрос
3. Все в порядке. Я ценю вашу помощь.. Но я действительно хочу понять, поэтому, пожалуйста, не сердитесь на меня… Вы говорите:
you cannot use showText and labelPosition as attributes of views that haven't declared these attributes in their schema like shown in the answer
. Но какова «связь» междуPieChart
иCustomView
, soCustomView
может использовать эти атрибуты, но другие представления не могут? что вы для этого сделали? и почемуcolor_primary
внутри не может быть атрибутаCustomView
? В чем разница междуCustomView
и `Main_Theme`?4. Что заставляет распознавать атрибут
showText
, которого нет для ‘color_primary’? и почемуshowText
распознается вCustomView
, но не в TextView5. Ну, во-первых, извините за небольшую ошибку, я на самом деле имел в виду, что имя пользовательского представления — PieChart, и забыл изменить его в приведенном выше примере XML. Теперь, возвращаясь к вашему вопросу, все представления объявляют схему, в которой она объявляет атрибуты, которые она принимает. Затем он использует эту схему для чтения значений, которые предоставляются пользователем при определении этого представления в layout.xml досье. Итак, в layout.xml файл, если вы дадите ему какой-либо пользовательский атрибут (которого нет в его схеме, которая была определена разработчиком при создании представления), он не сможет его понять / прочитать!