What is the difference between @id and @+id?

android:id="@+id/my_button"

+id Plus sing tells android to add or create a new id in Resources.

android:layout_below="@id/my_button"

it just help to refer the already generated id..


You need to use @+id when you are defining your own Id for a View.

Exactly from docs:

The at-symbol (@) at the beginning of the string indicates that the XML parser should parse and expand the rest of the ID string and identify it as an ID resource. 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.

Here is a practical example:

<Button 
   android:id="@+id/start"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
/>

<Button 
   android:id="@+id/check"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_below="@id/start"
/>

So here, you created two IDs, start and check. Then, in your application you are able to connect to them with findViewById(R.id.start).

And this android:layout_below="@id/start" refer to existing id.start and means that your Button with id check will be positioned below Button with id start.


Sometimes you have to use + sign. E.g. when you use <include ... /> and the included file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.FloatingActionButton xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    (...)
    app:layout_anchor="@+id/view_pager"
    app:layout_anchorGravity="top|right|end"
 />

If you don't add + in "@+id/view_pager" you will get error while building project:

Error:(9, 24) No resource found that matches the given name (at 'layout_anchor' with value '@id/view_pager').

It happend to me me in project with libraries.


All the other answers forgot to mention this one little thing.

When using @id/ to refer to an already generated android resource, make sure that the resource you are referring to is defined earlier and not later.

That is Instead of this:

<Button 
 android:id="@+id/check"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@id/start" 
 />
<Button 
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />

Use this:

<Button 
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
<Button 
 android:id="@+id/check"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@id/start"
 />

In the first example you are referring to a resource @id/start which is generated after you are accessing it. Although this would work in case of native android, but if you are going to use this code in react-native or ionic or any other hybrid platform, it would generate resource not found error.

So be careful to generate the resource id before using it as @id/

Tags:

Xml

Android