Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Mobile / Android

Number System Converter Android App

4.86/5 (10 votes)
18 Oct 2012CPOL4 min read 78.4K   2.9K  
This article demonstrates creating an Android application to perform number system conversion.

Sample Image

Sample Image

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:

Java
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.

XML
<?xml version="1.0" encoding="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:

XML
<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:

Java
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:

Java
button1.setOnClickListener(this);

The following code sets the listener for an EditText to respond to the text changed event:

Java
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 dialog
  • setMessage(): To set message for the dialog
  • setCancelable(): To allow/disallow cancelling the dialog
  • show(): To display the dialog

The following code can be used to create a dialog box and display it.

Java
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:

XML
<?xml version="1.0" encoding="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:

Java
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;
    
    /** Called when the activity is first created. */
    @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);        // for base 2 (binary)
        calculate(8,txtOctal);        // for base 8 (octal)
        calculate(16,txtHexadecimal);    // for base 16 (hexadecimal)
    }
    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; // find remainder
                if(remainder<10)
                // for remainder smaller than 10
                {
                    stack.push(remainder);
                    // push remainder in stack
                }
                else
                {
                    switch (remainder)
                    // for remainder larger than 9 (for hexadecimal values)
                    {
                    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)
// to display Information in a dialog box
{
   // create a dialog box
   Builder builder=new Builder(this);
   // to allow cancelling the dialog box
   builder.setCancelable(true);
   // set title
   builder.setTitle("About NumberSystemConverter");
   // set message
   builder.setMessage("Made by Azim");
   // display dialog box
   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:

Image 3

Clicking the About button displays the following screen:

Image 4

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:

Image 5

I hope my article will be helpful to developers new to the android platform.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)