5014


AndroidアプリのUIをXMLで指定するときによく使う `@+id/` ですが、なんでこれだけ `+`
が入っているのですか？なんとなくこう書くものだと思って使っていましたが、改めて考えてみるとなんでだろうと思いまして… `@id/`
ではなぜいけなかったのでしょうか？


CC BY-SA 3.0
2015-01-21T03:24:57.103
4945
2015-01-22T01:27:08.640
450
question
android
@+id/とはなんですか？


@+id/hoge : idを追加で定義する（参照にも使える）  
@id/hoge : idを参照する

と私は理解しています。

RelativeLayoutで使うlayout_below等でIDを参照するような場合では@id/「も」使えます。  
ただ、@+idを使っても結局同じ動作になる為、使い分ける必要性がなく@+idのみを使う人が多いのではないかと思います。

[code]

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
      <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/text1"
          tools:text="text2"/>
    
      <!-- +を使わない場合 -->
      <TextView
          android:id="@id/text1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          tools:text="text1"/>
    </RelativeLayout>
    
[/code]


CC BY-SA 3.0
2015-01-21T04:00:02.210
4952
2015-01-22T01:27:08.640
2015-01-22T01:27:08.640
4739
4739
4945
answer


`@+id` の意味は「新規リソースとして新たに ID を振る」ということです。`+` 記号付きの書き方をすると、整数のリソース ID
が自動生成され、R.java に追加されます。

> The plus-symbol (+) means that this is a new resource name that must be
> created and added to our resources (in the R.java file). There are a number
> of other ID resources that are offered by the Android framework. When
> referencing an Android resource ID, you do not need the plus-symbol, but
> must add the android package namespace

<http://developer.android.com/guide/topics/ui/declaring-layout.html#id> より

参照する場合は `+` 記号を指定せず、代わりに `@id/hoge` のように書きます。個人的には、タイポした場合に発見しやすくするためにも、参照のときは
`@+id/hoge` といった書き方ではなく `@id/hoge` という書き方を推奨します。


CC BY-SA 3.0
2015-01-21T04:18:06.963
4955
2015-01-21T04:18:06.963
4575
4945
answer


「`@+id/`とは何か？」について、完全に理解するには、前提として[`ID
Resource`](http://developer.android.com/guide/topics/resources/more-
resources.html#Id)という地味な存在について理解する必要があると考えます。

これは`res/values/`配下に、以下のように定義することができます。

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <item type="id" name="hoge" />
    </resources>
    
[/code]

個人的に`@+id/hoge`という記法は上記の定義を自動的に行う、糖衣構文の一種だと考えています。

# IDリソースの使い道

`ID Resource`を用いることで`id`のみを定義することができます。

`@id`はほぼ`View`でしか使わず、しかし`View`の`id`は`@+id`で定義をした方がミスが減り品質が担保されるため、使い道はなさそうです。

しかし`ID
Resource`はビルド時点で、名前ごとにユニークな値を持つことを保証してくれます。この性質は非常に便利なので頭の片隅に入れておくといつか役に立つかもしれません。

また、全ての`id`を事前にこの方法で定義すれば、参照だけでレイアウトを記述することも可能ですが、実際にやっているという話は聞いたことがないですし、血迷うなとしか言えません。


CC BY-SA 3.0
2015-01-21T16:57:27.273
5014
2015-01-21T16:57:27.273
5337
4945
answer