Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the concept behind R.java?

In android R.java is used to provide access to resources defined in XML files. To access the resource we need to invoke findViewById() method passing in the id of the resource to be fetched.

This is similar to Spring where beans are defined in a XML context and are fetched by using application context. context.getBean("beanId")

This provides loose coupling since the beans are defined externally and could be changed without making modifications to the code.

This has me confused. Though what Android does looks similar to spring, what advantage does it offer?

  1. What is the point of having an intermediate R.java anyway? Couldn't we just acquire resources directly from XML by use of a resource reader/application context. e.g. findViewById("resourceId")
  2. There isn't any loose coupling. Since references in R.java get auto-generated how could one delete a resource and put in a new one?
  3. What design pattern does it follow(if there is one)?
  4. Wouldn't it be better to have resources injected using IOC (like Roboguice)? Why did then google decide to give us such a wierd way of working with resources?

Pardon my ignorance. I'm a newbie Java developer trying too many things at once. :-) Thanks for all the feedback.

like image 332
Monika Michael Avatar asked Apr 04 '12 04:04

Monika Michael


People also ask

What is the purpose of R Java?

Android R. java is an auto-generated file by aapt (Android Asset Packaging Tool) that contains resource IDs for all the resources of res/ directory. If you create any component in the activity_main. xml file, id for the corresponding component is automatically created in this file.

What is R class in Java?

R class is generated by Android tools from your resources before compiling your code. It contains assigned numeric constant for each resource that you can refer in your project. For example, you have XML resource file that contains about_button .

What does Android R Java contain?

What does it contain? R file contains IDs for all the resources in the res folder of your project and also some additional IDs that you define on your own (in the layouts, for example). The IDs are needed for the Android resource management system to retrieve the files from the APK.

What is the role of the R Java file in an Android application project?

What is the role of the R. java file in an Android application project? A. It contains all resource IDs allowing the developer to reference them from the code using integers.


2 Answers

Biggest advantage is in Localization and Providing alternate resources for different screen sizes.

e.g you can have a String resource R.string.myname this could be a defined in english in /values-en/strings.xml and in spanish in /values-es/strings.xml

System will take care or picking up the right file depending on the locale you just need to use @string/myname in your layout file or R.string.myname in your code.

Similarly you could have two layout files for portrait and landscape defined in

res/layout/mylayout.xml res/layout-land/mylayout.xml 

In your code you will just specify R.layout.mylayout to inflate the layout. Resource manager picks up the file in layout-land if the device is in landscape mode.

Doing this manually would be a nightmare -- hence the need for R file

like image 139
Rajdeep Dua Avatar answered Sep 18 '22 11:09

Rajdeep Dua


android.R.java is not just where XML ids are stored. It also contains access to resources - such as drawables, layouts, strings, arrays, and basically anything you can declare in resources.

Personally I find that it is useful when using Eclipse. I can simply type findViewById(R.id. and Eclipse will show a tooltip with a list of options to choose from.

However at a platform level, I would say that the hardcoded id variables help prevent errors when using Strings to identify resources -- something that can be debuggable while programming (or during compilation, rather than runtime).

like image 33
Phil Avatar answered Sep 22 '22 11:09

Phil