14

When I started developping android applications, I had a tendency to define custom R values wherever I need, in particular in layout files. For instance:

findViewById(R.id.customerName).setText(customer.getName())

with layout:

<TextView android:text="TextView" android:id="@id/customerName"
    android:layout_height="wrap_content" android:layout_width="fill_parent" />

Now I realize, it might be better to use android.R instead.

findViewById(android.R.id.text1).setText(customer.getName())

with layout:

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

What practice do you follow? What are the advantages and disadvantages of each?

Alexander Mironov
  • 3,095
  • 26
  • 28
rds
  • 26,253
  • 19
  • 107
  • 134
  • Custom too... I think it is better to have your own stuff used rather than the native OS. Which you don't control in any way – gonxa87 Aug 16 '11 at 18:14
  • 1
    I don't get that. What kind of control do I gain when I use custom identifiers? – rds Aug 16 '11 at 18:39
  • `android:id="@android:id/customerName"` - is this correct? as it is written `customerName` seems to be a id defined at the top level of the Android SDk, but it isn't; you wanted to say maybe `android:id="@+id/customerName`?? – Paul Jan 08 '12 at 08:34
  • 1
    @Paul. Absolutely right. Wrong copy/paste. – rds Jan 08 '12 at 17:24

4 Answers4

17

android.R is meant for utilizing resources built in to the operating system.

There are many images/layouts/etc... that come with the operating system that you can just reference using android.R

if you are referencing your own resources that you have created, most always use R. and in most situations I recommend trying to stay away from the built in resources as they change version to version.

jondavidjohn
  • 61,812
  • 21
  • 118
  • 158
  • 1
    Well, if you want to use the [`ListActivity`](http://developer.android.com/reference/android/app/ListActivity.html), then your own layout that you have created must define a `@android:id/list`. This contradicts the "always use `R.`for your own resources". – rds Aug 16 '11 at 18:34
  • 1
    Also, I don't believe framework resources change from version to version. That would break *everything* – rds Aug 18 '11 at 21:36
  • in fact they do, the built in animated progress indicator for example, visually changes *every* primary release... – jondavidjohn Aug 19 '11 at 01:21
1

Custom. The system-provided IDs come with a risk of referring, in code, to a resource that is not present in the project. Customs IDs exist iff there's a corresponding resource - a drawable, a view, a layout or what have you.

Seva Alekseyev
  • 59,826
  • 25
  • 160
  • 281
  • And yet, if your custom resource (say `R.id.customerName`) is defined in your project in a different layout, the `findViewById()` will fail exactly likewise. I suppose you're not expected to have a working application simply because it compiles. This is inherent to the separation of code and XML. Or am I missing something? – rds Aug 16 '11 at 18:38
  • Well, the basic correctness of project is still kinda required :) I never said using custom IDs will protect you from *all* possible errors. Just from one specific class of errors - where you're trying to load android.R.layout.foo, and it's not quite there. Also, what jondavidjohn said about system provided resources (not just IDs). – Seva Alekseyev Aug 16 '11 at 18:42
  • Do you reuse several time a resource in your project, or do you define a resource only for a layout? For instance, if you have two layouts _main screen_ and _customer details_, will you define `@+id/CustomerNameTextView` in both OR will you define `@+id/mainScreenCustomerNameTV` and `@+id/customerDetailsCustomerNameTV`? – rds Aug 16 '11 at 18:51
  • You mean IDs of views on layouts? I do, occasionally. But those are still my custom IDs. Why? – Seva Alekseyev Aug 16 '11 at 19:21
  • Because if you reuse `@+id/CustomerNameTextView` in several layouts, you have exactly the same problem than using `android.R.id.text`: `findViewById()`can throw a view not found exception. – rds Aug 18 '11 at 20:59
  • I never said using custom IDs will protect you from all possible errors. – Seva Alekseyev Aug 18 '11 at 22:29
0

There is no big advantage or disadvantage of the framework id vs the custom id in layouts.

Advantages of using framework identifiers:

  • Avoid the creation of more identifiers. Saves one field in the apk (and there is an apk size limit).
  • Must be used in some situations, like ListActivity

Drawbacks of using framework identifiers:

  • Don't provide a descriptive name

In both practices

  • The code will work in the future
  • Missing references are discovered at runtime, and hidden at compile time

I thought the the samples in the SDK would help me take a decision, and (guess what?) it doesn't. The Notepad and LunarLander applications use the android.R.id for the view identifiers, whereas the ApiDemos project uses custom identifiers.

Best practice for GestureBuilder which mixes both approaches? (@+id/addButton and @android:id/empty)

IHMO, worse practice for HelloActivity and JetBoy which define @+id/text @+id/Button01... This is not descriptive and could have been replaced by (@andoid:id/button1, or by @+id/startButton)

rds
  • 26,253
  • 19
  • 107
  • 134
-1

You need your own R.java class as it contains references to all of your resources (layouts, images, strings, etc.)

If you want to get a reference to a View with id of "myView", you would use R.id.myView. If you want to get a reference to built-in Android resources, you would use android.R.id.text

Take a look at the following page:

http://developer.android.com/guide/topics/resources/accessing-resources.html

hooked82
  • 6,336
  • 4
  • 41
  • 46