O que é o namespace XML Android do 'app'?

164

Aqui está um exemplo do appnamespace que eu vi de um res/menu/main.xmlarquivo

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
    android:title="@string/action_settings"
    android:orderInCategory="100"
    app:showAsAction="never" />
</menu>

Qual é o objetivo do appnamespace? É um espaço para nome XML Android "padrão"? As mesmas opções de valor estão disponíveis para o mesmo atributo, colocadas em dois namespaces diferentes (por exemplo, app:showAsActione android:showAsAction).

Dos documentos : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

ou seja, a linha no exemplo acima significaria outra coisa se o atributo fosse:

android:showAsAction="never"

Quase parece que pode ser algum tipo de mecanismo de "subclasse", mas não consigo encontrar nenhuma documentação real no appespaço para nome das fontes do Google / Android.

coder123
fonte

Respostas:

213

O appespaço para nome não é específico a uma biblioteca, mas é usado para todos os atributos definidos no seu aplicativo, seja pelo seu código ou pelas bibliotecas importadas, criando efetivamente um único espaço para nome global para atributos personalizados - ou seja, atributos não definidos pelo sistema Android .

Nesse caso, a appcompat-v7biblioteca usa atributos personalizados que espelham os do android:namespace para oferecer suporte a versões anteriores do android (por exemplo: android:showAsActionfoi adicionada apenas na API11, mas app:showAsAction(sendo fornecida como parte do aplicativo) funciona em todos os níveis da API que o aplicativo faz) - obviamente usar o android:showAsActionnão funcionaria nos níveis da API em que esse atributo não está definido.

ianhanniballake
fonte
1
Obrigado! Estou feliz por finalmente ter encontrado uma menção a isso na documentação. Uma pergunta de acompanhamento, no entanto. Os documentos da barra de ação no seu link dizem: "Observe que o atributo showAsAction acima usa um espaço para nome personalizado definido na tag <menu>. Isso é necessário ao usar qualquer atributo XML definido pela biblioteca de suporte, porque esses atributos não existem no diretório Estrutura do Android em dispositivos mais antigos. Portanto, você deve usar seu próprio espaço para nome como um prefixo para todos os atributos definidos pela biblioteca de suporte ".
precisa saber é o seguinte
1
Então, o que acontece em dispositivos mais antigos, onde os atributos não existem na estrutura? Ainda não está claro para mim como a definição de um namespace personalizado funciona em torno do suporte ausente para um atributo. Declarar showAsActionem um espaço de nome personalizado significa que funciona conforme o esperado nas plataformas mais recentes e é ignorado nas plataformas mais antigas?
precisa saber é o seguinte
4
Os atributos que não existem são ignorados silenciosamente. Ao criar um atributo personalizado, você garante que o atributo personalizado existirá no tempo de execução (obviamente: sua definição está incluída no seu aplicativo). Portanto, a biblioteca de suporte usa atributos customizados para que seu código personalizado para criação de menus possa usar um único caminho de código que funcione em todas as versões da API, substituindo essencialmente qualquer necessidade de uso das android:versões.
Ianhanniballake
2
Me desculpe se eu não estou apenas não entendendo. Você pode me ajudar a entender como a simples alteração do namespace fornece uma definição para um atributo? Se o showAsNameatributo não é suportado em uma biblioteca mais antiga, como é que usando um personalizado namespace permitir que a plataforma para conhecer o leque de opções possível valor ( ifRoom, never, etc.), e saber como interpretar essas opções? Estou assumindo que "atributos que não existem" significa atributos para os quais não existe implementação na biblioteca. Trocar android:por app:dificilmente parece uma solução completa. Estou esquecendo de algo?
precisa saber é o seguinte
14
Existem duas partes: 1) o atributo personalizado ( app:showAsName) e todos os seus valores possíveis são incluídos no seu aplicativo quando você inclui a appcompat-v7biblioteca (que o define em seu attrs.xmlarquivo). 2) A biblioteca AppCompat (especificamente, ActionMenuView , que é usada automaticamente quando você usa ActionBarActivity) analisa e usa o app:showAsActionpara mostrar corretamente os itens da mesma maneira em todos os níveis da API. Certamente exige que XML e código funcionem juntos.
Ianhanniballake
0

Você pode obter algumas explicações neste link

Espaço para nome XML

Declaração de namespace Um namespace XML é declarado usando o atributo XML reservado xmlns ou xmlns: prefix, cujo valor deve ser um nome de namespace válido.

Por exemplo, a seguinte declaração mapeia o prefixo "xhtml:" para o espaço de nome XHTML:

xmlns: xhtml = "http://www.w3.org/1999/xhtml"

Qualquer elemento ou atributo cujo nome comece com o prefixo "xhtml:" é considerado no espaço para nome XHTML, se ele ou um ancestral tiver a declaração do espaço para nome acima.

Também é possível declarar um espaço para nome padrão. Por exemplo:

xmlns = "http://www.w3.org/1999/xhtml"

Nesse caso, qualquer elemento sem um prefixo de espaço para nome é considerado no espaço para nome XHTML, se ele ou um ancestral possuir a declaração padrão do espaço para nome acima.

Se não houver declaração de espaço para nome padrão no escopo, o nome do espaço para nome não terá valor. [6] Nesse caso, um elemento sem um prefixo explícito de espaço para nome é considerado como não estando em nenhum espaço para nome.

Os atributos nunca estão sujeitos ao espaço para nome padrão. Um atributo sem um prefixo explícito de espaço para nome é considerado como não estando em nenhum espaço para nome.

KIRPAL SINGH
fonte