how does android app find res.layout.main.xml - android

I'm new... just finished my first eclipse/adt tutorial.
I don't see see anything in the manifest that points to res.layout.main.xml or res.values.strings.xml.
QUESTION: how does android find these xml's?
thanks,
Shannon

All the xml files get sent to the R.java class. They're assigned specific integer IDs that can be referenced in your java code.
when you say setContentView(R.layout.main) you're getting the integer ID and passing it to the content view. This R class then redirects it to your xml.

You can get to these files using the R class. For example when you want to set your contentview to main.xml you do it like this setContentView(R.layout.main);
if you want to reach a String from a XML you can do it like this getResources().getString(R.string.appname);
Also take a look at the Application Resources section of the Dev Guide http://developer.android.com/guide/topics/resources/index.html

Related

what R.java file actually does and how

I have been working on a simple android tutorial and while browsing through the project folders I found this R.java file in gen folder...
When I opened it seemed to me as a mess...
first R itself is a class.
it had multiple Inner classes defined within eg drawable,id,layout,etc.
and that inner classes had lots of variables declared as below which were assigned with hex values
public static final int addr=0x7f080003;
...
...
and much more
R is auto generated and acts as some pointer for other files
Questions for R.java
what it is basically for
how it works
why
values are in hex
what role did it performs while the actual application is running
"Acts as some pointer to other files" is actually absolutely correct, now the question is which files it points to how it is done.
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. Each ID is basically a number which corresponds to some resource in the resource management system.
The file itself is needed so you can access or reference the resource from code by giving the ID of the resource to the resource manager. Say, if you want to set the view in the activity, you call
setContentView(R.layout.main);
main in the R file contains the number which is understood by the Android resource management system as the layout file which is called main.
Why is it better than just plain file names?
It's harder to make a mistake with the generated fields. If you write the field name incorrectly, your program won't compile and you will know that there's an error immediately. If you write an incorrect string, however, the application won't fail until it is launched.
If you want to read more on this topic, you should check the Android documentation, especially the Accessing Resources part.
This holds your resource ids. So when you do something like
TextView tv = (TextView) findViewById(R.id.mytextview);
it looks up your id here for that View, layout, etc... This way the app has an easy way to look up your ids while you can use easy to remember names. Anytime you create a resource it automatically creates an id for it and stores it here. That's why you never want to try and edit this file yourself.
One way to think about how valuable R.java is, imagine a world without it. Its amazing how android brings the xml and java world together to help avoid coding the UI manually completely. With legacy java building UI using the java language was a pain. Invaluable.
With Android you can not only build your UI using only xml, but also see it while you build it. Invaluable.
Every element in the xml can be referenced in the java code WITHOUT writing a single line of code to parse the xml :). Just R.id.nameOfElement. Invaluable.
Rapid development is beautifully done in android. Imagine if iPhone would have 5000 screens to fit that one piece of code, they would crumble on their XCode. Google has done a wonderful job with just R.java. Invaluable.

What does this expression mean : "R.string.gcm_registered"?

I am trying to enable push notifications on my application.
I have the client sample code and now i am trying to get some of the code to implement it on my application. For those of you who have already implemented push notifications on your apps i am sure you are familiar with the class GCMIntentService.
So i am copying this class on my project , i configure the Manifest correctly(or i think i do) but i get errors in the file.
The errors are in expressions like R.string."something"
For example I get errors in :
R.string.gcm_registered
R.string.gcm_message
R.string.gcm_deleted
R.string.gcm_error
R.string.gcm_recoverable_error
R.drawable.ic_stat_gcm
The error is always that gcm cannot be resolved or is not a field.
But what exactly is this expression?! Is it a class or something?
Is it something on the Manifest that I haven't configured correctly?
It are strings, probably in the example app you're using, in /res/values/strings.xml
You put strings in there to have a localized place to put your user visible Strings in, so you have
1. One place to find all your strings, if you ever want to change and/or re-use
2. Easy access to translation by putting translations in per example /res/values-de/strings.xml
Look for that file in whatever example you're using, you'll find some XML defined strings. Copy them into your own project, in the same place.
this may helps you ,define all Reuired String in your strings.xml and save
R.string.gcm_registered
R.string.gcm_message
R.string.gcm_deleted
R.string.gcm_error

How to link R.ids to the actual button android testing

Right now im testing on Android 4.1.1. using Robotium and trying to click on a image button using the id, because solo.clickonImage or solo.clickonImageButton is not working.
The thing is, I don't know how to import or include the R.java file to get the ID. I could see it from the hierarchy viewer, but it still gives me an error when i place the variable in the code.
in my test scripts my R.java doesn't have much in it, therefore can't read id.
How am I suppose to import the developers ID into my test project?
EDIT:
actually i found this programmatically add id to R.id . now my question is, how does my program know what the id is pointing to. example i've created:
< item name = "camera_menu_upload" type="id"/>
How does my script know what camera_menu_upload is on the screen??
You're probably importing the wrong R file. Check your imports and make sure it's importing com.yourcompany.yourapp.R.
to get the button, view, textview, checkbox... use this example:
Button buttonview = (Button) solo.getCurentActivity().findViewById(R.id.mybutton);
solo.clickOnView(buttonview);
if you dont know the id use Hierarchy Viewer to see the button id.
Check out package name in your AndroidManifest file:
<manifest package="com.example.project" . . . >
You need to import R class from your application main package, for example: com.companyname.appname.R
I don't quite understand your question, but is this what you are looking for?
imageButton IB = (imageButton)findViewById(R.id.blablablabla);
if you are using actionbarsherlock there and trying to click on a button, which is a part of actionbarsherlock, you would have to import its r.java file for using the id of that button. i.e. the r.java from application(gen).
r.java file stores different values for different id and accordingly it searches for the value to be resent on the screen. as it finds it, it performs the desired operation over it.

Using map created in res folder

This is probably realy noobish question but, i am unable to solve it. I dont know what i am doing wrong or what should i do, i checked some tuts but i wasnt able to solve it. So i created new folder in res called menu and created new file there called xyz.xml. Now i want to call it in activity with following R.menu.item ... But when i just write R. it doesnt show menu as option. I can call any map which are default here like layout etc, but maps which i created i cant call them. What should i do to solve this?
If the menu file you create is called xyz.xml, then in your code you should use it as:
R.menu.xyz
Also, are you referring to the correct R? There's one R class used for the Android framework resources (android.R) and then there's one specific R class for your projects resources. To ensure you're using the right one you can use the fully qualified namespace, e.g. yourprojectsnamespace.R.
See http://developer.android.com/guide/topics/ui/menus.html for more information about Android menus.

Where can I find the android.R.* files?

I am looking for the preset android files that come with the Android os. Can someone direct me to the source?
(Android install path)\android-sdk-windows\platforms\android-version\data\res
Hope this is what you mean.
Call the following as an example:
android.R.*
You can access built-in animations, layouts, text fields, whatever you need.
So if you wanted to find the default android black color, call the following:
View.setBackGroundColor(android.R.color.black);
This returns the INTEGER containing the pointer to the appropriate resource files.
All R files are generated as integer pointers, so this is the proper way to access these resources.
Hope this helped!
Try codesearch from google:
http://google.com/codesearch (choose android on the left side) or directly:
http://google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/res/&exact_package=android
go to gen-> android.support.v7.appcompat ->R.java
Android generated a special called the
‘R’ file. This is a file of constants that allow you to
get Java references to the TextView you defined
in main.xml In fact, you can get references to all
kinds of in app resources you define! But remember
the String resources you defined in XML? You can
get references to those too.
You mean R.java? It will be in %project root%/res/android/%your project name%/

Categories

Resources