| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Android アプリケーション作成」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
1行目: 1行目:
==Android Hello World チュートリアル==
+
==[[Android Hello World チュートリアル]]==
 
[[Android]] | [[Eclipse]] | [[Java]] |  
 
[[Android]] | [[Eclipse]] | [[Java]] |  
  
 
*http://developer.android.com/resources/tutorials/hello-world.html
 
*http://developer.android.com/resources/tutorials/hello-world.html
*http://www.youtube.com/watch?v=cw5GrRK4AAg
+
*http://www.youtube.com/watch?v=cw5Gr[[R]]K4AAg
*Android SDKのインストール
+
*[[Android SDKのインストール]]
  
 
===プラットフォームのインストール===
 
===プラットフォームのインストール===
 
*Hello World アプリケーションを動かすためには少なくともAndoroidのプラットフォームの一つはSDK環境にインストールしておく必要がある。以下を参照。
 
*Hello World アプリケーションを動かすためには少なくともAndoroidのプラットフォームの一つはSDK環境にインストールしておく必要がある。以下を参照。
  
*[Android SDKのインストール] [SDKのインストール]
+
*[[Android SDKのインストール|SDKのインストール]]
*[Android ADT Eclipse プラグイン] [ADT Eclipse プラグイン]
+
*[[Android ADT Eclipse プラグイン|ADT Eclipse プラグイン]]
  
 
===AVDの作成===
 
===AVDの作成===
 
*http://developer.android.com/guide/developing/tools/avd.html
 
*http://developer.android.com/guide/developing/tools/avd.html
  
*このチュートリアルでは、アプリケーションをAndroid エミュレータで走らせる。
+
*このチュートリアルでは、アプリケーションを[[Android エミュレータ]]で走らせる。
*エミュレータを起動する前に、Android Virtual Device(AVD)を作成する必要がある。
+
*エミュレータを起動する前に、[[Android]] Virtual Device(AVD)を作成する必要がある。
 
*AVD はシステムイメージおよびデバイスのセッティングをエミュレータを利用して定義する。
 
*AVD はシステムイメージおよびデバイスのセッティングをエミュレータを利用して定義する。
  
=====Window - Android SDK and AVD Manager を開く =====
+
=====Window - [[Android]] SDK and AVD Manager を開く =====
 
[[File:0105_android_helloworld01.jpg]]
 
[[File:0105_android_helloworld01.jpg]]
=====Select Virtual Devices を選択し New を押下=====
+
=====Select Virtual De[[vi]]ces を選択し New を押下=====
 
Create New AVD ダイアログが開くので、my_avd のような名前を設定
 
Create New AVD ダイアログが開くので、my_avd のような名前を設定
 
[[File:0106_android_helloworld02.jpg]]
 
[[File:0106_android_helloworld02.jpg]]
28行目: 28行目:
 
[[File:0107_android_helloworld03.jpg]]
 
[[File:0107_android_helloworld03.jpg]]
  
===Android プロジェクトの新規作成===
+
===[[Android]] プロジェクトの新規作成===
http://www.youtube.com/watch?v=Q1SoGRAuVRs
+
http://www.youtube.com/watch?v=Q1SoG[[R]]AuV[[R]]s
 
===== File - New - Project. =====
 
===== File - New - Project. =====
 
[[File:0108_android_helloworld04.jpg]]
 
[[File:0108_android_helloworld04.jpg]]
  
=====Android Project を選択し、Nextを押下=====
+
=====[[Android]] Project を選択し、Nextを押下=====
*ADTプラグインのインストールが成功していれば、Android フォルダに Android Projectが存在する。(1つ以上のプロジェクトを作成したのち、Android XML File エントリも有効になる)
+
*ADTプラグインのインストールが成功していれば、[[Android]] フォルダに [[Android]] Projectが存在する。(1つ以上のプロジェクトを作成したのち、[[Android]] XML File エントリも有効になる)
 
