what is ids.xml used for?

Just a quick question, what is the ids.xml used for when developing an Android app? I saw an example on the android resources webpage which contained:

<resources>
  <item name="snack" type="id"/>
</resources>

What would this be used for?


Solution 1:

id.xml is generally used to declare the id's that you use for the views in the layouts.

you could use something like

<TextView android:id="@id/snack">

for your given xml.

Solution 2:

ids.xml has the following advantage: all ids were declared, so compiler can recognize them. If something like this:

<TextView
    android:id="@+id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignBelow="@id/text2"
    android:text="...."/>
<TextView
    android:id="@+id/text2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="...."/>

Can result in compiling error because text2 was refered before declared

Solution 3:

When creating views dynamically, predefining id's in ids.xml gives the posibility to reference a newly created view. After you use the setId(id) method you can access the view as if it had been defined in XML. This blog post has a nice example.

Solution 4:

Another application for id.xml is in respect to layouts and library projects. Let's say you specify a generic list of options in a library (dialog) layout

<CheckedTextView android:id="@+id/checked_option_one"...
<CheckedTextView android:id="@+id/checked_option_two"...
...

and handle these views in a generic (dialog) fragment

optionOneCheck = (CheckedTextView)rootView.findViewById(R.id.checked_option_one);
optionTwoCheck = (CheckedTextView)rootView.findViewById(R.id.checked_option_two);

If you remove any of the view declarations from a copy of the layout in a main project, you will get a "no such field" error exception at runtime.

The compiler doesn't complain, but at runtime the id isn't actually there/known.

Declaring the ids in id.xml and using

<CheckedTextView android:id="@id/checked_option_one"...
...

avoids the runtime error

Solution 5:

ids.xml is much more powerful. You can predefine values like

<item name="fragment_my_feature" type="layout"/>
<item name="my_project_red" type="color"/>

not only id. Actually you can use more resource types: https://developer.android.com/guide/topics/resources/more-resources

It's extremely helpful to predefine some layouts, colors etc. in root module for multi-module app. You can keep actual layouts, colors, etc. in specific app module which has root module as dependency.