Определение идентификаторов в стиле, это безопасно или катастрофа?

#android #android-layout

#Android #android-layout

Вопрос:

Следующий вопрос некоторое время озадачивал меня, и я подумал, что, возможно, вопрос об этом не повредит. У меня есть следующее layout.xml и style.xml файлы;

res/layout/layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <LinearLayout
        style="@style/headerContainer" />
    <LinearLayout
        style="@style/footerContainer" />
    <ScrollView
        style="@style/contentContainer" />    
</RelativeLayout>
  

res/values/style.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="container">
    <item name="android:layout_width">fill_parent</item>
    </style>
    <style name="headerContainer" parent="container">
        <item name="android:layout_height">40dp</item>
        <item name="android:layout_alignParentTop">true</item>
        <item name="android:background">#80FF0000</item>
        <item name="android:id">@ id/header</item>
    </style>
    <style name="footerContainer" parent="container">
        <item name="android:layout_height">50dp</item>
        <item name="android:layout_alignParentBottom">true</item>
        <item name="android:background">#8000FF00</item>
        <item name="android:id">@ id/footer</item>
    </style>
    <style name="contentContainer" parent="container">
        <item name="android:layout_height">60dp</item>
        <item name="android:layout_below">@id/header</item>
        <item name="android:layout_above">@id/footer</item>
        <item name="android:background">#800000FF</item>
    </style>
</resources>
  

Теперь вопрос в том, существует ли опасность перекрытия идентификаторов, поскольку я представляю их в style.xml ? Забавно, что этот подход работает, по крайней мере, на эмуляторе, который я использую, но созданные идентификаторы не добавляются в R класс. И я немного смущен тем, как они определяются после того, как мой макет раздут.

Ответ №1:

Не используйте @ id/... в стилях.
@ id/... может использоваться только в макетах.
В противном случае вы можете получить Error executing apt: return code 139 во время сборки.При необходимости
используйте @id/... и генерируйте идентификаторы с помощью файла справочных ресурсов: res/values/ids.xml:

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="header" />
    <item type="id" name="footer" />
</resources>
  

http://developer.android.com/guide/topics/resources/more-resources.html#Id

Ответ №2:

Это небезопасно, мой друг. Вы должны использовать разные идентификаторы для разных файлов. Здесь эмулятор не будет проблемой. Он поймет, потому что для каждого xml-файла определен уникальный код R.java файл автоматически. Таким образом, эмулятор очень легко разберется с этим. Но если вам нужно улучшить или отредактировать код для любой градации up, вы наверняка запутаетесь, какой идентификатор принадлежит макету какого xml-файла или вклинивается. Поэтому предоставьте уникальный идентификатор каждому виджету макета. Будет полезно, если вы предоставите идентификатор, включающий некоторый тег соответствующего имени файла.

Пример: если имя файла filldetails.xml затем вы можете использовать id =@ fd_name

Будет полезно знать, как работает приложение.

Ответ №3:

Я делаю это таким образом, и мне повезло:

Макет res/layout/main.xml

 <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <include layout="@layout/action_bar"/>
</RelativeLayout>
  

Обычный:
res/layout/action_bar.xml

 <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/action_bar_container"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/action_bar_height"
    android:layout_alignParentTop="true"
    android:paddingLeft="5dip"
    android:paddingRight="5dip"
    >

    <TextView
        android:id="@ id/action_bar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textSize="20dip"
        android:textStyle="bold"
        />

</RelativeLayout>
  

Комментарии:

1. Это один из вариантов, который я тоже рассматривал. Но в конце я, хотя, возможно, объявляю верхний / нижний колонтитулы отдельно в каждом layout.xml Они мне нужны, чтобы обеспечить некоторую гибкость, которая того стоит. Пока я могу уменьшить объем копирования / вставки кода до нескольких строк, используя стили, которые есть.