[[File:0109_android_helloworld05.jpg]]
 
[[File:0109_android_helloworld05.jpg]]
  
 
=====プロジェクト詳細設定=====
 
=====プロジェクト詳細設定=====
*Project name: HelloAndroid
+
*Project name: Hello[[Android]]
*Application name: Hello, Android
+
*Application name: Hello, [[Android]]
 
*Package name: info.typea.helloandroid (プライベートのネームスペース)
 
*Package name: info.typea.helloandroid (プライベートのネームスペース)
*Create Activity: HelloAndroid
+
*Create Activity: Hello[[Android]]
 
上記を設定し、Finish
 
上記を設定し、Finish
 
[[File:0110_android_helloworld06.jpg]]
 
[[File:0110_android_helloworld06.jpg]]
51行目: 51行目:
 
|-
 
|-
 
|Project Name
 
|Project Name
|Eclipseのプロジェクト名。同名ディレクトリはプロジェクトのファイルを含む
+
|[[Eclipse]]のプロジェクト名。同名ディレクトリはプロジェクトのファイルを含む
 
|-
 
|-
 
|Application Name
 
|Application Name
|アプリケーションの人間が読むためのタイトル。Android デバイスに表示される。
+
|アプリケーションの人間が読むためのタイトル。[[Android]] デバイスに表示される。
 
|-
 
|-
 
|Package Name
 
|Package Name
|パッケージのネームスペース(Javaでのルールに従う)。パッケージ名を生成されるスタブアクティビティの配下にセットする。パッケージ名はインストールされた Android システムでユニークである必要がある。
+
|パッケージのネームスペース(Javaでのルールに従う)。パッケージ名を生成されるスタブアクティビティの配下にセットする。パッケージ名はインストールされた [[Android]] システムでユニークである必要がある。
 
|-
 
|-
 
|Create Activity
 
|Create Activity
73行目: 73行目:
 
|}
 
|}
  
<blockquote>「Build Target」 選択したプラットフォームがAndroid 1.1 プラットフォームを使うということは、アプリケーションが Android 1.1 プラットフォームライブラリに向けてコンパイルされることを意味する。もし、Android 1.5 プラットフォーム上で、1.1で作成されたAVDを走らせる場合、Build Target をあわせる必要はないAndroid アプリケーションは、前方互換性を持っており、1.1 向けにビルドされたアプリケーションは、通常1.5でも起動する。逆は、成り立つわけではない。</blockquote>
+
<blockquote>「Build Target」 選択したプラットフォームが[[Android]] 1.1 プラットフォームを使うということは、アプリケーションが [[Android]] 1.1 プラットフォームライブラリに向けてコンパイルされることを意味する。もし、[[Android]] 1.5 プラットフォーム上で、1.1で作成されたAVDを走らせる場合、Build Target をあわせる必要はない[[Android]] アプリケーションは、前方互換性を持っており、1.1 向けにビルドされたアプリケーションは、通常1.5でも起動する。逆は、成り立つわけではない。</blockquote>
 
===プロジェクト準備完了===
 
===プロジェクト準備完了===
 
*プロジェクトの準備は以上で感rひょう。
 
*プロジェクトの準備は以上で感rひょう。
*パッケージエクスプローラーで、HelloAndroid.java ファイルを開くと、以下の様になっている。
+
*パッケージエクスプローラーで、Hello[[Android]].java ファイルを開くと、以下の様になっている。
 
[[File:0111_android_helloworld07.jpg]]
 
[[File:0111_android_helloworld07.jpg]]
  
*このクラスは Activity を基底クラスとしている。
+
*このクラスは Acti[[vi]]ty を基底クラスとしている。
*Activity はプラットフォームのアクションから利用される 一つのアプリケーションエンティティ。
+
*Acti[[vi]]ty はプラットフォームのアクションから利用される 一つのアプリケーションエンティティ。
 
