Androidの「@ id /」と「@ + id /」の違い


456

間diffirence何である@id/とは@+id/

では@+id/、プラス記号+新しいリソース名を作成し、にして追加するように指示しR.javaたファイルが、何について@id/?のドキュメントからID:Androidリソースを参照するID場合、プラス記号は必要ありませんが、次のようにandroidパッケージの名前空間を追加する必要があります。

android:id="@android:id/list"

しかし、下の画像では、Eclipseはいかなる種類のも示唆していません@android:id/

@ / idおよび@ + / idの提案を示す画像

ある@id/@android:id/同じ?


(これを見つけるために永遠にかかった、と私は関係のない問題を探していました):Androidのドキュメントからdeveloper.android.com/guide/topics/resources/...
フアンBonfante

回答:


351

Android resourcesAndroidシステムで既に定義されているを参照し@android:id/..ます。プロジェクトで定義/作成したリソースにアクセスしながら、@id/..

より詳しい情報

チャットでの説明に従って、次のような問題があると述べました:

使用しandroid:id="@id/layout_item_id"ても機能しません。代わりに@+id/機能するので、ここでの違いは何ですか?そしてそれが私の元の質問でした。

まあ、それはコンテキストに依存し、のXML属性を使用してandroid:idいる場合、新しいIDを指定し、パーサー(またはビルダーと呼ぶ)にで新しいエントリを作成するように指示しR.javaているため、次のようにする必要があります。+標識を含める。

他のケースでは、のようにandroid:layout_below="@id/myTextView"、すでに作成されているIDを参照しているため、パーサーはこれをで既に作成されているIDにリンクしますR.java

再び詳細情報

チャットで言ったようにandroid:layout_below="@id/myTextView"、ID myTextViewが使用されている要素の後に記述されていると、はその要素を認識しません。


142
"More Info Again"について:で位置をandroid:layout_below="@+id/myTextView"定義し、THENで要素自体を定義できますandroid:id="@id/myTextView"
CAW

1
@MarcoWそれは私を非常に助けました。この問題の解決策を見つけるのに苦労していました(または、正しい検索エントリを作成することができませんでした)。それはそれ自身の質問+答えに値するかもしれないと思います。
David Miler 2012

ありがとうございました!私も同じ問題を抱えていて、ドキュメントではこのトピックについてあまり触れていません。しかし、それは明白です。ここで発生した問題は頻繁ではありません...
c '25

7
私は常にandroid:idとandroid:layout_belowで@ + id /を使用していますが、それは問題ですか?
melanke 2014年

4
@melanke:置く+layout_belowと同様でandroid:idあるため、本当に大丈夫ですThe '+' means to create the symbol if it doesn't already existTanmayマーンダルは彼の素敵な(まだ過小評価)の回答で述べたように。そのため、実行時の悪影響もありません(^^でもコンパイル時間がわずかに増える可能性があります)。
Levite、2015

86

+記号は、リソースIDのリストにIDを追加するためのショートカットです。それ以外の場合は、このようなxmlファイルに含める必要があります。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>

1
@schwiz:それをレイアウトでどのように使用できますか?
Vikas Patidar、2011

7
あなたが私の回答で定義したリソースファイルがあると想像してください、そしてあなたのレイアウトであなたが持つことができるあなたが<View android:id="@id/my_logo"/> 上記で定義したリソースファイルを持っていなかったなら、あなたは<View android:id="@+id/my_logo"/> メモのようにそれをする必要があります:+ idを一度だけする必要があるだけですそのため、別のレイアウトファイルで<View android:id = "+ id / my_logo" />を実行した場合、次に同じIDをレイアウトで使用するときに「+」文字を含める必要はありません。
Nathan Schwermann、2011

@schwiz:わかりました。でも、そのファイルをどこに置く必要がありますres/drawable/か、res/layout/またはそのファイルres/values/の名前は何ですか?これに関する有用なリンクがあれば、ここに投稿してください。
Vikas Patidar、2011

1
ここでは、リソースの命名規則などについて知っておく必要があるすべてのものを示します。ファイルをres / values /に置き、慣習としてファイルにidsという名前を付けますが、好きなように呼び出すことができます。 developer.android.com/guide/topics/resources/...
ネイサンSchwermann

46

レイアウトファイルに次のような参照が表示されることがあります。

<listview id="@+id/android:list">

そして

<listview id="@android:id/list">

違いは何ですか?

..聞いてよかった☺

@+id/fooアプリケーションの名前空間にfooという名前のIDを作成していることを意味します。を使用して参照できます@id/foo@android:id/fooは、android名前空間で定義されたIDを参照していることを意味します。

「+」は、シンボルがまだ存在しない場合に作成することを意味します。android:シンボルを参照するときは必要ありません(使用しないでください)。シンボルはプラットフォームによって既に定義されており、そのネームスペースで独自のものを作成することはできません。

この名前空間は、フレームワークの名前空間です。たとえば、@android:id/listこれはフレームワークが検出すると期待するIDであるため、使用する必要があります(フレームワークはAndroid名前空間のIDのみを認識しています)。

このソースから完全にコピー


