"@string/click_me” になりました。
Android プロジェクト作成
各種リソース・エディタを使って、
プログラムレスでデコりましたので、
もう一度、HelloWorld プロジェクトを 実行してみましょう。
リソース・エディタの利用
Android プロジェクト作成
各種リソース・エディタを使って、
プログラムレスで画面表示内容を変更した結果を
Android エミュレータでアプリを再実行させて確認してみました。
《アプリ実行結果は、編集したとおりに表示されています!》
新規プロジェクト・アプリ再実行
Android エミュレータ (Hello World 再表示)
ボタンをクリックしても 何も起きません、
何しろプログラムして いませんから
...
Android プロジェクト作成
プログラムレスでデコれましたが、
もう一度、ソースを見て何が変更されたのかを 確認してみましょう。
リソース・エディタの利用
Android プロジェクト作成
1.HelloWorld.java の内容確認
HelloWorld プロジェクトでの、メイン画面のアクティビティ・クラスのプログラムです。
(特に変更されていません。)
新規プロジェクト内容再確認
HelloWorld.java
の内容Android プロジェクト作成
2.AndroidManifest.xml の内容確認
HelloWorld プロジェクトでの、マニフェスト・ファイルです。
(特に変更されていません。)
新規プロジェクト内容再確認
AndroidManifest.xml
の内容Android プロジェクト作成
3.main.xml の内容確認
HelloWorld プロジェクトでの、メイン画面のレイアウト・ファイルです。
(子要素が追加・変更されています。)
新規プロジェクト内容再確認
main.xml
の内容Android プロジェクト作成
4.strings.xml の内容確認
HelloWorld プロジェクトでの、文字列のリソース・ファイルです。
(子要素が追加・変更されています。)
新規プロジェクト内容再確認
strings.xml
の内容Android プロジェクト作成
新規プロジェクトの作成から、
各種リソース・エディタの使い方まで についての説明は、以上です。
新規プロジェクト作成に関して
サンプル アプリ解説
サンプル アプリ作成について
Hellow World アプリを作成しましたが、
プログラム的には、何もしていません。
そこで、最低限のリアクションを返す、
サンプルアプリ「 HackGreeting 」を作成してみました。
単に挨拶して、滞在時間を表示するだけのアプリですが、
内部でしていることについて、少し解説してみます
参考URL
android developer / 開発ガイド (注意:一部英語) [Android の基本~アプリの公開まで]
http://developer.android.com/intl/ja/guide/index.html
ソフトウェア技術ドキュメントを勝手に翻訳 / Android 開発ガイド (上記を翻訳されているサイト)
http://sites.google.com/a/techdoctranslator.com/jp/android/
android developers / Resources (注意:英語) [チュートリアルやサンプルコードがあります]
http://developer.android.com/intl/ja/resources/index.html
Android の基本や、
アプリ開発の基礎は、
サンプル アプリ解説
サンプル アプリ作成について
サンプルアプリ「 HackGreeting 」の実行例
名前をテキスト・フィールドに入力してから、
「ご挨拶」で、挨拶ダイアログで挨拶します。
「バイバイ」で、アプリを終了して滞在時間を表示します。
ご挨拶
バイバイ
ご挨拶
アプリ
終了滞在時間を表示
ライフサイクルと滞在時間
ライフサイクルは、マルチタスクの賜物
Android は、マルチタスク(いつ自分がバックグラウンドになるか不明)ですので、
Android
のアクティビティは、ライフサイクル・メソッド(
以下参照)
を持っています。Android ライフサイクル・メソッドの利用
ライフサイクルの流れ
onCreate onStart onResume onPause onStop onDestroy 生成> 始動> 回復> (アプリ実行中)> 休止> 終了> 破棄
HackGreeting では、このライフサイクルを利用して、
退出時の滞在時間の表示を行っています。
ライフサイクルと滞在時間
HackGreeting でのライフサイクル・メソッドと、滞在時間の算出方法 Android ライフサイクル・メソッドの利用
アプリ始動時に呼び出される
onResume():void で滞在開始時間を記録 アプリ終了時に呼び出される
onPause():void で滞在時間を算出しています。
単に現在時間から滞在開始時間を引いているだけです。
メソッド中では、特に難しいこともしていません。
プログラム中の System.currentTimeMillis() で、
現在時間を1970年からの経過ミリ秒で取得しています。
ライフサイクルと滞在時間
アクティビティと画面の縦横切り替えの怖い関係
(補足)アクティビティと画面の縦横切り替え
Android の画面は、
端末を回転(横持ち・縦持ち)させることで、
縦長表示(Portlate)と、横長表示(Landscape)を切替えます。
ですが、画面切替時には、
ライフサイクルのリセットが発生することに注意してください。
縦横表示を切り替えるたびに、
既存アクティビティの終了 > 新規アクティビティの初期化 > 画面描画 の
ライフサイクルの流れが発生するのです。
ライフサイクルと滞在時間
アクティビティと画面の縦横切り替えの怖い関係
(補足)アクティビティと画面の縦横切り替え
サンプルアプリでも、エミュレータでのアプリ実行時に、
CTRL+[F11] で画面の縦横表示を切り替えると、
「途中退出&再入場」 扱いにされてしまいます。
ライフサイクル・イベントが
画面の縦横切替か否かを切り分けるには、
以下のメソッドを利用すると良いでしょう。
onRestoreInstanceState(Bundle savedInstanceState):void
onSaveInstanceState(Bundle savedInstanceState):void
多重化イベントハンドラ
Android のプログラムは、イベントドリブンのプログラム 多重化クリック・イベントハンドラ
イベント・ハンドラは、イベント元ごとに設定することも出来ますが、
複数のイベント発生元と共有することも出来ます。
(メモリの節約にもなります) HackGreeting では、
「ご挨拶」と「バイバイ」ボタンのクリック・イベントを共有しています onClick(View view):void メソッドで、
イベント発生元が、どこ(誰)なのかを引数 view のインスタンスから
リソースIDを取得して、処理を切り分けています。
ライフサイクルと滞在時間
Android のプログラムは、イベントドリブンのプログラム 多重化クリック・イベントハンドラ
HackGreeting では、
引数 view のインスタンスからリソースIDを取得しています。
プログラム中では、
View#getId():int でリソースIDを取得しています。
メソッド中では、特に難しいこともしていません。
サンプル アプリ解説
サンプル アプリ作成について
とても短いものでしたけれど サンプル アプリの解説は、
以上です。
参考資料
「 HackGreeting 」 アプリのソース&リソース
以降より、「 HackGreeting 」アプリの 全てのソースとリソースを公開します。
適当に作成したアプリのソースですから、
お勧めできる実装でないので、参考程度に見てくださいね。
Manifest & XML Resource
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sample.kyotogtug.girls.hackathon.hackgreeting"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/greet_icon"
android:label="@string/app_name">
<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>
</application>
<uses-sdk android:minSdkVersion="4" />
</manifest>
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="bg_color">#CCFFFF</color>
<color name="text_color">#000000</color>
<string name="app_name">HackGreeting</string>
<string name="request_message">お名前を入力してください</string>
<string name="greeting_label">ご挨拶</string>
<string name="bye_label">バイバイ</string>
<string name="greeting_message_format"
>%sさん、こんにちは。\n(%d回目の挨拶)</string>
<string name="bye_message_format">また来てね!</string>
<string name="stay_time_message_format">滞在時間は、%d秒でし た。</string>
</resources>
XML Resource
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"
android:background="@color/bg_color">
<TextView
android:id="@+id/requesst_message_TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:editable="false"
android:textColor="@color/text_color"
android:textScaleX="1.5"
android:layout_gravity="center"
android:text="@string/request_message">
</TextView>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<EditText
android:id="@+id/your_name_EditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:editable="true"
android:singleLine="true"
android:gravity="left"
android:layout_weight="100" >
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<Button
android:id="@+id/greet_Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight="50"
android:text="@string/greeting_label">
</Button>
<Button
android:id="@+id/bye_Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight="50"
android:text="@string/bye_label">
</Button>
</LinearLayout>
</LinearLayout>
Image Resource
res/drawable-hdpi/greet_icon.png
res/drawable-mdpi/greet_icon.png
res/drawable-ldpi/greet_icon.png 72×72
48× 48
36×36
src/com/example/sample/kyotogtug/girls/hackathon/hackgreeting/
MainActivity.java (1/2)
package com.example.sample.kyotogtug.girls.hackathon.hackgreeting;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity implements OnClickListener { /** 名前入力欄. */ private EditText your_name = null;
/** 挨拶ボタン . */ private Button greet_button = null;
/** バイ・ボタン. */ private Button bye_button = null;
/** 挨拶回数. */ private int greet_count = 0;
/** 来場時間. */ private long welcome_time;
private static final int DIALOG_ID_GREET = 1;
private static final int DIALOG_ID_BYE = 2;
/**
* アプリ初期化時処理.
* ライフサイクルにおける、アクティビティ生成時に呼ばれる処理です。
* @param savedInstanceState 保管済のデータバンドル */
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
your_name = (EditText)findViewById(R.id.your_name_EditText);
greet_button = (Button) findViewById(R.id.greet_Button);
bye_button = (Button) findViewById(R.id.bye_Button);
greet_button.setOnClickListener(this);
bye_button.setOnClickListener(this);
} /**
* アプリ始動時処理.
* ライフサイクルにおける、回復(始動)時に呼ばれる処理です。
*/
@Override
protected void onResume() { super.onResume();
//来場時間として、現在時間(画面表示時)を設定します。
/**
* アプリ停止時処理.
* ライフサイクルにおける、
* 一時停止(停止)時に呼ばれる処理です。
*/
@Override
protected void onPause() { super.onPause();
//来場時間から、現在時間(退場時間)を引いて、
//滞在時間を取得します。
long stay_time = (System.currentTimeMillis() - welcome_time)/1000;
//滞在メッセージの書式を取得します。
String stay_message_format = getResources(
).getString(R.string.stay_time_message_format);
//滞在メッセージの書式に、滞在時間を適用させて、
//滞在メッセージを取得します。
String stay_message = String.format(
stay_message_format, stay_time);
//滞在メッセージの簡略画面表示
Toast.makeText(this, stay_message, Toast.LENGTH_LONG).show();
} /**
* クリック・イベントハンドラ.
* <p>
* android.view.View.OnClickListener インターフェースの * イベントハンドラ・メソッドです。</br>
* このアプリでは、ボタン・クリック時に呼ばれます。
* </p>
*
* (※)MainActivity クラス宣言にて、
* OnClickListener の実装が指定されているので、
* MainActivity クラスのメソッドとして、ここに、
* イベントハンドラの実装を記述しています。
*
* @view イベント発生元の View オブジェクト **/
public void onClick(View view) {
if(view.getId() == R.id.greet_Button){
removeDialog(DIALOG_ID_GREET);
showDialog(DIALOG_ID_GREET);
} else
if(view.getId() == R.id.bye_Button){
showDialog(DIALOG_ID_BYE);