*あるアプリケーションは、複数に分割されたアクティビティをもっているが、ユーザーが一度に対話するのはそのうちの一つ。
 
*あるアプリケーションは、複数に分割されたアクティビティをもっているが、ユーザーが一度に対話するのはそのうちの一つ。
*onCreate() メソッドは Android システムからActivityが開始したときに呼び出される。
+
*onCreate() メソッドは [[Android]] システムからActivityが開始したときに呼び出される。
 
*このメソッドは、すべての初期化およびUIのセットアップを実行すべき場所。
 
*このメソッドは、すべての初期化およびUIのセットアップを実行すべき場所。
 
*あるアクティビティはユーザーインターフェースが必要な訳では無いが通常利用する。
 
*あるアクティビティはユーザーインターフェースが必要な訳では無いが通常利用する。
89行目: 89行目:
 
  package info.typea.helloandroid;
 
  package info.typea.helloandroid;
 
   
 
   
  import android.app.Activity;
+
  import android.app.Acti[[vi]]ty;
 
  import android.os.Bundle;
 
  import android.os.Bundle;
 
  import android.widget.TextView;
 
  import android.widget.TextView;
 
   
 
   
  public class HelloAndroid extends Activity {
+
  public class Hello[[Android]] extends Activity {
     /** Called when the activity is first created. */
+
     /** Called when the acti[[vi]]ty is first created. */
 
     @Override
 
     @Override
 
     public void onCreate(Bundle savedInstanceState) {
 
     public void onCreate(Bundle savedInstanceState) {
 
         super.onCreate(savedInstanceState);
 
         super.onCreate(savedInstanceState);
 
         TextView tv = new TextView(this);
 
         TextView tv = new TextView(this);
         tv.setText("Hello, Android");
+
         tv.setText("Hello, [[Android]]");
 
         setContentView(tv);
 
         setContentView(tv);
 
     }
 
     }
115行目: 115行目:
  
 
====[http://developer.android.com/reference/android/app/Activity.html#setContentView(android.view.View) setContentView]====
 
====[http://developer.android.com/reference/android/app/Activity.html#setContentView(android.view.View) setContentView]====
*最後に、Activity UI の中心に表示するためにTextView をsetContentView()に渡す。
+
*最後に、Acti[[vi]]ty UI の中心に表示するためにTextView をsetContentView()に渡す。
*Activity がこのメソッドを呼び出さないと、UIは存在せず、システムはブランクスクリーンを表示する。
+
*Acti[[vi]]ty がこのメソッドを呼び出さないと、UIは存在せず、システムはブランクスクリーンを表示する。
  
*Activity クラスは、Contextを継承している。HelloAndroid クラスはActivityのサブクラス(もちろんContextのサブクラスでもある)
+
*Activity クラスは、Contextを継承している。Hello[[Android]] クラスはActivityのサブクラス(もちろんContextのサブクラスでもある)
*なので、HelloAndroid の参照を Context として、TextViewに渡すことができる。
+
*なので、Hello[[Android]] の参照を Context として、TextViewに渡すことができる。
 
===アプリケーションの起動===
 
===アプリケーションの起動===
#Eclipse プラグインは自動的にプロジェクトの起動設定を生成し、エミュレータを起動する。
+
#[[Eclipse]] プラグインは自動的にプロジェクトの起動設定を生成し、エミュレータを起動する。
#環境に依存するが、Androidエミュレータは、完全に起動するのに数分かかるので、これに耐える。
+
#環境に依存するが、[[Android]]エミュレータは、完全に起動するのに数分かかるので、これに耐える。
#エミュレータが起動したら、Eclipse プラグインは、アプリケーションをインストールしてデフォルトのActivitiyを起動する
+
#エミュレータが起動したら、[[Eclipse]] プラグインは、アプリケーションをインストールしてデフォルトのActivitiyを起動する
 
#以下の画面が表示される
 
#以下の画面が表示される
  
 
[[File:0112_android_helloworld08.jpg]]
 
[[File:0112_android_helloworld08.jpg]]
  
*"Hello, Android" とグレーのバーに表示されているところは、実際はアプリケーションのタイトル。
+
*"Hello, [[Android]]" とグレーのバーに表示されているところは、実際はアプリケーションのタイトル。
*Eclipse プラグインは、これを自動生成する(この文字列は res/values/strings.xml で定義されており、AndroidManifest.xml から参照されている)
+
*Eclipse プラグインは、これを自動生成する(この文字列は res/values/strings.xml で定義されており、[[Android]]Manifest.xml から参照されている)
 
*タイトルの下が、TextView オブジェクトに設定した内容。
 
*タイトルの下が、TextView オブジェクトに設定した内容。
  
===UI を XML レイアウトに変更する===
+
===UI を [[XML]] レイアウトに変更する===
 
=====プログラミングによる UI レイアウト=====
 
=====プログラミングによる UI レイアウト=====
 
*上記例は、プログラミングによる UI レイアウトで、アプリケーションのUIをソースコードで直接構築する手法。
 
*上記例は、プログラミングによる UI レイアウトで、アプリケーションのUIをソースコードで直接構築する手法。
 
*UIのプログラミングを数多く経験しているなら、プログラミングによるアプローチが、少しのレイアウトの変更がソースコード上で大きな頭痛の種となど、どれだけ不安定かになじみがあるだろう。
 
*UIのプログラミングを数多く経験しているなら、プログラミングによるアプローチが、少しのレイアウトの変更がソースコード上で大きな頭痛の種となど、どれだけ不安定かになじみがあるだろう。
  
=====XMLによる UI レイアウト=====
+
=====[[XML]]による UI レイアウト=====
*上記が、UIの生成にAndroidではXMLによるレイアウトファイルという代替方式を提供する理由
+
*上記が、UIの生成に[[Android]]ではXMLによるレイアウトファイルという代替方式を提供する理由
  
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <?xml version="1.0" encoding="utf-8"?>
146行目: 146行目:
 
   android:text="@string/hello"/>
 
   android:text="@string/hello"/>
  
*Android XML レイアウトファイルの一般的な構造は簡単
+
*[[Android]] XML レイアウトファイルの一般的な構造は簡単
*XML 要素のツリーとなっている。その中のノードそれぞれはViewクラスの名前となっている。
+
*[[XML]] 要素のツリーとなっている。その中のノードそれぞれはViewクラスの名前となっている。
*自ら作成したどんな名前のクラスでも、Viewを継承していれば XML レイアウトの要素として利用できる
+
*自ら作成したどんな名前のクラスでも、Viewを継承していれば [[XML]] レイアウトの要素として利用できる
 
*この構造で、簡単にすばやくUIを作成でき、プログラミングするよりシンプルな構造と文法を利用できる。
 
*この構造で、簡単にすばやくUIを作成でき、プログラミングするよりシンプルな構造と文法を利用できる。
*このモデルは、Web開発モデルに触発されており、アプリケーションのプレゼンテーション(UI)をロジックから分離する。
+
*このモデルは、Web開発モデルに触発されており、アプリケーションのプレゼンテーション(UI)を[[ロジック]]から分離する。
  
=====XML属性=====
+
=====[[XML]]属性=====
 
{|class="wikitable"
 
{|class="wikitable"
 
!属性
 
!属性
158行目: 158行目:
 
|-
 
|-
 
|xmlns:android
 
|xmlns:android
|XML 名前空間の定義。Android tools に Android 名前空間で定義された公開属性を参照させる。すべての Android レイアウトファイルにおいて一番外側のタグにて必ず持つ必要がある属性。
+
|XML 名前空間の定義。[[Android]] tools に [[Android]] 名前空間で定義された公開属性を参照させる。すべての [[Android]] レイアウトファイルにおいて一番外側のタグにて必ず持つ必要がある属性。
 
|-
 
|-
 
|android:layout_width
 
|android:layout_width
171行目: 171行目:
 
|}
 
|}
 
=====res ディレクトリ=====
 
=====res ディレクトリ=====
*これらの XML レイアウトファイルは、res/layout/ に属している。"res" は、"resources" の略で、このディレクトリはコード以外のアプリケーション資産(レイアウトファイルに加えイメージ、サウンド、ローカライズ用文字列など)すべてを含む
+
*これらの [[XML]] レイアウトファイルは、res/layout/ に属している。"res" は、"resources" の略で、このディレクトリはコード以外のアプリケーション資産(レイアウトファイルに加えイメージ、サウンド、ローカライズ用文字列など)すべてを含む
  
====既に存在するアプリケーションをXMLレイアウトを使用するように変更====
+
====既に存在するアプリケーションを[[XML]]レイアウトを使用するように変更====
*Eclipse プラグインは、自動的にレイアウトファイル(main.xml)を生成する。
+
*[[Eclipse]] プラグインは、自動的にレイアウトファイル(main.xml)を生成する。
 
*作成した"Hello World"アプリケーションでは、レイアウトをプログラムから生成し、このファイルは無視された。
 
*作成した"Hello World"アプリケーションでは、レイアウトをプログラムから生成し、このファイルは無視された。
*しかし、ほとんどの場合にはコードではなくXML ファイルにレイアウトを定義すべき。
+
*しかし、ほとんどの場合にはコードではなく[[XML]] ファイルにレイアウトを定義すべき。
*以下では、どのように既に存在するアプリケーションをXMLレイアウトを使用するように変更するのかを説明。
+
*以下では、どのように既に存在するアプリケーションを[[XML]]レイアウトを使用するように変更するのかを説明。
  
 
====main.xml 内容の置き換え====
 
====main.xml 内容の置き換え====
*Eclipse のパッケージエクスプローラーの /res/layout フォルダーを展開し、main.xml を開く(開いたら、ウィンドウ下部の mail.xml タブをクリックすると XML ソースが見える)
+
*[[Eclipse]] のパッケージエクスプローラーの /res/layout フォルダーを展開し、main.xml を開く(開いたら、ウィンドウ下部の mail.xml タブをクリックすると XML ソースが見える)
*内容を以下の XML に置き換える。
+
*内容を以下の [[XML]] に置き換える。
  
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <?xml version="1.0" encoding="utf-8"?>
191行目: 191行目:
 
*res/values フォルダの中の strings.xml を開く
 
*res/values フォルダの中の strings.xml を開く
 
*これは、ユーザーインターフェースのすべてのデフォルトテキスト文字列を保存すべき場所
 
*これは、ユーザーインターフェースのすべてのデフォルトテキスト文字列を保存すべき場所
*Eclipse を使っているなら、ADT が既に2つの文字列を hello と app_name を持ってる。
+
*[[Eclipse]] を使っているなら、ADT が既に2つの文字列を hello と app_name を持ってる。
*helloを "Hello, Android! I am a string resource!" 変更すると、以下のようになる。
+
*helloを "Hello, [[Android]]! I am a string resource!" 変更すると、以下のようになる。
  
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <resources>
 
  <resources>
     <string name="hello">Hello, Android! I am a string resource!</string>
+
     <string name="hello">Hello, [[Android]]! I am a string resource!</string>
     <string name="app_name">Hello, Android</string>
+
     <string name="app_name">Hello, [[Android]]</string>
 
  </resources>
 
  </resources>
====HelloAndroid クラスの修正====
+
====Hello[[Android]] クラスの修正====
*HelloAndroid クラスを XML レイアウトを利用するように、以下の様に修正
+
*Hello[[Android]] クラスを XML レイアウトを利用するように、以下の様に修正
 
  package info.typea.helloandroid;
 
  package info.typea.helloandroid;
 
   
 
   
  import android.app.Activity;
+
  import android.app.Acti[[vi]]ty;
 
  import android.os.Bundle;
 
  import android.os.Bundle;
 
   
 
   
  public class HelloAndroid extends Activity {
+
  public class Hello[[Android]] extends Activity {
     /** Called when the activity is first created. */
+
     /** Called when the acti[[vi]]ty is first created. */
 
     @Override
 
     @Override
 
     public void onCreate(Bundle savedInstanceState) {
 
     public void onCreate(Bundle savedInstanceState) {
 
         super.onCreate(savedInstanceState);
 
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
+
         setContentView([[R]].layout.main);
 
     }
 
     }
 
  }
 
  }
  
*setContentView に View オブジェクトの代わりに レイアウトリソースのリファレンスを渡す。リソースは、R.layout.main として特定されるが、実際は /res/layout/main.xml で定義したレイアウトが解析されコンパイルされたオブジェクトを表す。
+
*setContentView に View オブジェクトの代わりに レイアウトリソースのリファレンスを渡す。リソースは、[[R]].layout.main として特定されるが、実際は /res/layout/main.xml で定義したレイアウトが解析されコンパイルされたオブジェクトを表す。
*Eclipse プラグインは自動でこの R.java クラスへ参照を生成する。
+
*[[Eclipse]] プラグインは自動でこの R.java クラスへ参照を生成する。
*Eclipse を使わない場合、Ant でアプリケーションをビルドすると生成される。
+
*[[Eclipse]] を使わない場合、Ant でアプリケーションをビルドすると生成される。
  
 
*アプリケーションを再度実行する。
 
*アプリケーションを再度実行する。
  
 
[[File:0113_android_helloworld09.jpg]]
 
[[File:0113_android_helloworld09.jpg]]

2020年2月16日 (日) 04:21時点における最新版

Android Hello World チュートリアル

Android | Eclipse | Java |

プラットフォームのインストール

  • Hello World アプリケーションを動かすためには少なくともAndoroidのプラットフォームの一つはSDK環境にインストールしておく必要がある。以下を参照。

AVDの作成

  • このチュートリアルでは、アプリケーションをAndroid エミュレータで走らせる。
  • エミュレータを起動する前に、Android Virtual Device(AVD)を作成する必要がある。
  • AVD はシステムイメージおよびデバイスのセッティングをエミュレータを利用して定義する。
Window - Android SDK and AVD Manager を開く

0105 android helloworld01.jpg

Select Virtual Devices を選択し New を押下

Create New AVD ダイアログが開くので、my_avd のような名前を設定 0106 android helloworld02.jpg

プラットフォームターゲットを選択し、Create AVD 押下
  • プラットフォームを選択する。残りのフィールドは現時点では無視してよい。

0107 android helloworld03.jpg

Android プロジェクトの新規作成

http://www.youtube.com/watch?v=Q1SoGRAuVRs

File - New - Project.

0108 android helloworld04.jpg

Android Project を選択し、Nextを押下
  • ADTプラグインのインストールが成功していれば、Android フォルダに Android Projectが存在する。(1つ以上のプロジェクトを作成したのち、Android XML File エントリも有効になる)

0109 android helloworld05.jpg

プロジェクト詳細設定
  • Project name: HelloAndroid
  • Application name: Hello, Android
  • Package name: info.typea.helloandroid (プライベートのネームスペース)
  • Create Activity: HelloAndroid

上記を設定し、Finish 0110 android helloworld06.jpg

  • フィールドの説明
フィールド 内容
Project Name Eclipseのプロジェクト名。同名ディレクトリはプロジェクトのファイルを含む
Application Name アプリケーションの人間が読むためのタイトル。Android デバイスに表示される。
Package Name パッケージのネームスペース(Javaでのルールに従う)。パッケージ名を生成されるスタブアクティビティの配下にセットする。パッケージ名はインストールされた Android システムでユニークである必要がある。
Create Activity プラグインによって生成されるスタブクラスの名前。Android の Activetiy のサブクラス。Activity は 起動して作業できるシンプルなクラス。必須ではないが、選択すればUIを生成できる。チェックはオプションだが、Activity はアプリケーションの基盤として多くの場合に利用される。
Min SDK Version アプリケーションの最低限のAPIレベルを指定する。Android API レベル参照。
Use default location チェックにより、プロジェクトのファイルの置き場所を変更する。
Build Target アプリケーションのコンパイルターゲットとなるプラットフォーム

<blockquote>「Build Target」 選択したプラットフォームがAndroid 1.1 プラットフォームを使うということは、アプリケーションが Android 1.1 プラットフォームライブラリに向けてコンパイルされることを意味する。もし、Android 1.5 プラットフォーム上で、1.1で作成されたAVDを走らせる場合、Build Target をあわせる必要はないAndroid アプリケーションは、前方互換性を持っており、1.1 向けにビルドされたアプリケーションは、通常1.5でも起動する。逆は、成り立つわけではない。</blockquote>

プロジェクト準備完了

  • プロジェクトの準備は以上で感rひょう。
  • パッケージエクスプローラーで、HelloAndroid.java ファイルを開くと、以下の様になっている。

0111 android helloworld07.jpg

  • このクラスは Activity を基底クラスとしている。
  • Activity はプラットフォームのアクションから利用される 一つのアプリケーションエンティティ。
  • あるアプリケーションは、複数に分割されたアクティビティをもっているが、ユーザーが一度に対話するのはそのうちの一つ。
  • onCreate() メソッドは Android システムからActivityが開始したときに呼び出される。
  • このメソッドは、すべての初期化およびUIのセットアップを実行すべき場所。
  • あるアクティビティはユーザーインターフェースが必要な訳では無いが通常利用する。

UIの構築

package info.typea.helloandroid;

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

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

View

  • Android のユーザーインターフェースはViewから呼ばれたオブジェクト階層から組み立てられている。
  • Viewは、UIレイアウトの要素で、描画可能なオブジェクトで、ボタン、イメージ、テキスト、ラベルなど
  • これらのオブジェクトは、View のサブクラスでテキストを扱うのはTextView

Context

  • この変更で、TextView をコンストラクタで生成する。コンストラクタは、Android Contextインスタンスをパラメーターとして受け取る。
  • Context はシステムを処理する。
    • リソースの解決などサービスの提供
    • データベースやプリファレンスへのアクセス

setContentView

  • 最後に、Activity UI の中心に表示するためにTextView をsetContentView()に渡す。
  • Activity がこのメソッドを呼び出さないと、UIは存在せず、システムはブランクスクリーンを表示する。
  • Activity クラスは、Contextを継承している。HelloAndroid クラスはActivityのサブクラス(もちろんContextのサブクラスでもある)
  • なので、HelloAndroid の参照を Context として、TextViewに渡すことができる。

アプリケーションの起動

  1. Eclipse プラグインは自動的にプロジェクトの起動設定を生成し、エミュレータを起動する。
  2. 環境に依存するが、Androidエミュレータは、完全に起動するのに数分かかるので、これに耐える。
  3. エミュレータが起動したら、Eclipse プラグインは、アプリケーションをインストールしてデフォルトのActivitiyを起動する
  4. 以下の画面が表示される

0112 android helloworld08.jpg

  • "Hello, Android" とグレーのバーに表示されているところは、実際はアプリケーションのタイトル。
  • Eclipse プラグインは、これを自動生成する(この文字列は res/values/strings.xml で定義されており、AndroidManifest.xml から参照されている)
  • タイトルの下が、TextView オブジェクトに設定した内容。

UI を XML レイアウトに変更する

プログラミングによる UI レイアウト
  • 上記例は、プログラミングによる UI レイアウトで、アプリケーションのUIをソースコードで直接構築する手法。
  • UIのプログラミングを数多く経験しているなら、プログラミングによるアプローチが、少しのレイアウトの変更がソースコード上で大きな頭痛の種となど、どれだけ不安定かになじみがあるだろう。
XMLによる UI レイアウト
  • 上記が、UIの生成にAndroidではXMLによるレイアウトファイルという代替方式を提供する理由
<?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="fill_parent"
  android:text="@string/hello"/>
  • Android XML レイアウトファイルの一般的な構造は簡単
  • XML 要素のツリーとなっている。その中のノードそれぞれはViewクラスの名前となっている。
  • 自ら作成したどんな名前のクラスでも、Viewを継承していれば XML レイアウトの要素として利用できる
  • この構造で、簡単にすばやくUIを作成でき、プログラミングするよりシンプルな構造と文法を利用できる。
  • このモデルは、Web開発モデルに触発されており、アプリケーションのプレゼンテーション(UI)をロジックから分離する。
XML属性
属性 内容
xmlns:android XML 名前空間の定義。Android tools に Android 名前空間で定義された公開属性を参照させる。すべての Android レイアウトファイルにおいて一番外側のタグにて必ず持つ必要がある属性。
android:layout_width スクリーン上でどれだけの幅をこのViewが使用すべきかを定義。例では、ただひとつの View しかないため、すべてのスクリーンを占めたい。"fill_parent" はそういう場合に指定。
android:layout_height スクリーン上での高さをあらわす以外は、android:layout_widthと同様。
android:text TextView が表示するテキストをセットする。例では、文字列リソースをハードコーディングする代わりに利用している。文字列は res/values/strings.xml ファイルに定義されている。他言語へのローカライズをレイアウトファイルを修正する必要がないため、アプリケーションに文字列を挿入する場合、この方法を推奨。
res ディレクトリ
  • これらの XML レイアウトファイルは、res/layout/ に属している。"res" は、"resources" の略で、このディレクトリはコード以外のアプリケーション資産(レイアウトファイルに加えイメージ、サウンド、ローカライズ用文字列など)すべてを含む

既に存在するアプリケーションをXMLレイアウトを使用するように変更

  • Eclipse プラグインは、自動的にレイアウトファイル(main.xml)を生成する。
  • 作成した"Hello World"アプリケーションでは、レイアウトをプログラムから生成し、このファイルは無視された。
  • しかし、ほとんどの場合にはコードではなくXML ファイルにレイアウトを定義すべき。
  • 以下では、どのように既に存在するアプリケーションをXMLレイアウトを使用するように変更するのかを説明。

main.xml 内容の置き換え

  • Eclipse のパッケージエクスプローラーの /res/layout フォルダーを展開し、main.xml を開く(開いたら、ウィンドウ下部の mail.xml タブをクリックすると XML ソースが見える)
  • 内容を以下の XML に置き換える。
<?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="fill_parent"
  android:text="@string/hello"/>

strings.xml の編集

  • res/values フォルダの中の strings.xml を開く
  • これは、ユーザーインターフェースのすべてのデフォルトテキスト文字列を保存すべき場所
  • Eclipse を使っているなら、ADT が既に2つの文字列を hello と app_name を持ってる。
  • helloを "Hello, Android! I am a string resource!" 変更すると、以下のようになる。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello, Android! I am a string resource!</string>
    <string name="app_name">Hello, Android</string>
</resources>

HelloAndroid クラスの修正

  • HelloAndroid クラスを XML レイアウトを利用するように、以下の様に修正
package info.typea.helloandroid;

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

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
  • setContentView に View オブジェクトの代わりに レイアウトリソースのリファレンスを渡す。リソースは、R.layout.main として特定されるが、実際は /res/layout/main.xml で定義したレイアウトが解析されコンパイルされたオブジェクトを表す。
  • Eclipse プラグインは自動でこの R.java クラスへ参照を生成する。
  • Eclipse を使わない場合、Ant でアプリケーションをビルドすると生成される。
  • アプリケーションを再度実行する。

0113 android helloworld09.jpg