ジャンル不定の日記です。

複数アクティビティを持つアプリ

Androidのアプリでは画面を再描画する時に、現在のアクティビティを初期化して再描画するのではなく、画面ごとにアクティビティを用意するのが基本ぽい。
だから戻るボタンで前の画面に戻れるんだね。

というわけで、Androidアプリを作るには、複数アクティビティの使い方を知る必要があるようなので、
ボタンをクリックすると別のアクティビティに移動するアプリを作ってみた。

MainActivity.java
package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bt=new Button(this);
        bt.setText("Click");
        bt.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });
        setContentView(bt);
    }
}

前回の"Hello World"を表示するだけのコードからの変更点だけ赤文字にしてる。
最初に表示されるMainActivityでは、今度はTextViewの代わりにButtonウィジェットを使う。
android.widget.Buttonはandroid.widget.TextViewを継承しているので、文字列の設定とウィジェットの設置は同じなので赤文字にしてない。
前回と違うのは、クリックイベントの設定関連だけ。

setOnClickListenerでイベントの登録のようだが、これはandroid.widget.TextViewが継承しているandroid.view.Viewのメソッドなんで、ボタンじゃなくてTextViewにクリックイベントを設定することも出来そう?
プロジェクト作成時のコードにも「@Override」があるが、これは、既存メソッドを上書きしていることを明示しているということらしい。(書いておくとデバックがしやすいとか・・・)

setOnClickListenerの引数はOnClickListenerで、OnClickListenerのonClickメソッドにクリック時の処理を書く。
なんか気持ち悪い書き方だね・・・
覚えにくい・・・

今回はクリックされたら2つ目のアクティビティを起動するので、startActivityを使うが、startActivityの引数にはIntentを渡す。
Intentの作成方法は複数あるようだが、別のクラスのアクティビティを起動するには、ContextとClassの2つを渡してIntentを作成する。
Contextはwidget作成時にも使って、前回の時に単にthisじゃ問題起きる場面に遭遇しそうな気がしたが、さっそく遭遇した。
単にthisだとダメな場合は、「クラス名.this」で良いみたい。
Classの渡し方は、「クラス名.class」ぽい。


SecondActivity.java
package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv=new TextView(this);
        tv.setText("Hello, World");
        setContentView(tv);
    }
}

こちらがクリックされたら起動する2番目のアクティビティのソースコード。
最初、1つのソースコードで出来るんじゃ?と思ったんだが、publicじゃないと起動できず、Javaではpublicなclassはソースファイルの名前と同一じゃないとダメぽい。
というわけで、アクティビティが複数ある場合は、アクティビティの数だけソースファイルを分ける必要があるね。
めんどい・・・
こちらのコードは、前回のMainActivityと名前が違うだけで同じ。


AndroidManifest.xml(の一部)

<activity android:name="MainActivity" 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="SecondActivity" android:label="@string/app_name"></activity>

更に、AndroidManifest.xmlを修正してアクティビティを登録する必要がある。
プロジェクト作成時点で<activity>が1個あるが、それをコピーして名前を変更。
起動時に開始するわけではないので、<intent-filter>は不要って感じかな。


これで、エミュレーターにインストールして、予定通りボタンクリックで"Hello World"が表示されるアプリができた。

ウィジェットの使い方と複数アクティビティの使い方はわかったから、後は、
データ保存に、android.database.sqlite
HTTP通信に、android.net.http
HTTP以外の通信するなら、android.net
文字列操作するなら、android.text.TextUtils
HTMLアプリにするなら、android.webkit
辺りを調べれば良さそうかな。
AndroidのAPI覚えるのもめんどいし、android.webkitでできるようなことは webkit使っちゃった方が良いんじゃないかと思う。
そうすればAndroid以外に移植するのも簡単と思うし。