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/