androidでアプリを作ってみる
今回のアプリはandroid marketで公開した「prime?」という名のアプリの全てのソースコードである。
■AndroidManifest.xml
今回はActivityを2つ使用するので、以下のようにactivity要素を加えないとアプリから使用できない。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="info.justoneplanet.android.primenumber"
android:versionCode="2"
android:versionName="0.2">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".PrimeNumberActivity"
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=".PrimeNumberListActivity"
android:label="@string/app_name_list">
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
■アクティビティ1
/src/info/justoneplanet/android/primenumber/PrimeNumberActivity.java
まず、初めに表示されるActivityを実装する。
package info.justoneplanet.android.primenumber;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class PrimeNumberActivity extends Activity {
private static final int MENU1_ID = Menu.FIRST;
private static final int MENU2_ID = Menu.FIRST + 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);// こいつでレイアウトのxmlを指定!
Button validate = (Button) findViewById(R.id.button_validate);
validate.setOnClickListener(// これがイベントだ!なんかコード量多し。
new View.OnClickListener() {
public void onClick(View v) {
TextView textView = (TextView) findViewById(R.id.result);
EditText editText = (EditText) findViewById(R.id.number);
Integer number = Integer.valueOf(editText.getText().toString());
int num = _isPrime(number, textView);
if(num == 0){
textView.setText("Prime!!");
}
else if(num < 0){
textView.setText("Not Prime!!");
}
else{
String str = Integer.toString(num);
textView.setText("Not Prime!! It will be divided by '" + str + "'");
}
}
}
);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// メニューを押したとき
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, MENU1_ID, Menu.NONE, R.string.menu2);
return result;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// メニューが選択されたとき
switch(item.getItemId()){
case MENU1_ID:
//Log.e("tag", "start");
startActivity(new Intent(this, PrimeNumberListActivity.class));
finish();
return true;
}
return false;
}
/**
*_isPrime
* @param number
* @return
*/
private int _isPrime(Integer number, TextView textView)
{
if(number < 2){
return -1;
}
for(int i = 2; i < number / 2 + 1; i++){
textView.setText(Integer.toString(i));
if(number % i == 0){
return i;
}
}
return 0;
}
}
/res/layout/main.xml
上述のActivityのレイアウトを定義する。ボタンが上にあると押しにくいので下に配置した。
<?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:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/msg_title_input"
android:textSize="16dip"
/>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="bottom"
>
<EditText
android:id="@+id/number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dip"
android:inputType="number"
android:textSize="26dip"
android:maxLength="7"
/>
<Button
android:id="@+id/button_validate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button_validate"
/>
</LinearLayout>
</LinearLayout>
■/src/info/justoneplanet/android/primenumber/PrimeNumberListActivity.java
まず、次のActivityを実装する。せっかくだからListActivityを継承する。
package info.justoneplanet.android.primenumber;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Layout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class PrimeNumberListActivity extends ListActivity {
private static final int MENU1_ID = Menu.FIRST;
private static final int MENU2_ID = Menu.FIRST + 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
// 配列を生成
ArrayList<String> numbers = new ArrayList<String>();
for(int i = 0; i < 100; i++){
numbers.add(Integer.toString(i));
}
// 生成した配列をリストの各要素にassign
setListAdapter(new ArrayAdapter<String>(
getApplicationContext(),
R.layout.list_row,
numbers
));
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, MENU1_ID, Menu.NONE, R.string.menu1);
return result;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId()){
case MENU1_ID:
startActivity(new Intent(this, PrimeNumberActivity.class));
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
// リストがクリックされたとき
super.onListItemClick(l, v, position, id);
TextView textView = (TextView) findViewById(R.id.result);
Integer strItem = Integer.valueOf((String) getListAdapter().getItem(position));
int num = _isPrime(strItem, textView);
if(num == 0){
textView.setText("Prime!!");
}
else if(num < 0){
textView.setText("Not Prime!!");
}
else{
String str = Integer.toString(num);
textView.setText("Not Prime!! It will be divided by '" + str + "'");
}
}
/**
*_isPrime
* @param number
* @return
*/
private int _isPrime(Integer number, TextView textView)
{
if(number < 2){
return -1;
}
for(int i = 2; i < number / 2 + 1; i++){
textView.setText(Integer.toString(i));
if(number % i == 0){
return i;
}
}
return 0;
}
}
まぁ、ツッコミどころは沢山あるがとりあえず。
/res/layout/list.xml
上述のActivityのレイアウトを定義する。
<?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:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/msg_title_select"
android:textSize="16dip"
/>
<ListView
android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/android:empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/msg_title_select"
android:textSize="20dip"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buttons"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
</LinearLayout>
</LinearLayout>
/res/layout/list_row.xml
ListActivityを使用した場合はリストの行のレイアウトを定義する必要がある。文字が小さいとリストが選択しにくいので大きめサイズだ~
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24dip"
android:text="@string/msg_title_select"
/>
■/res/values/strings.xml
多言語対応できるように文字は以下のファイルに記述するべきだ。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">prime number</string>
<string name="app_name_list">prime number list</string>
<string name="msg_title_input">Input a number!</string>
<string name="msg_title_select">Select a number!</string>
<string name="button_validate">Validate</string>
<string name="result_prime">Prime!</string>
<string name="result_notprime">Not Prime!</string>
<string name="menu1">Input</string>
<string name="menu2">List</string>
</resources>
今回はコードにも書いちゃってるけど気にしない♪
■/res/layout/main.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:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/msg_title_input"
android:textSize="16dip"
/>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="bottom"
>
<EditText
android:id="@+id/number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dip"
android:inputType="number"
android:textSize="26dip"
android:maxLength="7"
/>
<Button
android:id="@+id/button_validate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button_validate"
/>
</LinearLayout>
</LinearLayout>
Activityは画面だ★
TrackBack URL :
Comments (0)






