In this post I discuss a fairly complete Android App – Unity which is a simple unit converter. The android app has all the good stuff from Android including activities, intents, spinners, launch icons and a splash screen to boot as below. Download it from Google Play : Unity – Unit Converter . To know more about the app read on …
I have enhanced my earlier basic Unity app to start with a Splash Screen before moving onto an initial screen with buttons for various unit conversion like mass,length,volume etc
This is shown below
When any of these buttons are clicked it goes to the appropriate conversion screen. This is done by starting the appropriate activity. An activity is invoked by the intent which starts the activity.
Hence the MainActivity.java has an intent and activity for each of the buttons mass,length,volume in the addListenerOnButton as follows
publicvoid addListenerOnButton() {
//Mass activity
massButton = (Button) findViewById(R.id.button1);
massButton.setTextAppearance(context,R.style.ButtonFontStyle);
massButton.setOnClickListener(new OnClickListener() {
publicvoid onClick(View arg0) {
Intent intent = new Intent(context, massActivity.class);
startActivity(intent);
}
});
//Length activity
lengthButton = (Button) findViewById(R.id.button2);
lengthButton.setTextAppearance(context,R.style.ButtonFontStyle);
lengthButton.setOnClickListener(new OnClickListener() {
publicvoid onClick(View arg0) {
Intent intent = new Intent(context, lengthActivity.class);
startActivity(intent);
}
});
…
…
When the “Mass button” is clicked it activates a new intent based on the massActivity.java class.
The massActivity.java file performs the following main functions
- Changes the layout to the one defined in mass.xml under res/layout.mass.xml
- Instantiates a massAdapter as an ArrayAdapter
- Passes the massAdapter to both the spinners in the View
- A convert method is invoked when the Convert button is clicked. This method does the actual calculation
- Finally a ‘Home’ button is used to go back to the MainActivity class
publicclass massActivity extends Activity {
String[] massUnits = {“gram”,“kilogram”,“ounce”,“pound”,“ton”};
//double massConversion[][] = new double[5][5];
doublemassConversion[][] = newdouble [][]{
{1.0,0.001,3.527e-2,2.205e-3,1.102e-6},
{1000.0,1.0,35.27,2.205,1.102e-3},
{28.35,28.38e-2,1,6.25e-2,3.125e-5},
{453.6,0.4536,16.0,1.0,.0005},
{9.072e-5,907.2,3.2e4,2000.0,1}
};
protectedvoid onCreate(Bundle savedInstanceState) {
ArrayAdapter<String> massAdapter = new ArrayAdapter<String> (this,
android.R.layout.simple_spinner_item,massUnits);
sp1 = (Spinner) findViewById(R.id.spinner1);
sp1.setAdapter(massAdapter);
sp1.setOnItemSelectedListener(new OnItemSelectedListener() {
publicvoid onItemSelected(AdapterView<?> argo0, View arg1,
int arg2, long arg3) {
intitem = sp1.getSelectedItemPosition();
}
publicvoid onNothingSelected(AdapterView<?> arg0) {
}
});
sp2 = (Spinner) findViewById(R.id.spinner2);
sp2.setAdapter(massAdapter);
sp2.setOnItemSelectedListener(new OnItemSelectedListener() {
publicvoid onItemSelected(AdapterView<?> argo0, View arg1,
int arg2, long arg3) {
intitem = sp2.getSelectedItemPosition();
/
}
});
}
publicvoid convert(View view) {
…
double inputValue = Double.parseDouble(text1.getText().toString());
int item1 = sp1.getSelectedItemPosition();
int item2 = sp2.getSelectedItemPosition();
double value = massConversion[item1][item2];
double convertedValue = inputValue * value;
txtConvertedValue.setText(String.valueOf(convertedValue));;
}
The Home button takes back to the Main screen
publicvoid home(View view) {
final Context context = this;
Intent intent = new Intent(context,
MainActivity.class);
startActivity(intent);
}
The mass.xml screen has 1 Textfield for input, a TextView for output, 2 spinners for handling the fromUnit & toUnit and a Convert & a Home button. The mass.xml is shown below
<TableLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“fill_parent”
android:layout_height=“fill_parent” >
<TableRow
android:id=“@+id/tableRow1”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content” >
<TextView
android:id=“@+id/textView1”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_column=“0”
android:layout_span=“4”
android:text=“@string/massConversion”
android:textAppearance=“?android:attr/textAppearanceMedium” />
</TableRow>
<TableRow
<TextView
android:id=“@+id/textView2”
…/>
<EditText
android:id=“@+id/editText1”
android:inputType=“numberDecimal” />
</TableRow>
<TableRow
<TextView
android:id=“@+id/textView3”
android:text=“@string/convertedValue” >
<TextView
android:id=“@+id/txtConvertedValue”>
</TableRow>
<TableRow
android:id=“@+id/tableRow5”
<Spinner
android:id=“@+id/spinner1”>
</TableRow>
<TableRow
android:id=“@+id/tableRow6”
<Spinner
android:id=“@+id/spinner2”>
</TableRow>
<TableRow
android:id=“@+id/tableRow11>
<Button
android:onClick=“convert”
android:text=“@string/Convert” />
<Button
android:onClick=“home”
android:text=“@string/home” />
</TableRow>
</TableLayout>
Note: Ensure that you add this new activity massActivity to AndroidManifest.xml
As shown
…
<application
…
<activity
android:name=”com.example.test.massActivity”
android:label=”@string/app_name” >
</activity>
</application>
</manifest>
Similar code can be replicated for the other buttons and other conversion units.
Once this is done your application is ready. It is now time to create a suitable “icon” for your android app. I found GIMP utility extremely useful in creating icons. GIMP cam be downloaded from http://www.gimp.org. This requires some learning ramp-up. So I took the easy route and downloaded ready made icon from OpenClipArt.org which has a huge collection of icons.
The specified dimensions for the icons based on the resolution of the android device is given in http://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html
and should be
- Low density screens (ldpi): 36x36px, 120dpi
- Medium density screens (mdpi): 48x48px, 160dpi
- High density screens (hdpi): 72x72px, 240dpi
- Extra high density screens (xdpi): 96x96px, 320dpi
Copy all the icons to the directory below and rename the png files to ic_launcher.png
- Low density icon : res/drawable-ldpi
- Medium density icon : res/drawable-mdpi
- High density icon : res/drawable-hdpi
- Extra high density icon : res/drawable-xdpi
WhenyoubuildandruntheapponyouremulatoryoushouldseeyouriconinsteadofthestandardAndroidicon.
It is worth mentioning a problem that I faced initially and had me stumped. I would make some changes and get the error “R cannot be resolved to a variable”.
AftertryingtounsuccessfullycleanandrebuildtheprojectseveraltimesItriedtodiginmore.MysearchwithGoogleprovedfutilewithsomepostscomplainingthatEclipsewasclobberingfiles.TheissueusuallyhappenswhentheR.javafilecannotbegeneratedwhenyoubuildtheproject.Thisusuallyhappenswhenthereissomeissueinyour /resdirectory.Checkifthereareanyredmarksinyourlayout,strings.xmlorAndroidManifest.xmletcfile, fixthem, rebuild and theproblemshouldgoaway.
Finally I added an initial splash screen. For this I took the code from O’Reilly’s cook book “Splash screens in Android”. A splash *.jpg or *.png has to be added to the res/drawable folders
Remember to change the AndroidManifest.xml to have the app open up with the splash screen and then switch the MainActivity.java.
A snippet is shown below
<activity
android:name=“com.tvganesh.unity.SplashScreen”
android:noHistory=“true”
android:label=“@string/app_name” >
<intent-filter>
<action android:name=“android.intent.action.MAIN” />
<category android:name=“android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
<activity
android:name=“com.tvganesh.unity.MainActivity”
android:label=“@string/app_name” >
</activity>
<activity
android:name=“com.tvganesh.unity.massActivity”
android:label=“@string/app_name” >
</activity>
….
With this app is also set to rock ‘n roll. I also managed to submit the app to Google Play. To publish in Google Play you need to do the following
- Create a signed app package. For this right click the package, select Android Tools->Export Signed Application Package and follow the prompts. Upload the *.apk file in Google Play
- You will also need 2 screenshots of the app & a 512×512 icon.
And you should be through.
The Unity project can be cloned from Git Hub at Unity project or
The entire Unity – Unit converter app can be downloaded at Unity-Unit Converter
One thought on “Unity(full) android App: With bells and whistles”