Co to jest przestrzeń nazw XML aplikacji Android?

164

Oto przykład appprzestrzeni nazw, którą widziałem z res/menu/main.xmlpliku

<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>

Czemu appsłuży przestrzeń nazw? Czy jest to „standardowa” przestrzeń nazw XML systemu Android? Czy te same opcje wartości są dostępne dla tego samego atrybutu umieszczonego w dwóch różnych przestrzeniach nazw (np. app:showAsActionI android:showAsAction).

Z dokumentów : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

tj. czy linia w powyższym przykładzie oznaczałaby coś innego, gdyby zamiast tego atrybut był:

android:showAsAction="never"

Wygląda na to, że może to być jakiś mechanizm „podklasy”, ale nie mogę znaleźć żadnej prawdziwej dokumentacji dotyczącej appprzestrzeni nazw ze źródeł Google / Android.

coder123
źródło

Odpowiedzi:

213

Przestrzeń appnazw nie jest specyficzna dla biblioteki, ale jest używana dla wszystkich atrybutów zdefiniowanych w Twojej aplikacji, czy to przez kod, czy przez importowane biblioteki, efektywnie tworząc jedną globalną przestrzeń nazw dla atrybutów niestandardowych - tj. Atrybutów niezdefiniowanych przez system Android .

W tym przypadku appcompat-v7biblioteka używa niestandardowych atrybutów odzwierciedlających android:przestrzeń nazw do obsługi wcześniejszych wersji Androida (na przykład: android:showAsActionzostała dodana tylko w API11, ale app:showAsAction(dostarczana jako część aplikacji) działa na wszystkich poziomach API, które robi twoja aplikacja) - oczywiście użycie opcji android:showAsActionnie zadziała na poziomach API, na których ten atrybut nie jest zdefiniowany.

ianhanniballake
źródło
1
Dziękuję Ci! Cieszę się, że w końcu znalazłem o tym wzmiankę w dokumentacji. Jedno pytanie uzupełniające. Dokument paska działań w linku mówi: „Zwróć uwagę, że powyższy atrybut showAsAction używa niestandardowej przestrzeni nazw zdefiniowanej w tagu <menu>. Jest to konieczne w przypadku korzystania z atrybutów XML zdefiniowanych przez bibliotekę obsługi, ponieważ te atrybuty nie istnieją w Platforma Android na starszych urządzeniach. Musisz więc użyć własnej przestrzeni nazw jako prefiksu dla wszystkich atrybutów zdefiniowanych w bibliotece pomocy ”.
koder123
1
Co więc dzieje się na starszych urządzeniach, w których atrybuty nie istnieją we frameworku? Nie jest dla mnie jeszcze jasne, jak definiowanie niestandardowej przestrzeni nazw działa w przypadku braku obsługi atrybutu. Czy deklarowanie showAsActionw niestandardowej przestrzeni nazw oznacza, że ​​działa zgodnie z oczekiwaniami na nowszych platformach i jest ignorowane na starszych?
coder123
4
Atrybuty, które nie istnieją, są dyskretnie ignorowane. Tworząc atrybut niestandardowy, gwarantujesz, że atrybut niestandardowy będzie istniał w czasie wykonywania (oczywiście: jego definicja jest dołączona do aplikacji). Dlatego biblioteka obsługi korzysta z atrybutów niestandardowych, aby ich niestandardowy kod do tworzenia menu mógł korzystać z pojedynczej ścieżki kodu, która działa we wszystkich wersjach interfejsu API, zasadniczo zastępując potrzebę korzystania z android:wersji.
ianhanniballake
2
Przepraszam, jeśli po prostu tego nie rozumiem. Czy możesz mi pomóc zrozumieć, jak prosta zmiana przestrzeni nazw zapewnia definicję atrybutu? Jeśli showAsNameatrybut nie jest obsługiwana w starszej biblioteki, w jaki sposób za pomocą niestandardowych nazw pozwalają platforma znać zakres opcji możliwa wartość ( ifRoom, neveretc.), i wiedzieć, jak interpretować te opcje? Zakładam, że „atrybuty, które nie istnieją” oznacza atrybuty, dla których nie ma implementacji w bibliotece. Zamiana android:na app:raczej nie wydaje się kompletnym obejściem. Czy coś mi brakuje?
coder123
14
Składa się z dwóch części: 1) atrybut niestandardowy ( app:showAsName) i wszystkie jego możliwe wartości są uwzględniane w aplikacji po dołączeniu appcompat-v7biblioteki (która definiuje ją w attrs.xmlpliku). 2) Biblioteka AppCompat (w szczególności ActionMenuView, która jest używana automatycznie podczas używania ActionBarActivity) analizuje i używa app:showAsActiondo prawidłowego wyświetlania elementów w ten sam sposób na wszystkich poziomach API. Z pewnością wymaga współdziałania XML i kodu.
ianhanniballake
0

Możesz uzyskać wyjaśnienie z tego linku

Przestrzeń nazw XML

Deklaracja przestrzeni nazw Przestrzeń nazw XML jest deklarowana przy użyciu zastrzeżonego atrybutu XML xmlns lub xmlns: prefix, którego wartość musi być prawidłową nazwą przestrzeni nazw.

Na przykład poniższa deklaracja odwzorowuje prefiks „xhtml:” na przestrzeń nazw XHTML:

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

Każdy element lub atrybut, którego nazwa zaczyna się od przedrostka „xhtml:”, jest uważany za należący do przestrzeni nazw XHTML, jeśli on lub jego przodek ma powyższą deklarację przestrzeni nazw.

Możliwe jest również zadeklarowanie domyślnej przestrzeni nazw. Na przykład:

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

W tym przypadku każdy element bez przedrostka przestrzeni nazw jest uważany za należący do przestrzeni nazw XHTML, jeśli on lub przodek ma powyższą domyślną deklarację przestrzeni nazw.

Jeśli w zakresie nie ma domyślnej deklaracji przestrzeni nazw, nazwa przestrzeni nazw nie ma wartości. [6] W takim przypadku uznaje się, że element bez wyraźnego przedrostka przestrzeni nazw nie znajduje się w żadnej przestrzeni nazw.

Atrybuty nigdy nie podlegają domyślnej przestrzeni nazw. Uważa się, że atrybut bez wyraźnego przedrostka przestrzeni nazw nie znajduje się w żadnej przestrzeni nazw.

KIRPAL SINGH
źródło