Android Layout - когда использовать приложение: vs android:?

Я пишу некоторые приложения для Android, но я не понимаю, когда использовать app: и когда использовать android:. Когда стили не применяются так, как они предполагают, я использую пробную версию и ошибку, и иногда обнаруживаю, что использование app: вместо android: решает проблему, но я не понимаю, почему. Было бы здорово, если бы кто-то мог указать мне в правильном направлении. Спасибо!

Ответ 1

Вы говорите о пользовательском пространстве имен. В Android мы можем создавать пользовательские представления в дополнение к уже доступным представлениям. Согласно документам Google для разработчиков. Чтобы добавить встроенный View в свой пользовательский интерфейс, вы указываете его в элементе XML и управляете его внешним видом и поведением с помощью атрибутов элемента. Хорошо написанные пользовательские представления также можно добавлять и стилизовать с помощью XML. Чтобы включить это поведение в своем пользовательском представлении, вы должны:

Определите пользовательские атрибуты для вашего представления в элементе ресурса. Укажите значения для атрибутов в макете XML. Извлечение значений атрибута во время выполнения. Примените полученные значения атрибута к вашему представлению.

Определив пользовательские атрибуты, вы можете использовать их в XML файлах макета, как встроенные атрибуты. Разница лишь в том, что ваши пользовательские атрибуты принадлежат другому пространству имен. Вместо того, чтобы принадлежать к пространству имен http://schemas.android.com/apk/res/android, они принадлежат http://schemas.android.com/apk/res/[y[your имени пакета]

Так что, если вы используете представления по умолчанию, вы можете использовать пространство имен Android, а если вы хотите установить и использовать атрибуты для пользовательского представления, вы можете определить свое собственное имя.

Отослать это

Ответ 2

Вы можете использовать пространство имен приложения, чтобы обеспечить совместимость приложения со старыми версиями API.

Например, app: srcCompat = "@drawable/customborder" имеет те же эффекты, что и для android: background = "@drawable/customborder". Разница в том, что первый будет работать правильно с более старым API, а второй не будет отображать то, что вам нужно.

Ответ 3

Если вы посмотрите на начало ваших XML файлов макета (в которых вы использовали app:), вы, вероятно, найдете такие строки:

<?xml version="1.0" encoding="utf-8"?>
<SOME_LAYOUT xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

в этом случае пространство имен app: будет использоваться для пользовательских атрибутов, указанных вами внутри файла attrs.xml или кого-то другого в одной из используемых библиотек.

Ответ 4

Кроме того, вы найдете два варианта

xmlns:app="http://schemas.android.com/apk/res-auto" 

xmlns:app="http://schemas.android.com/apk/[packagename]"

разница между строками xmlns заключается в том, что res-auto заботится о разрешении нашего пакета, поскольку когда-то мы добавим в наш пакет .debug или .test, и мы уже предоставили packageid приложения Ex:

xmlns:app="http://schemas.android.com/apk/com.test.io.debug"
xmlns:app="http://schemas.android.com/apk/com.test.io.test"

Ответ 5

Иногда свойство с Android доступно только в новой версии Android, как 0Nbux.png

В этом случае вам следует использовать app:... чтобы он работал со старой версией.