Thursday, February 14, 2008

A simple Google Android application Part II

In Android framework, Activity class just like MIDlet in Java ME, it provides a frame to display the UI or perform a task. To layout the widgets on Activity, we can use xml file to achieve that. This example has 2 Activity classes, MainActivity.java and Queen.java, each has xml file to define the widgets and layout. In Queen.java, it uses recursive method to solve the N x N Queen problem. Due to the algorithm is not relevant to Android platform, so I emit the most source code with the algorithm and only put the method putQtoArray() to show recursive way.as follows:

main.xml


<Button android:id="@+id/MainButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="OK"
android:layout_x="10px" android:layout_y="102px">
</Button>


<Button android:id="@+id/MainButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Cancel"
android:layout_x="80px" android:layout_y="102px">
</Button>




queen.xml:




<Button android:id="@+id/QueenButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="OK"
android:layout_gravity="right">
</Button>


MainActivity.java

package csu.android.applications;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.text.method.*;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity {

private EditText myEText;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

myEText = (EditText) findViewById(R.id.MainEditText1);

myEText.setInputMethod(DigitsInputMethod.getInstance());

Button okButton = (Button) findViewById(R.id.MainButton1);

Button cancelButton = (Button) findViewById(R.id.MainButton2);

okButton.setOnClickListener(mOKListener);

cancelButton.setOnClickListener(mCancelListener);

}

private OnClickListener mOKListener = new OnClickListener() {

public void onClick(View v) {

String tmp = myEText.getText().toString();

if (!myEText.getText().toString().equals("")) {

int Qnum = Integer.parseInt(tmp);

if (Qnum <= 9) {

// Here we start up the main entry point

Intent intent = new Intent(MainActivity.this, Queen.class);

intent.putExtra("NumKey", tmp);

startActivity(intent);

finish();

} else {

showAlert("The number is bigger than 9!", 0, "Try again!",

"OK", true);

myEText.setText("");

return;

}

}

}

};

private OnClickListener mCancelListener = new OnClickListener() {

public void onClick(View v) {

myEText.setText("");

}

};

}



Queen.java

package csu.android.applications;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import java.util.*;

public class Queen extends Activity {

EditText myEText;

int QueenNum;

int totalcount = 0; // the total number of distinct results.

int uniquecount = 0; // the total number of unique results.

boolean[][] arr;

// Record the scores for mapping

ArrayList al;

// For check the duplicate solutions

int[][] arrRotation0;

int[][] arrRotation90;

int[][] arrRotation180;

int[][] arrRotation270;

int[][] arrMirror;

private StringBuilder sb;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.queen);

myEText = (EditText) findViewById(R.id.QueenEditText1);

Button backButton = (Button) findViewById(R.id.QueenButton1);

backButton.setOnClickListener(this.mBackListener);

Bundle extras = getIntent().getExtras();

if (extras != null) {

QueenNum = Integer.parseInt(extras.getString("NumKey"));

startCalculation();

myEText.setText(sb.toString());

} else {

showAlert("There is no input!", 0, "Click me", "OK", true);

Intent intent = new Intent(Queen.this, MainActivity.class);

startActivity(intent);

finish();

}

}

private OnClickListener mBackListener = new OnClickListener() {

public void onClick(View v) {

Intent intent = new Intent(Queen.this, MainActivity.class);

startActivity(intent);

finish();

}

};

/*

* startCalculation This method implements recursion for N*N Queen problem.

*/

public void startCalculation() {

sb = new StringBuilder();

// Array for N*N Queens problem

arr = new boolean[QueenNum][QueenNum];

// Array for calculating the duplicate result.

arrRotation0 = new int[QueenNum][QueenNum];

arrRotation90 = new int[QueenNum][QueenNum];

arrRotation180 = new int[QueenNum][QueenNum];

arrRotation270 = new int[QueenNum][QueenNum];

arrMirror = new int[QueenNum][QueenNum];

al = new ArrayList();

// Prepare random numbers inserted into arrays

// for the calculation of the duplication .

prepareRotationData();

// Do recursions

putQtoArray(QueenNum - 1);

}

/*

* putQtoArray This method implements recursion for N*N Queen problem.

* @param: QueenNum

*/

public void putQtoArray(int myNum) {

if (myNum == -1) {

// Find a distinct result.

totalcount++;

// Display the result.

showMe();

return;

}

for (int i = 0; i <>

if (!checkRule(i, myNum)) {

arr[i][myNum] = true;

// Recursion

putQtoArray(myNum - 1);

arr[i][myNum] = false;

}

}

}

... ... rest of part is omitted ... ...

}

Because Activity "Queen" will be started by Activity "MainActivity" using Intent, we also need to add a line into AndroidManifest.xml as below, then that is all set. <activity android:name="Queen" android:label="@string/app_name">

No comments: