Introduction
Android is an exciting platform for developing apps that run on a mobile device. Any programmer familiar with Java can learn Android quickly
and start developing Android apps. The class library of Android is a subset of Java SE. The two main elements of Android are the Android SDK
and an Eclipse plug-in called 'The Android Development Tools (ADT)'. You must ensure the appropriate installation of the SDK and ADT before starting development.
In this article, I am describing how to create an Android app to perform conversion of a decimal number to binary, octal and hexadecimal formats.
Background
There are four building blocks of any android application:
- Activities: The basic building block of a user interface in Android is an activity. An activity represents the main screen with which a user can interact with an application.
- Content Providers: Content providers provide abstraction for data required by multiple applications.
- Intents: Intents are system messages, for e.g., event notifications, for e.g., hardware changes (like SD card insertion), incoming data (like SMS), etc.
- Services: Services are independent activities not having an interface for e.g., music playback.
Activities are public classes derived from the android.app.Activity
base class. The following code represents an activity in the application:
public class MyActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
}
The onCreate()
method gets invoked when the activity is started. The first statement in this method must be to invoke the base classes'
onCreate()
method to initialize the Android activity.
User interfaces in Android can be created either through Java code or XML files. Using XML files for creating user interfaces is highly preferred
because it provides separation of the user interface code from the business logic code.
Following is an example of a LinearLayout
definition.
="1.0"="utf-8"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</LinearLayout>
Every android project has an auto-generated R.java file. This file is used to refer to resources in your project. For e.g., if the
main.xml layout file defines the following resource:
<Button android:text="My Button" android:id="@+id/button1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
then it can be used in the activity class by writing the following code:
Button btn=(Button)findViewById(R.id.button1);
Events in android are handled in the same way as in Java SE. For e.g., an activity class can implement the
View.onClickListener
interface,
having the onClick()
method to handle the click event of a button. Similarly, the
TextWatcher
interface can be used to handle the text changed
event in an EditText
control. The TextWatcher
interface has three methods,
beforeTextChanged()
, afterTextChanged()
, and onTextChanged()
.
User Interface components in Android are represented by Views. The View class is the base class of all components. Some of the views
are TextView, EditText, Button, RadioButton and Checkbox. View can respond to events using listeners. Assigning listeners to Views is done in the same way as in Java 2 SE.
For e.g., the following code sets the listener for a Button to respond to the click event:
button1.setOnClickListener(this);
The following code sets the listener for an EditText
to respond to the text changed event:
txtDecimal.addTextChangedListener(this);
Dialog boxes are created in android using the Builder class. The Builder class has the following methods:
setTitle()
: To set title for the dialogsetMessage()
: To set message for the dialogsetCancelable()
: To allow/disallow cancelling the dialogshow()
: To display the dialog
The following code can be used to create a dialog box and display it.
Builder builder=new Builder(this);
builder.setCancelable(true);
builder.setTitle("Title");
builder.setMessage("Message");
builder.show();
Using the code
In my application, I have created an EditText control having id txtDecimal to accept a number in decimal format and three TextView controls having
IDs txtBinary, txtOctal and txtHexadecimal to display the numbers in binary, octal and hexadecimal formats.
Following is the complete code of the main.xml layout file:
="1.0"="utf-8"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:text="Enter Decimal Number: " android:id="@+id/textView1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<EditText android:text="" android:id="@+id/txtDecimal" android:layout_width="match_parent"
android:layout_height="wrap_content"></EditText>
<TextView android:text="Binary: " android:id="@+id/textView2"
android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:text="" android:id="@+id/txtBinary"
android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:text="Octal: " android:id="@+id/textView4"
android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:text="" android:id="@+id/txtOctal" android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<TextView android:text="Hexadecimal: " android:id="@+id/textView6"
android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:text="" android:id="@+id/txtHexadecimal"
android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<Button android:text="About" android:id="@+id/button1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
Following is the code of the main activity:
package com.azim;
import java.util.Stack;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View;
import android.text.Editable;
import android.text.TextWatcher;
public class MyActivity extends Activity implements TextWatcher,View.OnClickListener
{
EditText txtDecimal;
TextView txtBinary,txtOctal,txtHexadecimal;
Button btnAbout;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtDecimal=(EditText)findViewById(R.id.txtDecimal);
txtBinary=(TextView)findViewById(R.id.txtBinary);
txtOctal=(TextView)findViewById(R.id.txtOctal);
txtHexadecimal=(TextView)findViewById(R.id.txtHexadecimal);
txtDecimal.addTextChangedListener(this);
btnAbout=(Button)findViewById(R.id.button1);
btnAbout.setOnClickListener(this);
}
public void beforeTextChanged(CharSequence sequence,int start,int count,int after)
{
}
public void afterTextChanged(Editable editable)
{
}
public void onTextChanged(CharSequence sequence,int start,int before,int count)
{
calculate(2,txtBinary);
calculate(8,txtOctal);
calculate(16,txtHexadecimal);
}
public void calculate(int base,TextView txtView)
{
if(txtDecimal.getText().toString().trim().length()==0)
{
txtView.setText("");
return;
}
try
{
Stack<Object> stack=new Stack<Object>();
int number=Integer.parseInt(txtDecimal.getText().toString());
while (number>0)
{
int remainder=number%base;
if(remainder<10)
{
stack.push(remainder);
}
else
{
switch (remainder)
{
case 10:
stack.push("A");
break;
case 11:
stack.push("B");
break;
case 12:
stack.push("C");
break;
case 13:
stack.push("D");
break;
case 14:
stack.push("E");
break;
case 15:
stack.push("F");
break;
}
}
number/=base;
}
StringBuffer buffer=new StringBuffer();
while (!stack.isEmpty())
{
buffer.append(stack.pop().toString());
}
txtView.setText(buffer.toString());
}
catch (Exception e)
{
txtView.setText(e.getMessage());
}
}
public void onClick(View view)
{
Builder builder=new Builder(this);
builder.setCancelable(true);
builder.setTitle("About NumberSystemConverter");
builder.setMessage("Made by Azim");
builder.show();
}
The above code uses the onTextChanged()
method to get the decimal number entered by the user and call the user-defined method called
calculate()
to convert the decimal number to binary, octal and hexadecimal formats. The
onTextChanged()
method gets executed whenever the text is changed
in an EditText
control. The calculate()
method takes two parameters. The first parameter denotes the base of the target number system and the second parameter
denotes the target TextView
control on which to display the result.
After executing the program, the following screen appears:
Clicking the About button displays the following screen:
Points of Interest
Executing the program generates the NumberSystemConverter.apk file in the bin folder. This file can be copied to an android device in order to execute the app on the device.
The following image shows the app being executed on my HTC Explorer android mobile:
I hope my article will be helpful to developers new to the android platform.