Я не могу переопределить атрибуты при использовании <include> в моих файлах макета Android. Когда я искал ошибки, я обнаружил отклоненную проблему 2863 :
"включаемый тег не работает (переопределение параметров макета никогда не работает)"
Поскольку Ромен указывает, что это работает в тестовых наборах и его примерах, я, должно быть, делаю что-то не так.
Мой проект организован так:
res/layout
buttons.xml
res/layout-land
receipt.xml
res/layout-port
receipt.xml
В файле buttons.xml содержится что-то вроде этого:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button .../>
<Button .../>
</LinearLayout>
А файлы квитанции с книжной и альбомной ориентацией выглядят примерно так:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
...
<!-- Overridden attributes never work. Nor do attributes like
the red background, which is specified here. -->
<include
android:id="@+id/buttons_override"
android:background="#ff0000"
android:layout_width="fill_parent"
layout="@layout/buttons"/>
</LinearLayout>
Что мне не хватает?
android
android-widget
Эрик Берк
источник
источник
Ответы:
Я только что нашел проблему. Во-первых, вы можете переопределить только атрибуты layout_ *, поэтому фон не будет работать. Это задокументированное поведение и просто недосмотр с моей стороны.
Настоящая проблема находится в LayoutInflater.java:
// We try to load the layout params set in the <include /> tag. If // they don't exist, we will rely on the layout params set in the // included XML file. // During a layoutparams generation, a runtime exception is thrown // if either layout_width or layout_height is missing. We catch // this exception and set localParams accordingly: true means we // successfully loaded layout params from the <include /> tag, // false means we need to rely on the included layout params. ViewGroup.LayoutParams params = null; try { params = group.generateLayoutParams(attrs); } catch (RuntimeException e) { params = group.generateLayoutParams(childAttrs); } finally { if (params != null) { view.setLayoutParams(params); } }
Если тег <include> не включает как layout_width, так и layout_height, возникает исключение RuntimeException, которое обрабатывается автоматически, даже без каких-либо операторов журнала.
Решение состоит в том, чтобы всегда включать и layout_width, и layout_height при использовании тега <include>, если вы хотите переопределить любой из атрибутов layout_ *.
Мой пример должен измениться на:
<include android:id="@+id/buttons_override" android:layout_width="fill_parent" android:layout_height="wrap_content" layout="@layout/buttons"/>
источник
Я отправил запрос на улучшение, чтобы разрешить переопределение всех включенных атрибутов:
источник
<include>
теперь используется все чаще, переопределение attr - действительно необходимая функцияЯ обнаружил, что иногда пропускаю включение тега android: id при использовании конструктора графического интерфейса в Eclipse. Убедившись (когда я замечаю), что я добавляю в TextView из построителя идентификатор, который я использую в макете ListView.
<TextView android:text="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ...
становится
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ...
Вместо того, чтобы получать "ложь" "ложь", я получаю :) и включает работает нормально.
источник