Intereting Posts
Менеджер Alarm сохраняется даже после перезагрузки? Как активировать запуск как домашнюю деятельность Android: Как задержать захват определенного кадра, снятого камерой? Calendar.MONTH дает неправильное значение Обнаружение типа отображения в Android Android Volley ImageLoader – параметр BitmapLruCache? Android: как работает приложение Protector? Как вы можете получить доступ к содержимому баз данных Android Emulator? PhoneGap Начало работы с Android «Отсутствует один из следующих» Как заставить Espresso ждать, пока Data Binding обновит представление с помощью модели данных? Как играть в видеоролики MP4 с Youtube? Как продвигать / открывать приложение из результатов поиска в поисковой системе Google? Ошибка компилятора / предупреждение об исключении catch / throwing Android: Canvas.drawText () размер текста на разных разрешениях экрана Как отключить конкретный элемент списка в режиме просмотра списка в Android?

Неверная документация на Android о псевдонимах компоновки?

Я хотел бы выяснить, как использовать повторное использование или «псевдоним» с наименьшим кодом шаблона.

Похоже, что документация на Android о псевдонимах макета неверна и, безусловно, кажется непоследовательной. В этом разделе документации показан следующий файл макета в качестве примера:

<resources> <item name="main" type="layout">@layout/main_twopanes</item> </resources> 

Если я попытаюсь скомпилировать это, я получаю, что в Attribute is missing the Android namespace prefix . Даже после добавления пространства имен в элемент resources , я получаю error: Error: String types not allowed (at 'type' with value 'layout').

В другом месте в документации для Android они показывают другой и, казалось бы, инвертированный и неправильный способ создания псевдонимов:

Чтобы создать псевдоним существующего макета, используйте элемент, завернутый в <merge> . Например:

 <?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge> 

Выполнение этого приводит к следующей ошибке в LogCat E/AndroidRuntime(1558): android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true . Таким образом, эта ошибка, похоже, подтверждает тот факт, что эта пара <include> <merge> должна быть ошибкой, потому что она требует ненужного родительского View .

Наконец, есть документация <merge> , которая, кажется, противоречит прежнему направлению, не говоря о перевернутой форме верхнего уровня <merge><include/></merge> .

Чтобы избежать включения такой избыточной группы представлений, вы можете вместо этого использовать элемент в качестве корневого представления для повторно используемого макета. Например:

 <merge xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/add"/> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/delete"/> </merge> 

Первый метод работает, вам просто нужно поместить ваш файл <resources> в правильную папку. Он должен находиться в папках values не папок layout как вы могли бы при повторном использовании макетов через <include> .

Например, предположим, что у вас есть макет с именем editor.xml который живет в папке layout . Предположим, вы хотите использовать специализированный макет для small и normal размеров экрана. Если вам не хотелось повторять себя, вы просто скопировали и ввели этот макет в layout-small и layout-normal папки и назовите его editor.xml в каждой папке. Таким образом, у вас будет три файла с именем editor.xml .

Если вы не хотите повторять себя, вы разместите специализированный макет в папке основного layout и назовите его, скажем, compact_editor.xml . Затем вы создадите файл с именем layout.xml в layout.xml values-small и values-normal . Каждый файл будет читать:

 <?xml version="1.0" encoding="utf-8"?> <resources> <item name="editor" type="layout">@layout/compact_editor</item> </resources> 

Я зарегистрировал проблему с документацией о двух других проблемах.