「アプリ」Android XML名前空間とは何ですか?


164

これはapp私がres/menu/main.xmlファイルから見た名前空間の例です

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

app名前空間はどのような目的に役立ちますか?「標準」のAndroid XML名前空間ですか?2つの異なる名前空間(例:app:showAsActionandroid:showAsAction)に配置された同じ属性に同じ値のオプションを使用できますか?

ドキュメントから: android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

つまり、上記の例の行は、属性が代わりにあった場合、別の意味になります。

android:showAsAction="never"

なんらかの「サブクラス化」メカニズムのように思われappますが、Google / Androidソースから名前空間に関する実際のドキュメントを見つけることができません。

回答:


213

app名前空間には、ライブラリに固有のものではないが、それはどうか、あなたが効果的にカスタム属性のための単一のグローバル名前空間を作り、インポートあなたのコードによって、またはライブラリで、あなたのアプリケーションで定義されたすべての属性のために使用されている-すなわち、Androidのシステムで定義されていない属性。

この場合、appcompat-v7ライブラリはandroid:名前空間のものをミラーリングするカスタム属性を使用して、以前のバージョンのAndroidをサポートします(たとえばandroid:showAsAction、API11でのみ追加されましたが、app:showAsAction(アプリケーションの一部として提供されているため)アプリが行うすべてのAPIレベルで機能します)。を使用してandroid:showAsActionも、その属性が定義されていないAPIレベルでは機能しません。


1
ありがとうございました!ついにドキュメントでこれについての言及を見つけてうれしいです。ただし、フォローアップの質問が1つあります。リンクのアクションバードキュメントには次のように記載されています。「上記のshowAsAction属性は、<menu>タグで定義されたカスタム名前空間を使用することに注意してください。サポートライブラリで定義されたXML属性を使用する場合、これらの属性が古いデバイスのAndroidフレームワーク。サポートライブラリで定義されているすべての属性のプレフィックスとして、独自の名前空間を使用する必要があります。」
coder123 2014年

1
では、属性がフレームワークに存在しない古いデバイスではどうなりますか?カスタム名前空間の定義が、欠落している属性のサポートをどのように回避するかは、まだはっきりしていません。showAsActionカスタム名前空間で宣言すると、新しいプラットフォームでは期待どおりに機能し、古いプラットフォームでは無視されますか?
coder123 2014年

4
存在しない属性は黙って無視されます。カスタム属性を作成すると、実行時にカスタム属性が存在することが保証されます(明らかに、その定義はアプリに含まれています)。したがって、サポートライブラリはカスタム属性を使用するため、メニューを作成するためのカスタムコードは、すべてのAPIバージョンで機能する単一のコードパスを使用でき、基本的にandroid:バージョンを使用する必要性を置き換えます。
ianhanniballake 2014年

2
取得できないだけでごめんなさい。名前空間を変更するだけで属性の定義がどのように提供されるかを理解できますか?場合はshowAsName属性が古いライブラリでサポートされていない、どのようにプラットフォームが可能な値のオプション(の範囲知ることができるように、名前空間のカスタムを使用しないifRoomneverなど)、およびそれらのオプションを解釈する方法を知っていますか?「存在しない属性」とは、ライブラリに実装が存在しない属性を意味すると想定しています。スワップandroid:のためにapp:ほとんどは、完全な回避策のように思えます。何か不足していますか?
coder123 2014年

14
それには2つの部分があります。1)カスタム属性(app:showAsName)とそのすべての可能な値は、ライブラリー(ファイルで定義)を組み込むときにアプリ組み込まれます。2)AppCompatライブラリ(具体的には、を使用すると自動的に使用されるActionMenuView)は、を解析して使用し、すべてのAPIレベルで同じようにアイテムを適切に表示します。確かに、XMLとコードの両方を連携させる必要があります。appcompat-v7attrs.xmlActionBarActivityapp:showAsAction
ianhanniballake 2014年

0

このリンクから説明を得ることができます

XML名前空間

名前空間宣言XML名前空間は、予約済みのXML属性xmlnsまたはxmlns:prefixを使用して宣言されます。その値は有効な名前空間名でなければなりません。

たとえば、次の宣言は "xhtml:"プレフィックスをXHTML名前空間にマップします。

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

名前が接頭辞「xhtml:」で始まる要素または属性は、その要素または祖先に上記の名前空間宣言がある場合、XHTML名前空間にあると見なされます。

デフォルトの名前空間を宣言することも可能です。例えば:

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

この場合、名前空間接頭辞のない要素は、その要素または祖先に上記のデフォルトの名前空間宣言がある場合、XHTML名前空間にあると見なされます。

スコープにデフォルトの名前空間宣言がない場合、名前空間名には値がありません。[6] その場合、明示的な名前空間接頭辞のない要素は、どの名前空間にも属していないと見なされます。

属性がデフォルトの名前空間の影響を受けることはありません。明示的な名前空間接頭辞のない属性は、どの名前空間にも属していないと見なされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.