@blog.justoneplanet.info

日々勉強

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は画面だ★

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment