Upward Mobility: Android for iOS Developers, Part 2

Turning Hello World into something useful

When we last left our application, it was running on the emulator, but didn’t do much.  This week, we’ll add some more controls to our activity and wire up some functionality.

As a reminder, activities are roughly equivalent to view controllers in iOS. Right now, there’s not much in our activity, because all we have is a single label in our activity. As iOS developers, we’re used to never looking at our XIB files in the raw, because they’re pretty much human-unreadable. By contrast Android layout files (which end up in the res/layout folder in a standard Eclipse project) are both readable and intended to be edited. At the moment, here’s what ours looks like:


It’s a basic layout with a text view in the upper left hand corner. To start, we can center the text view and bump it up against the top border. If you drag it around in the graphical layout, you’ll see the same kinds of guides as you do in Interface Builder, and it’s pretty easy to just drag the control where you want it, so that it ends up looking like this:

Screen Shot 2013-06-16 at 6.20.04 PMNow we can switch back to the raw XML view, and see how things have changed:

There are now two new attributes, aligning to the parent top and horizontally centering the control. Now we can add a control that lets the user select just which world they are saying hello to. The right control for this is a spinner, which we can drop right under the text view. By default, the spinner will be called spinner1, but I’d like to give it a more informative name, so I go over to the Properties pane and change the id field to @+id/planetSpinner. When I do this, I immediately get a prompt:

Screen Shot 2013-06-16 at 6.27.45 PM

 

What is happening is that Eclipse is going to globally change that id, including in a bunch of autogenerated code. As a result, it wants to make sure that we want to do this. If you say yes, you can see that new id has shown up in the XML version of the layout:

Now we’re ready to go into our MainActivity class and do something with this control, such as populate it with a list of planets. If we look at MainActivity.java, we can see the onCreate method:

The setContentView call is what relates the Java class to the layout file. Once we’ve set the content view, we can get a handle on objects inside the layout and play with them. The first thing we need is an array of string that we can feed into the Spinner. In Android, this is usually done through a string resource file (similar to a string properties file in iOS). You’ll find a strings.xml file hiding in the res/values folder. Once we add our new string array, it will look like this:

We now have four planets that our user can choose from. Before we go any further, make sure that you have saved both the string resource and layout files! When you do, a magic class file called R will be updated, creating ids automatically for these new entities we’ve added:

The last step is to give those planet names to our new spinner, in our onCreate method:

Walking through the code, we first get a handle on the spinner by using the automatically generated id in the R class file. We create an array adapter, which is a special resource that is going to return spinner items from our planet names. Finally, we tell the spinner to use that adapter, and when we rerun the code in the emulator, we get our new drop-down.

Screen Shot 2013-06-16 at 8.47.40 PMPersonally, I think that this is a bit complicated for a simple drop-down, requiring me to create an adapter to provide a simple list of strings, and is representative of how Java-based platforms tend to over-architect things that should be easy. I’m sure the adapter idea is there so that you can put more complicated things such as images into your drop-down, but in iOS, you normally have a single way of doing something that covers the 95% use case, and a more involved way to do the complex stuff.  Why I can’t just hand a spinner an ArrayList of strings is beyond me. Let it handle the adapters and such for me, at least for the simple cases.

In any event, editorializing aside, next week we’ll find out how to listen for changes on that spinner and use it to drive actions in our activity.

Related

Sign up for the O'Reilly Programming Newsletter to get weekly insight from industry insiders.
topic: Programming