Apa namespace Android XML 'aplikasi'?

164

Berikut adalah contoh appnamespace yang saya lihat dari sebuah res/menu/main.xmlfile

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

Apa tujuan appmelayani namespace? Apakah ini namespace Android XML "standar"? Apakah opsi nilai yang sama tersedia untuk atribut yang sama ditempatkan di dua ruang nama yang berbeda (misalnya app:showAsActiondan android:showAsAction).

Dari dokumen : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

yaitu, apakah baris dalam contoh di atas berarti sesuatu yang lain jika atributnya sebaliknya:

android:showAsAction="never"

Sepertinya ini semacam mekanisme "subklasifikasi", tetapi sepertinya saya tidak dapat menemukan dokumentasi nyata di appnamespace dari sumber Google / Android.

coder123
sumber

Jawaban:

213

The appnamespace tidak spesifik untuk perpustakaan, tetapi digunakan untuk semua atribut yang didefinisikan dalam aplikasi Anda, apakah dengan kode Anda atau dengan perpustakaan Anda mengimpor, efektif membuat namespace global tunggal untuk kustom atribut - yaitu, atribut tidak didefinisikan oleh sistem android .

Dalam hal ini, appcompat-v7perpustakaan menggunakan atribut khusus yang mencerminkan android:namespace untuk mendukung versi Android sebelumnya (misalnya: android:showAsActionhanya ditambahkan dalam API11, tetapi app:showAsAction(disediakan sebagai bagian dari aplikasi Anda) berfungsi pada semua level API yang dilakukan oleh aplikasi Anda) - jelas menggunakan android:showAsActiontidak akan berfungsi pada level API di mana atribut itu tidak didefinisikan.

ianhanniballake
sumber
1
Terima kasih! Saya senang akhirnya menemukan menyebutkan ini dalam dokumentasi. Tapi satu pertanyaan lanjutan. Dokumen bilah tindakan di tautan Anda mengatakan: "Perhatikan bahwa atribut showAsAction di atas menggunakan ruang nama khusus yang ditentukan dalam tag <menu>. Ini diperlukan saat menggunakan atribut XML apa pun yang ditentukan oleh pustaka dukungan, karena atribut ini tidak ada di Kerangka kerja Android pada perangkat yang lebih lama. Jadi, Anda harus menggunakan namespace Anda sendiri sebagai awalan untuk semua atribut yang ditentukan oleh pustaka dukungan. "
coder123
1
Jadi apa yang terjadi pada perangkat lama di mana atributnya tidak ada dalam kerangka kerja? Belum jelas bagi saya bagaimana mendefinisikan namespace kustom berfungsi di sekitar dukungan yang hilang untuk atribut. Apakah mendeklarasikan di showAsActionbawah namespace kustom berarti bahwa itu berfungsi seperti yang diharapkan pada platform yang lebih baru dan diabaikan pada yang lebih lama?
coder123
4
Atribut yang tidak ada diabaikan dalam diam. Saat Anda membuat atribut khusus, Anda menjamin bahwa atribut khusus akan ada saat runtime (jelas: definisinya disertakan dengan aplikasi Anda). Oleh karena itu pustaka dukungan menggunakan atribut khusus sehingga kode khusus mereka untuk membangun menu dapat menggunakan jalur kode tunggal yang berfungsi pada semua versi API, yang pada dasarnya menggantikan setiap kebutuhan untuk menggunakan android:versi.
ianhanniballake
2
Saya minta maaf jika saya tidak hanya tidak mendapatkannya. Bisakah Anda membantu saya memahami bagaimana sekadar mengubah namespace memberikan definisi untuk atribut? Jika showAsNameatribut tidak didukung di perpustakaan tua, bagaimana menggunakan kustom namespace memungkinkan platform untuk mengetahui berbagai pilihan yang mungkin nilai ( ifRoom, never, dll), dan tahu bagaimana menafsirkan pilihan mereka? Saya berasumsi bahwa "atribut yang tidak ada" berarti atribut yang tidak ada implementasi di perpustakaan. Bertukar android:untuk app:hampir tidak tampak seperti solusi yang lengkap. Apakah saya melewatkan sesuatu?
coder123
14
Ada dua bagian untuk itu: 1) atribut khusus ( app:showAsName) dan semua nilai yang mungkin dimasukkan dalam aplikasi Anda saat Anda menyertakan appcompat-v7perpustakaan (yang mendefinisikannya dalam attrs.xmlfile -nya ). 2) Pustaka AppCompat (khusus, ActionMenuView yang digunakan secara otomatis saat Anda menggunakan ActionBarActivity) mem-parsing dan menggunakan app:showAsActionuntuk menampilkan item dengan benar dengan cara yang sama di semua level API. Tentunya memang membutuhkan XML dan kode untuk bekerja bersama.
ianhanniballake
0

Anda bisa mendapatkan penjelasan dari tautan ini

Namespace XML

Deklarasi namespace Sebuah namespace XML dideklarasikan menggunakan atribut XML yang disediakan xmlns atau xmlns: awalan, nilai yang harus berupa nama namespace yang valid.

Misalnya, deklarasi berikut memetakan awalan "xhtml:" ke namespace XHTML:

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

Elemen atau atribut apa pun yang namanya dimulai dengan awalan "xhtml:" dianggap berada di namespace XHTML, jika itu atau leluhurnya memiliki deklarasi namespace di atas.

Dimungkinkan juga untuk mendeklarasikan namespace default. Sebagai contoh:

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

Dalam hal ini, elemen apa pun tanpa awalan namespace dianggap berada di namespace XHTML, jika itu atau leluhur memiliki deklarasi namespace default di atas.

Jika tidak ada deklarasi namespace default dalam lingkup, nama namespace tidak memiliki nilai. [6] Dalam hal itu, elemen tanpa awalan namespace eksplisit dianggap tidak ada dalam namespace apa pun.

Atribut tidak pernah tunduk pada namespace default. Atribut tanpa awalan namespace eksplisit dianggap tidak ada dalam namespace apa pun.

KIRPAL SINGH
sumber