Hatena::Groupandroid

lnzntの Android 日記 このページをアンテナに追加 RSSフィード

2012年04月07日(土)

別の Activity を起動する

18:07 | 別の Activity を起動する - lnzntの Android 日記 を含むブックマーク はてなブックマーク - 別の Activity を起動する - lnzntの Android 日記 別の Activity を起動する - lnzntの Android 日記 のブックマークコメント

ボタンを押すと別のアクティビティを開始するように Hello アプリケーションを改造してみたいと思います。

SubActivity を作る

まず、もう一つのアクティビティを作ります。

Eclispe のパッケージエクスプローラで、「HelloActivity.java」をコピー(Ctrl-C)して、そのまま貼りつけ(Ctrl-P)ます。新しい名前を問うダイアログが出るので「SubActivity」を入力します。

以下のような SubActivity.java ができるので、View を「R.layout.main」から「R.layout.sub」に変更して保存(Ctrl-S)します。

package com.example;

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

public class SubActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);  // R.layout.main から R.layout.sub に変更
    }
}

次に res/layout/main.xml をコピー&ペーストして「sub.xml」を作ります。

sub.xml を「XML Editor (Design タブ)」で開いて、TextView の android:text 属性を「@string/hello」から「@string/goodbye」に変更して保存(Ctrl-S)します。

20120407182456

次に res/values/strings.xml を「Android Common XML Editor (Resources タブ)」で開いて「Add」をクリックします。リソースの種類を問うダイアログが出るので「String」を選択します。

Name に「goodbye」、value に「さようなら」を入力して保存(Ctrl-S)します。

20120407182457

これでアクティビティ(とビュー)ができました。

ボタンを追加する

まず、View にボタンを追加します。

res/layout/main.xml を「Android Common XML Editor (Graphic Layout タブ)」で開きます。

左側の Palette の Form Widgets にある「Button」を右側のビューにドラッグ&ドロップします。

20120407183956

res/layout/main.xml を「XML Editor (Design タブ)」で開いて、Button/@android:text の値を「Button」から「@string/button1_label」に変更します。

(先程と同じ要領で res/values/strings.xml に、Name「button1_label」、Value「それでは」で String リソースを追加してください)

main.xml の Button/@android:id の値は「@+id/ ...」記法で書かれた、このボタンウィジェットの ID です。

20120407184052

ボタンが押された時の処理を HelloActivity.java に以下のように追加します。

package com.example;

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

public class HelloActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) {
        		startActivity(new Intent(HelloActivity.this, SubActivity.class));
        	}
        });
    }
}

ID でボタンウィジェットを探してきてイベントハンドラをセットしています。

ハンドラでは、クリックされた時に startActivity() で SubActivity を開始するようになっています。

マニフェストへの追加

SubActivity をマニフェストに追加します。

追加しないと、SubActivity を呼び出した時に実行時エラーになります。

  1. AndroidManifest.xml を「Android Manifest Editor」で開きます。
  2. 「Application」タブの下の方の Application Nodes にある「Add」ボタンを押します。
  3. 追加する種類を問うダイアログがでるので「Activity」を選択します。
  4. 属性の Name に「.SubActivity」を入力します
  5. 属性の Label に「@string/app_name」を入力します。(他は空欄でいいです)
  6. 変更を保存(Ctrl-S)します

20120407212819

実行

では、実行します。

20120407214113

「それでは」ボタンが表示されてます。クリックします。

20120407214114

切り替わりました。

----

やったことをまとめます。

Hello
  |-- src
  |     |-- com.example
  |           |-- HelloActivity.java : onCreate() にボタンにリスナを設定する処理を追加
  |           |-- SubActivity.java   : (新規作成)
  |
  |-- res
  |     |-- layout
  |     |     |-- main.xml : ボタンを追加
  |     |     |-- sub.xml  : (新規作成)
  |     |
  |     |-- values
  |           |-- strings.xml : goodbye、button1_label を追加
  |
  |-- AndroidManifest.xml : SubActivity を登録

----

ビューが隠れるとアクティビティの状態は「Running」から「Paused」に遷移するはずです。その時 onPause() が呼ばれるはずです。

以下のメソッドを HelloActivity クラスに追加して、ブレークポイントを貼って、Debug Run すると確かに、ボタンを押してビューが切り替わるタイミングでブレークされました。

    @Override
    public void onPause() {
    	super.onPause();  // ブレークポイント
    }

apk パッケージ

00:39 | apk パッケージ - lnzntの Android 日記 を含むブックマーク はてなブックマーク - apk パッケージ - lnzntの Android 日記 apk パッケージ - lnzntの Android 日記 のブックマークコメント

作った Hello プロジェクトから apk パッケージを作って、エミュレータにインストールしたいと思います。

署名付きのパッケージでないとエミュレータにインストールできません。

(設定すればできるようですが)

署名付きパッケージでエクスポート

eclipse で以下を行なう。

  1. パッケージエクスプローラで「Hello」を右クリックして「Android Tools」>「Export Signed Application Package...」を選択
  2. Project に "Hello" と入力して「Next」をクリック

以降は、キーストアが既存か否かで手順が別れます。

キーストアがない場合(初めての場合)

  1. 「Create new keystore」をチェック
  2. 「Location」にキーストアファイルの作成場所を入力
  3. 「Password」と「Confirm」にキーストアのパスワードを入力
  4. 「Next」をクリック
  5. 「Alias」に別名(任意の文字列、多分鍵の識別名)を入力
  6. 「Password」と「Confirm」に(多分鍵の)パスワードを入力
  7. 「Validity(year)」に有効期間(年)を入力
  8. 「First and Last Name」に署名者の名前を入力
  9. 他の項目は任意に入力
  10. 「Next」をクリック
  11. Destination APK file」に apk パッケージファイルの作成場所を入力
  12. 「Finish」をクリック

キーストアがある場合

  1. 「Use existing keystore」 をチェック
  2. 「Password」にキーストアのパスワードを入力
  3. 「Next」をクリック
  4. 「Use existing key」 をチェック
  5. 「Alias」に別名(多分鍵の識別名)を入力
  6. 「Password」に(多分鍵の)パスワードを入力
  7. 「Next」をクリック
  8. Destination APK file」に apk パッケージファイルの作成場所を入力
  9. 「Finish」をクリック

アプリケーションのアンインストール

adb を使います。これは Android SDK のツールです。

$ adb uninstall <パッケージ名>

。。。でできるはずですが失敗しました。(原因は調査中。原因はパッケージ名を理解してなくて、ちゃんと指定できてなかったからです。パッケージ名のつけ方を間違えてました - lnzntの Android 日記 - Android 開発コミュニティ)

仕方ないので、エミュレータの「アプリ管理」から既存の「Hello」をアンインストールしました。

アプリケーションのインストール

アプリケーションが既存の場合、上の手順で事前にアンインストールします。

以下を実行するとアプリケーションがインストールされます。

$ adb install <apk ファイルのパス>

実行。

$ adb install Hello.apk
1040 KB/s (38555 bytes in 0.036s)
	pkg: /data/local/tmp/Hello.apk
Success

インストールされました。

----

署名付きパッケージの Hello がエミュレータにインストールされた状態で、Eclipse から Hello アプリを実行しても上書きできずにエラーになります。

ベターな回避法がよく分からないので、上の作業の後、署名付き apk はエミュレータからアンインストールしておきました。