6
うわぁ!CTRL + Cを押してからCTRL + Vを押します。元の投稿への参照も入れてくれてうれしいです。ところで、それはあなたのブログですか?
アマンアラム

ボタンタイプの1番目のレイアウト@ + id / mybuttonで宣言した場合、@ id / mybuttonのように使用される2番目のレイアウトでifの新しいインスタンスを作成する必要はありません。正しいですか?
Hiren Dabhi 2013年

39

要するに

android:id="@+id/my_button"

+ idプラス記号は、リソースに新しいIDを追加または作成するようにandroidに指示します。

ながら

android:layout_below="@id/my_button"

すでに生成されたIDを参照するのに役立ちます。


9

+リソースIDを初めて定義する場合にのみ、リソースタイプの前のプラス記号()が必要です。アプリをコンパイルすると、SDKツールはID名を使用しR.javaて、EditText要素を参照するプロジェクトのファイルに新しいリソースIDを作成します。この方法でリソースIDを一度宣言すると、IDへの他の参照にプラス記号は必要ありません。プラス記号の使用は、新しいリソースIDを指定する場合にのみ必要であり、文字列やレイアウトなどの具体的なリソースには必要ありません。リソースオブジェクトの詳細については、サイドボックスを参照してください。

送信元:https : //developer.android.com/training/basics/firstapp/building-ui.html



6

開発者ガイドから:

android:id="@+id/my_button"

@文字列の先頭にあるアットマーク()は、XMLパーサーが残りのID文字列を解析して展開し、それをIDリソースとして識別する必要があることを示します。プラス記号(+)は、これを作成してリソース(R.javaファイル内)に追加する必要がある新しいリソース名であることを意味します。Androidフレームワークによって提供される他のIDリソースがいくつかあります。AndroidリソースIDを参照する場合、プラス記号は必要ありませんがandroid、次のようにパッケージの名前空間を追加する必要があります。

android:id="@android:id/empty"


4

Eclipseにはバグがあります。 @+id/..、プロジェクトをクリーンビルドした後でも、R.javaファイルにすぐに追加されないことがあります。解決策は、Eclipseを再起動することです。

これは、できるだけ早く解決する必要があると思います。これは、一部の開発者が構文に問題があると勘違いし、実際にデバッグするものが何もない場合でもデバッグしようとする可能性があるためです。


3
私がAndroid Studioに切り替えて振り返ることがなかった理由の1つ:)(私はあなたが答えを書いたときにまだそこになかったことを知っています)
Konrad Morawski 2013

4

Androidは、XMLファイルの値が格納されるリソースと呼ばれるいくつかのファイルを使用します。

@ id /をXMLオブジェクトに使用すると、値ファイルにすでに登録されているIDを参照しようとしています。一方、@ + id /を使用すると、「+」記号で示されるように、値ファイルに新しいIDが登録されます。

お役に立てれば :)。


4

@id/そして@android:id/同じではありません。

@id/アプリケーションでIDを@android:id/参照し、Androidプラットフォームでアイテムを参照します。

Eclipseは間違っています。


Yorは、アプリケーションリソースを参照するために使用すると@id/ referencing ID in your applicationecliseが与えると言ってError: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')います。では、@id/との違いは何@+id/ですか?どのように日食が間違っていると言えるでしょうか?
Vikas Patidar、2011

1
@android:idの提案が表示されない場合、Eclipseは間違っています。そして、どこかに@ + id / myIdで宣言せずに@ id / myIdを使用している場合は、誤りです。@ id / xxxはすべて、アプリケーションのどこかで@ + id / xxxを使用して宣言する必要があります。
オレガス

ご説明ありがとうございます。私はここで日食が間違っているのではなく、レイアウト要素のコンテキストに基づく提案を示していると思います。それ@id/が場合にのみ示すようにRelativeLayout
Vikas Patidar

2

間の差@+id@idなります。

  • @+idR.javaファイル内のビューのIDを作成するために使用されます。
  • @id R.javaファイルでビュー用に作成されたIDを参照するために使用されます。

で使用@+idしていますがandroid:id=""、IDが作成されておらず、作成する前にそれを参照している場合はどうですか(前方参照)。

その場合、@+ididを作成するために使用する必要があり、ビューを定義するときにそれを参照する必要があります。

以下のコードを参照してください:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

上記のコードで、SpinnerのID @+id/spinnerはが他のビューで作成され、スピナーを定義するときに、上記で作成されたIDを参照しています。

したがって、ビューが作成される前にビューを使用している場合は、IDを作成する必要があります。


1

“@+id/”“@id/”Android

最初の1つはID特定のuiコンポーネントのを作成するために使用され、もう1つは特定のコンポーネントを参照するために使用されます


1

ビューアイテムが同じ操作を実行する場合、@+id複数@+id/fooR.javaファイルのコンパイル中にファイルは1つの列挙しか作成しないので、任意のレイアウトで各エントリを使用できます。たとえば、同じ操作を実行する各ページに保存ボタンがある場合android:id="@+id/button_save"、各レイアウトで使用します。R.javaファイルには、button_saveのエントリが1つだけあります。

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