Подтвердить что ты не робот

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

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

Рез/макет/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/значения/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. И я немного смущен, как они определяются после того, как мой макет завышен.

4b9b3361

Ответ 1

Не используйте @+id/... в стилях.
@+id/... может использоваться только в макетах.
В противном случае вы можете получить Error executing apt: return code 139 во время сборки.
Используйте @id/... и создайте идентификаторы с помощью файла ресурсов справки, если необходимо: Рез/значения/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

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

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>

Общий: разреш/макет/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>

Ответ 3

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

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

Полезно знать поток приложений.