Каковы различные варианты использования attrs в Android?

#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 можно использовать для пользовательского представления, а также в качестве значения для атрибутов в макете xml

2. Вам нужен некоторый код в пользовательском классе представления для получения пользовательского атрибута. Я написал комментарий в своем ответе.

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 , so CustomView может использовать эти атрибуты, но другие представления не могут? что вы для этого сделали? и почему color_primary внутри не может быть атрибута CustomView ? В чем разница между CustomView и `Main_Theme`?

4. Что заставляет распознавать атрибут showText , которого нет для ‘color_primary’? и почему showText распознается в CustomView , но не в TextView

5. Ну, во-первых, извините за небольшую ошибку, я на самом деле имел в виду, что имя пользовательского представления — PieChart, и забыл изменить его в приведенном выше примере XML. Теперь, возвращаясь к вашему вопросу, все представления объявляют схему, в которой она объявляет атрибуты, которые она принимает. Затем он использует эту схему для чтения значений, которые предоставляются пользователем при определении этого представления в layout.xml досье. Итак, в layout.xml файл, если вы дадите ему какой-либо пользовательский атрибут (которого нет в его схеме, которая была определена разработчиком при создании представления), он не сможет его понять / прочитать!