今回のアプリは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は画面だ★