15 September 2010

More plurals: decimal values

In my previous post, I showed you how to set string plurals. If you noticed, the methods to get the plurals strings only accept ints. What if (like me) you want to display a decimal value? I am getting my raw value from a progress bar with a range of 1-10, with 0.1 increments.

First, to display decimal values, I set my plurals string to display a float value.
<item quantity="other">Progress is at %.1f units.</item>

And then I devised a way to set the quantity based on the value of the progress bar (ProgressBar.getProgress() returns an int).

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

// get quantity for plurals string
int quantity = setQuantity(progress);

// convert the actual progress to float
float floatProgress = convertProgress(progress);

// get the actual string and replace formatting with the float value
String currentProgress = getResources()
.getQuantityString(R.plurals.seekBarProgress, // get the plurals
quantity, // set the quantity
floatProgress); // format arguments

// set text to display
TextView displayProgress = (TextView)findViewById(R.id.prog_text);
displayProgress.setText(currentProgress);

}

/**
* Use this method to see if we will use the singular or plural string.
*
* @param progress
* @return the value to set in getQuantityString()
*/
private int setQuantity(int progress){
int quantity;

if (((progress%10) == 0) && ((progress/10) == 1)){
quantity = 1;
} else {
quantity = 2;
}

return quantity;
}

/**
* Use this value to get the *actual* value to display.
*
* @param progress actual progress value from 0 to 100
* @return the float value from 0.0 to 10.0
*/
private Float convertProgress(int progress){
return ((Float.valueOf(String.valueOf(progress)))/(float)10);
}
So you see, it's quite long-winded. Here are some screen shots of the results:
Different values for the unit value

String Pluralization

Last week, I discovered Android's support for plural strings by accident. And a good accident it was since I am working on an app that will display a float to the user. I used to display:
You set XX mile(s).
which is kinda lame.

Plurals lets you specify the string to display for different quantities. So how do we use this Plurals thing?

In your string resources XML, which is usually strings.xml, define the plurals element like so:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pluralsTest">
<item quantity="one">You have one friend.</item>
<item quantity="other">You have %d friends.</item>
</plurals>
</resources>
Remember, your parent node must be <resources>!

Android provides several methods to use these in your code. Let's see what each of them results to when used:

// set one as the quantity
String one = getResources().getQuantityString(R.plurals.pluralsTest, 1);

// set two as the quantity
String more = getResources().getQuantityString(R.plurals.pluralsTest, 2, 2);

// set one as the quantity
CharSequence quantity = getResources().getQuantityText(R.plurals.pluralsTest, 1);

// set two as the quantity
CharSequence quantityMore = getResources().getQuantityText(R.plurals.pluralsTest, 2);

I created a basic layout with TextViews to display what each of these strings look like. Take note though that getQuantityText() returns a CharSequence and not a String! Also, from what I have noticed, and as the name mildly suggests, getQuantityText() gets the actual value of the text you defined in your xml.

10 September 2010

Importing existing Android projects to Eclipse

When trying to import an existing Android project to Eclipse, I always encounter the error: The method XXXXX must override a superclass method.

At first I was confused. I think this is a Java 1.5 thing, but I am running Java 1.6, and a quick check with my workspace settings show that this is indeed the case. So why the errors?

I searched the intarwebz, and I found out that I am not the only one encountering this! Now I do not want to comment out all the @Override annotations, since it is tedious and would dirty up my code.

Turns out that this is a weird Eclipse behaviour that you can correct with a few simple clicks.


Go to Window > Preferences > Java > Compiler. It should show the compiler compliance level to be 1.6, but the errors are still there. What the frak, Eclipse? Just to be sure, select 1.6 in the dropdown options. This worked for me, but if it doesn't work for you, try the next step.

Click the Configure Project Settings link. It should show a list of the projects in your workspace. Choose your Android project, click OK. Tick the Enable project specific settings box, then choose 1.6 as the compiler compliance level. That should work. :)

It's so fluffyyyyyyyyy!!!

I've created a Minion to join Gru's Minion army.

07 September 2010

Quick string resource formatting

Sooner or later, you would want to display a message to your user with dynamic content. This may be the number of results, the user's name, etc.

Luckily for us, Android provides a convenience method that we can use for such purposes.
public final String getString (int resId, Object... formatArgs)
This means that we can define a string in our strings.xml file with format specifiers supported by Java's formatter class. For example, if I have such a string:
<string name="formatted_string">Hello, %s! You have %d messages.</string>
I can get this string, apply the formatting, and then set it into a TextView without additional processing on my part.
TextView string = (TextView) findViewById(R.id.form_string);
string.setText(getString(R.string.formatted_string, "Zarah", 4));
And I will have this:
Nifty and easy!

Of course, this is a simple example. But I hope you get the drift. Do read the Formatter's documentation to see all possible formats you can use.

06 September 2010

A test, a test

I was thinking of starting a quick-tips style blog for software development (mostly for myself, since I tend to forget stuff a lot recently).

And since I am working on Android now, this would most probably focus on tips and notes on application development for that platform.

And now, I test SyntaxHighlighter.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text = new TextView();
text.setText("Hello, Droid warriors!");
setContentView(text);
}