Eclipse と Android ウィジェットを使用した Android アプリケーション開発手法の紹介

このチュートリアルで対象とするのは、Eclipse で Android 開発ツール (Android Development Tools: ADT) プラグインを使用して Android アプリケーションの開発を始めたいと思っている読者です。チュートリアルでは、Android アプリケーションの際立った特徴を紹介した後、その基本コンポーネントについて概説します。次にアプリケーションのリッチな UI をウィジェットとして開発する際の Android プロセスを紹介し、最後に、アプリケーションを SDK に付属の Android 機器シミュレーターにデプロイして、開発したアプリケーションをいかに簡単にテストできるかを示します。

Ayushman Jain, Eclipse JDT/Core Committer, IBM

Ayushman Jain は、インドのバンガロールにある IBM India Software Labs の Eclipse チームで JDT/Core コミッターとして働いています。彼は、インドの大学に Eclipse を広めることを目標とする Eclipse@campus イニシアチブのリーダーです。プラットフォームとしての Android に熱心に取り組む彼は、その開発の容易さから、Eclipse 環境で使用することを奨励しています。彼はインドのデリーで発行されている若者向けの雑誌、「NOW」の技術エディターでもあり、この雑誌で Android をベースとした HTC 電話を検討しています。



2012年 1月 06日

はじめに

Android は、Symbian、iOS、Windows Mobile などと同様のモバイル・オペレーティング・システムです。Android を最初に開発したのは Android Inc. で、同社はその後 Google に買収されました。現在は Open Handset Alliance が所有し、完全にオープンソースとなっていることから、その人気が高まっています。Google は Android コードの大部分を Apache License の下で公開しています。このライセンスでは、ベンダーが独自に開発した拡張機能を、オープンソース・コミュニティーに提出することなく追加することができます。強力な機能を詰め込んだ Froyo (Android 2.2) を始めとし、Android は誕生して以来、次々と新しいバージョンを市場に送り出してきました (Froyo は、このチュートリアルを執筆していた 2010年第 3 四半期での最新バージョンです)。今や、Android は単なるモバイル機器向けプラットフォームを超えた存在となっており、新しい Google TV にも、その動作環境として Android が選ばれています。

Linux カーネルの修正版を採用している Android では、Java ライブラリー (そのうちの一部は Google が Android 用に開発したものです) を使用して、アプリケーションを Java 技術で開発できるようになっています。Android アプリケーションは Java 言語で作成されますが、Android プラットフォームに Java 仮想マシンはないため、Java バイト・コードは実行されません。Java クラスは Dalvik 実行可能プログラムに再コンパイルされてから、Dalvik 仮想マシン上で実行されます。Dalvik は、Android 機器や、バッテリー電源の下で低性能の CPU を使用して動作するように最適化された機器を対象に設計された仮想マシンです。

Android SDK には、デバッガー、ライブラリー、ハンドセット・エミュレーター、ドキュメント、サンプル・コード、チュートリアルを始めとし、開発者のために豊富なツールが用意されています。また、「Android 開発ツール (Android Development Tools: ADT)」というプラグインを使用すれば、Android アプリケーションを Eclipse (Android の公式開発プラットフォーム) で簡単に開発することができます。その場合、Eclipse のコンテンツ・アシスト機能や Java 検索、オープン・リソース、JUnit 統合、各種のビューとパースペクティブなどの充実した機能を利用して Android アプリケーションを開発できるというわけです。さらに、Java Swing と同様のウィジェットもさまざまに揃っていて、アプリケーションのリッチな UI を容易に作成できるようになっています。しかも、Javadoc に詳細な説明があるので、開発プロセスはごく簡単です。

このチュートリアルでは、まず始めに Android 開発のためのシステムを準備する手順を説明します。次に、基本的な「Hello World」Android アプリケーションを例に、Android アプリケーションの際立った特徴を簡単に紹介するとともに、Android アプリケーションの構成ファイルについて、そして UI がどのように実装から切り離されるのかについても説明します。さらに、Android アプリケーションを Eclipse で作成、開発、実行するプロセスをひと通り説明し、リッチな UI (モバイル・アプリケーションの極めて重要な部分) を作成するのに役立つ Android ウィジェットを紹介した後、いくつかの基本的なウィジェットをサンプル・アプリケーションで実際に使用してみます。基本的なウィジェットのうち、「listView (リスト・ビュー)」ウィジェットを電話帳のようなアプリケーションで使用する例を取り上げ、このウィジェットをどのように実装できるかを説明します。この説明の中で、アプリケーションを OS のデータにアクセスさせるために設定しなければならない許可についても言及します。この全部で 2 ~ 3 時間のチュートリアルを完了すれば、基本的な機能を実装して見事な UI を備えたアプリケーションを作成できるようになるはずです。

システム要件

Android 開発を始める前に、以下のツールがインストールされていることを確認してください。

  • Eclipse SDK — 本チュートリアルでは、Android SDK とともに V3.5 を使用します。Eclipse SDK は Galileo ダウンロード・ページからダウンロードすることができます。
  • Android SDK ― Android 2.1 プラットフォーム (API レベル 7) 用の SDK を使用します。
  • Android 開発ツール (Android Development Tools: ADT) — これは Eclipse プラグインです。ADT は、Android 開発での Java 開発ツール (Java Development Tools: JDT) に相当します。ADT プラグインのインストール方法、および Eclipse に Android SDK の場所を設定する方法については、リンク先のサイトに詳細な説明があるので、それに従ってください。

Android で使われる用語

以下に、標準的な Android アプリケーションを構成するコンポーネントを記載します。さらにその下には、Android Developers サイトで説明されている特定の用語の定義を記載します。

  • アクティビティー — アクティビティーは、ユーザーが 1 つの作業のみを行うために表示される UI を表します。例えば、ユーザーが選択できるメニュー項目のリストを表示するアクティビティーや、写真をコメント付きで表示するアクティビティーなどが考えられます。SMS アプリケーションの例で言うと、あるアクティビティーでメッセージを送信する連絡先の一覧を表示し、別のアクティビティーで選択した連絡先へのメッセージを入力し、さらに別のアクティビティーで古いメッセージを参照したり、設定を変更したりすることができます。これらのアクティビティーを組み合わせて全体としての UI を形成しますが、それぞれのアクティビティーは互いに独立しています。
  • コンテンツ・プロバイダー — コンテンツ・プロバイダーは、アプリケーションの特定のデータを別のアプリケーションで使用できるようにします。そのデータは、ファイルシステムに格納することも、SQLite データベースに格納することも、あるいはデータを格納するのに適した方法であればどのような方法で格納することもできます。
  • サービス — サービスは UI を持たず、バックグラウンドで明確な終了期限を指定されることもなく実行されます。サービスの例としては、ユーザーが何かの作業をしているときにバックグラウンドで音楽を再生したり、ネットワーク経由でデータを取得したり、何らかの計算を行ってその結果を必要としているアクティビティーに提供したりするサービスが考えられます。
  • ブロードキャスト・レシーバー — ブロードキャスト・レシーバーは、ブロードキャストのアナウンスを受信して、それに対処するだけのコンポーネントです。ブロードキャストの多くはシステム・コードから送信されるもので、例えばタイムゾーンが変更されたことや、電池の残量が少なくなったこと、言語設定が変更されたことなどがアナウンスされます。

以下の用語についても、意味を理解しておくとよいでしょう。

  • インテント — アクティビティー、サービス、そしてブロードキャスト・レシーバーは、インテントと呼ばれる非同期メッセージによってアクティブにされます。インテントは、メッセージの内容を保持する Intent オブジェクトであり、例えばユーザーに画像を表示するためのアクティビティーや、ユーザーにテキストを編集させるアクティビティーに対して、リクエストを伝達することができます。
  • インテント・フィルター — Intent オブジェクトでは、対象とするコンポーネントの名前を明示的に指定することができます。明示的に指定されている場合、Android はマニフェスト・ファイル内の宣言に基づいてそのコンポーネントを特定してアクティブにします。一方、明示的に指定されていない場合には、Android はそのインテントに応答する上で最適なコンポーネントを見つけなければなりません。そのための方法は、Intent オブジェクトを、対象となり得るコンポーネントのインテント・フィルターと照合することです。コンポーネントのインテント・フィルターは、Android に対してそのコンポーネントが処理することが可能なインテントの種類を示します。

以上のコンポーネントについて理解するには、「Develop Android Applications with Eclipse」および Android Developers サイトの「Hello, World」チュートリアルを参照してください。


Android 仮想デバイスを作成する

このセクションで説明する手順は、アプリケーションを実行してテストするための Android フォンのエミュレーター、つまり Android 仮想デバイス (Android Virtual Device: AVD) を作成する際に必要となります。AVD が起動するまでには時間がかかりますが、デプロイしてテストするアプリケーションごとに個別の AVD を起動する必要はありません。つまり、AVD をいったん起動すれば、AVD が実行している限り、アプリケーションをいくらでもデプロイできるということです。さらに、アプリケーションをデバッグするために AVD を使用することもできます。AVD を作成するには、以下の手順に従ってください。

  1. Eclipse で「Window (ウィンドウ)」 > 「Android SDK and AVD Manager (Android SDK および AVD マネージャー)」の順に選択します。
  2. 左側のペインで「Virtual Devices (仮想デバイス)」を選択します。
  3. New (新規)」をクリックします。すると、「Create New AVD (新規 AVD の作成)」ダイアログが表示されます。
  4. AVD の名前を入力します (例えば、「myPhone」など)。
  5. ターゲットを選択します。ターゲットは、エミュレーター上で実行されるプラットフォーム (つまり、Android SDK のバージョン) です (例えば、2.1 を選択します)。Google API を選択するオプションもありますが、アプリケーションで具体的に Google API を使用する予定でない限り、このオプションを選択する必要はありません。残りのフィールドは、とりあえず無視して構いません。
  6. Create AVD (AVD の作成)」をクリックします。

作成された AVD を選択して「Start (開始)」をクリックすることで AVD が起動すると、キーボードとマルチタッチ・サポートを完備した本物の Android ベースの携帯電話のルック・アンド・フィールが完全に再現されていることがわかります。さらに、AVD はさまざまな構成条件のもとで (横画面/縦画面モード、さまざまなネットワーク強度、ローミング・ネットワークなど)、アプリケーションをテストするために使用することもできます。これらのオプションのすべては、AVD マネージャーを使用して構成することができます。使用可能な各種機器をエミュレートするには、AVD があれば十分です。異なる構成ごとに AVD を作成し、それぞれの AVD でアプリケーションをテストすれば、機器の種類に関係なく確実にアプリケーションを使用できるようにすることが可能です。


新規 Android プロジェクトを作成する

Eclipse で新規プロジェクトを作成する方法は以下のとおりです (図 1 を参照)。

  1. Eclipse で「File (ファイル)」 > 「New (新規)」 > 「Project (プロジェクト)」の順に選択します。Eclipse 用の ADT プラグインが正常にインストールされていれば、表示されるダイアログに「Android」という名前のフォルダーが見つかるはずです。そのフォルダーを展開すると、新規「Android project (Android プロジェクト)」の選択肢が表示されるので、それを選択して「Next (次へ)」をクリックします。
  2. フォームの以下のフィールドに詳細を入力するよう求められます。
  • Project name (プロジェクト名) — プロジェクトの名前。例えば、「HelloWorld」と入力します。
  • Application name (アプリケーション名) — Android 機器でアプリケーションを実行するときに、メニュー、ショートカット、タイトル・バーでアイコンと一緒に表示されるアプリケーションの名前です。例えば、「Hello Android」と入力します。
  • Package name (パッケージ名) — 「com.example.helloandroid」または独自のプライベート名前空間。パッケージ名は、Java 言語と同じ命名規則に従います。
  • Create activity (アクティビティーを作成) — このチュートリアル用に、アクティビティーには適当な名前を付けます。これは、ADT によって生成されるクラス・スタブの名前です。クラス・スタブは Android の Activity クラスのサブクラスになります。アクティビティーとは単に、実行して何らかの処理を行うことができるクラスのことです。オプションで、アクティビティーに UI を作成することもできます。アプリケーションに 1 つ以上のアクティビティーを含めることもできますが、通常は、アクティビティーとアプリケーションの画面は 1 対 1 の関係にあります。アプリケーションが、あるアクティビティーから別のアクティビティーへと移行するには、startActivity() または startSubActivity() というメソッドを呼び出します。
  • Min SDK version (最小 SDK バージョン) — アプリケーションに必要な最小 API レベルを指定します。ここでは 7 を指定します。
図 1. 新規 Android プロジェクトの作成
Eclipse で「HelloWorld」プロジェクトを作成するためのスクリーン・ショット。ビルド・ターゲットは Android 2.1 に設定されています。

「HelloWorld」プロジェクトの詳細

この「HelloWorld」プロジェクトは、画面に「Hello World」と出力するだけの基本的な Android プロジェクトです。このプロジェクトがチュートリアルで果たす役割は以下のとおりです。

  • 新規 Android プロジェクトの作成プロセスのデモンストレーションを行う
  • Android プロジェクトを構成するファイルと、それぞれのファイルの目的を概説する
  • アプリケーションを AVD にデプロイしてテストする手順のデモンストレーションを行う

Android プロジェクトに含まれるファイルやその他のリソースを表示するには、Eclipse に組み込まれている「Package Explorer (パッケージ・エクスプローラー)」ビューを使用します (「Window (ウィンドウ)」 > 「Show View (ビューの表示)」 > 「Package Explorer (パッケージ・エクスプローラー)」の順に選択)。以下で、新規に作成される Android プロジェクトの構成内容を説明します (図 2 を参照)。

  • ソース・コードは以下の 2 つのフォルダーに格納されます。
  1. src」フォルダーには、デフォルトのアクティビティー・クラスの他、ユーザーによって指定されたすべてのクラスが格納されます。
  2. gen」フォルダーには、ADT によって自動的に生成されたファイルが格納されます。このフォルダー内の「R.java」には、「res」フォルダーに置かれているリソースを Java コードから簡単かつ動的に参照できるように、「res」フォルダー内のすべてのリソースへの静的参照が含まれます。したがって、「R.java」の内容は手動で変更しないようにしてください。
図 2. 「HelloWorld」プロジェクトに含まれるファイルやフォルダー
Eclipse での「HelloWorld」プロジェクトのファイルやフォルダーの配置を示すスクリーン・ショット
  • res」フォルダーには、プロジェクトのすべてのリソース (アイコン、画像、ストリング、レイアウト) が格納されます。リソース用のフォルダーを別に設け、ソース・コード以外のリソースをソース・コードから隔離することで、機器のハードウェアの種類や、機器で使用される言語、機器の向き、そして機器の位置などを基準にして、リソースを動的に選択することができます。

「res」フォルダーの中身は以下のとおりです。

  1. drawable-*」フォルダー (1 つ以上) — すべての画像ファイルを格納するフォルダーです。
  2. layout」フォルダー — ここには、アクティビティーの UI 画面を XML コードの形で指定するレイアウトが格納されます。このフォルダー内の「main.xml」は、自動的に生成されます。このフォルダーは、デフォルトの縦向きレイアウト用です。横向きレイアウト (Android 機器が 90度回転された状態) での UI を表現するには、「layout-land」フォルダーを作成して、作成したレイアウト XML ファイルをそこに配置してください。「main.xml」ファイルによって表示される UI は簡潔です (図 3 を参照)。アクティビティーの UI コンポーネントを作成するには、別のレイアウトとビューを空白の画面にドラック・アンド・ドロップします。
  3. values」フォルダー — すべての名前と値のペア (アプリケーションが定義するストリング) が格納されます。
  • AndroidManifest.xml」もプロジェクトの重要な部分です。プラグインの場合の plugin.xml ファイルに相当するこのファイルは、基本的にアプリケーション内のアクティビティーを定義し、各アクティビティーに指定されているアクションを指定します。また、アプリケーションが各種のアクションを実行するために必要な許可もこのファイルで指定されます。このファイルが生成する UI も同じく簡潔なものです。
図 3. 「main.xml」が生成する UI
「main.xml」によって生成される UI のスクリーン・ショット。黒い画面とテキストが表示されています。

ディスク上のプロジェクト・フォルダーに含まれている実際の中身を見てみましょう。Eclipse の「Navigator (ナビゲーター)」ビューを開いてください (「Window (ウィンドウ)」 > 「Show View (ビューの表示)」 > 「Navigator (ナビゲーター)」の順に選択)。すると、図 4 に示す「HelloWorld」プロジェクトの構造が示されます。コンパイル済みクラス・ファイルとは別に、「bin」フォルダー内に以下の 3 つのファイルが含まれています。

  1. 「classes.dex」 — コンパイル済みクラスから生成された実行可能ファイル
  2. 「HelloWorld.apk」 — Android 機器に送られることになる zip 形式のアーカイブ・ファイル。このアーカイブ・ファイルによって、任意の Android 機器にアプリケーションをインストールすることができます。
  3. 「resources.ap_」 — zip 形式で圧縮されたアプリケーション・リソース
図 4. Android プロジェクトのディレクトリー構造
Android プロジェクトのディレクトリー構造を示すスクリーン・ショット。「bin/com」配下にある「classes.dex」、「HellowWorld.apk」、および「resources.ap_」の位置が示され、直前のパラグラフで説明したそれぞれのファイルの目的が記載されています。

アプリケーションのメイン・アクティビティー

次は、MainActivity.java について見ていきます。

リスト 1. MainActivity.java
package com.example.helloandroid;

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

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);
    }
}

このファイルに関しては、以下の点に注意してください。

  • MainActivity が継承する Activity という名前の基底 Android クラスは、android.app パッケージにあります。
  • onCreate() メソッドは、このアクティビティーのデフォルト・エントリー・ポイントであるため、新しいアクティビティーのそれぞれに対して実装する必要があります。このメソッドは、Bundle 型の引数を受け取ります。アクティビティーの作成に必要なオプションとパラメーターは、このパラメーターに渡されます。
  • setContentView() は、R.layout.main 引数を使用してメインの UI を作成します。この引数は R.java に定義された定数で、アプリケーションのリソースにあるメイン・レイアウトを表します。

main.xml

この XML ファイルは、アプリケーションの UI を記述するファイルです。アクティビティーはこのファイルに記述された UI を参照することができますが、UI 自体は特定のアクティビティーにバインドされません。UI は、レイアウトとウィジェットを使用して作成します。Eclipse がデフォルトで作成する main.xml は、単一の「LinearLayout (直線レイアウト)」で構成されます。これは、すべての要素が一列に並べられることを意味します。このファイルが次に定義する「TextView (テキスト・ビュー)」ウィジェットは、編集不可能な静的テキストを表示するために使用されます。この例の場合、strings.xml ファイルに定義された “hello” というストリングが、この静的テキストに該当します (@ 記号は、ファイルが「res」フォルダーに定義されていることを示します)。各ビュー要素には、さらに layout_heightlayout_width などの属性もあります。

図 5. 「main.xml」と「Properties (プロパティー)」ビュー
「Properties (プロパティー)」ビューに「main.xml」が表示されている Eclipse のスクリーン・ショット。左上のセクションにはコードが表示されており、右上のセクションにはアウトラインが、下半分のセクションにはプロパティーの階層が表示されています。

main.xml」ファイルは、「Properties (プロパティー)」ビューを使用すると簡単に操作することができます (「Window (ウィンドウ)」 > 「Show View (ビューの表示)」 > 「Other (その他)」 > 「General (一般)」 > 「Properties (プロパティー)」の順に選択)。「Outline (アウトライン)」ビューで特定のビューが選択されると、そのビューで使用できるすべての属性が「Properties (プロパティー)」タブに取り込まれます (図 5 を参照)。これらの属性の大部分は、決められた値のなかから値を選択するようになっています。その場合、属性の値は「Properties (プロパティー)」タブに表示されている各属性の隣にあるドロップダウン・メニューから選択することができます。例えば「layout_height」を設定する場合、ドロップダウン・ボックスを見るとわかるように、値として選択できるのは、「wrap_content」と「fill_parent」の 2 つだけです (「wrap_content」はビューを元のサイズで描画する一方、「fill_parent」は画面の全高または全幅、あるいは画面全体にビューを拡大します)。
注: 「layout_height」および「layout_width」にサイズを指定するには、次の (a)、(b) に示す 2 つの単位を使用することができます。(a) 密度非依存ピクセル (dp) ― この単位を使用すると、画面サイズの異なる機器で表示しても常に同じようなレイアウトにすることができます (例えば、layout_width = 10dp)。(b) スケール非依存ピクセル (sp) ― dp と同様ではあるものの、これは携帯電話に推奨される標準です (例えば、layout_width = 10sp)。サイズを指定する際の単位の他に、注意すべき点はもう 1 つあります。それは、Java コードからビューやウィジェットを参照する場合には、ビューやウィジェットが一意に決まる ID を持っていなければならないことです。「main.xml」の「Layout (レイアウト)」タブを使用してウィジェットをドラッグ・アンド・ドロップすると、ADT はそのウィジェットの ID を「@+id/someView」(someView は、ビューやウィジェットの ID) という形式で自動的に作成します。Java コードでは、この自動的に作成された ID を「R.id.someView」として参照することができます。


エミュレーターでアプリケーションを実行する

アプリケーションをデプロイして実行するには、実行構成を定義する必要があります。Eclipse で「Run (実行)」 > 「Open Run Dialog (実行構成)」の順に選択するか、ツールバーのショートカットから「Open Run Dialog (実行の構成)」を選択することで、「Run (実行構成)」ダイアログを表示します。左ペインから「Android application (Android アプリケーション)」を選択し、右クリックして表示されるコンテキスト・メニューから「New (新規)」をクリックして、実行構成の名前を入力します。続いて、「Android」タブでプロジェクトの名前を入力し、起動時のアクションとしてデフォルト・アクティビティーを指定します。さらに、「Target (ターゲット)」タブで自分が望むエミュレーター設定を選択し、起動する AVD を指定して、「Run (実行)」をクリックします。すると、図 6 に示す AVD が表示されます。左側には機器の画面が表示され、右側には QWERTY キーパッドが下部に表示され、発信、切断、消音、音量、ホームといったお馴染みの携帯電話のボタンが上部に表示されます。

図 6. Android 仮想デバイス
Android 仮想デバイスのスクリーン・ショット。左側にはエミュレートされた Android フォンの画面、右側には携帯電話のすべてのボタンの仮想キーが表示されています。

Android のウィジェット

基本的な Android アプリケーションを作成して実行する方法がわかったところで、今度はウィジェットを使ってアプリケーションを拡張します (図 7 を参照)。

  • TextView (テキスト・ビュー)」ウィジェットは、「EditText (テキスト編集)」ウィジェットや「Button (ボタン)」ウィジェットなどで構成されます。「Button (ボタン)」ウィジェットは、さらに以下のカテゴリーに分類することができます。
    • 「CheckBox (チェック・ボックス)」
    • 「RadioButton (ラジオ・ボタン)」
    • 「ToggleButton (トグル・ボタン)」など
  • 「ImageView (画像ビュー)」ウィジェットは、「ImageButton (画像ボタン)」ウィジェットなどで構成されます。
  • 「ViewGroup (ビュー・グループ)」ウィジェットは、以下のレイアウトやビューなどで構成されます。
    • 「RelativeLayout (相対レイアウト)」
    • 「TableLayout (表レイアウト)」
    • 「FrameLayout (フレーム・レイアウト)」
    • 「AdapterView (アダプター・ビュー)」
    • 「LinearLayout (直線レイアウト)」

ウィジェットについての情報を得るには、「A Visual Guide to Android GUI Widgets」が最適なガイドです。ただし、Android プラットフォームは急速に変化しているので、このガイドの情報と本チュートリアルで説明している内容は一致しない点があることに注意してください。その明らかな一例は、id の使い方です。このガイドでは、main.xml でウィジェットの ID 属性として使用すると説明されていますが、本チュートリアルで使用している Android プラットフォームのバージョンでは完全修飾された android:id を使用することになっています。

図 7. Android ウィジェットの階層
Android での各ウィジェットの階層を示す図。一番上に「View (ビュー)」があり、その下には種類の異なるビューがあり、さらにその下にはそれぞれのビューに適用されるさまざまなウィジェットがあります。

ウィジェットを使用したサンプル・アプリケーション

これから、以前のセクションで作成したアプリケーションを図 8 のように変更します。このサンプル・アプリケーションの目的は、「TextView (テキスト・ビュー)」、「EditText (テキスト編集)」、「Button (ボタン)」、「Toast (トースト)」などの基本的なウィジェットを読者が実際のアプリケーションで使いこなせるようにすることです。

このサンプル・アプリケーションのタイトル・バーには、「WELCOME!!!」というメッセージを表示します。タイトル・バーの下には 3 つの「TextView (テキスト・ビュー)」ウィジェットを縦に並べます。これらのウィジェットを上から順に説明すると、まず、デフォルト・フォントで「Hello World, how're you?」と表示するウィジェットがあります。次のウィジェットでは、白い背景にイタリック体のセリフ・フォントで「Welcome to my first Android app」というメッセージを中央揃えで表示します。3 つ目のウィジェットでは、赤い背景に太字の等幅フォントで「Type anything and press the button」と表示します。この 3 つのウィジェットの下に、ユーザーがテキストを入力するための「EditText (テキスト編集)」ウィジェット、さらにその下に「Button (ボタン)」ウィジェットが続きます (ボタン上のテキストは「Click me!」にします)。ボタンをクリックすると、「EditText (テキスト編集)」ウィジェットに入力した内容が画面の下中央にある「Toast (トースト)」ウィジェットに表示されるという仕組みです。

この拡張には、それほど多くの実装コードは伴いません。読者の皆さんは、アプリケーションには ADT の XML ファイル用 GUI エディターを使って簡単にウィジェットを組み込めること、そしてウィジェットのプロパティーは Eclipse が提供する「Properties (プロパティー)」ビューで簡単に設定できることに注目してください。このサンプル・アプリケーションからは、UI の部分と実装の部分をそれぞれ独立してコーディングできることもわかります。

図 8. ウィジェットを使用した Android 仮想デバイス
テキストやボタンなどの各種ウィジェットを使用したアプリケーションを実行する Android 仮想デバイスを示すスクリーン・ショット。

string.xml

string.xml ファイルには、いくつかの新しいストリングを追加し、既存のタイトル・ストリングを変更して最終的なタイトルにします。また、2 つの「TextView (テキスト・ビュー)」ウィジェットの背景として、白の背景色と赤の背景色を定義します。

リスト 2. string.xml ファイル
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, how\'re you?</string>
    <string name="app_name">Hello Android</string>
    <string name="title">WELCOME!!!</string>
    <string name="mainText">Welcome to my first android app</string>
    <string name="subText">Type anything and press the button</string>
    <color name="White">#FFFFFF</color>
    <color name="Red">#FF0000</color>
</resources>

既存のストリング hello を変更して、「Hello World, how're you?」というストリングを含めます。上記に示されているように、アポストロフィーにはエスケープ文字 (「\」) が必要です。また、新しく追加する mainText および subText にストリングを定義し、それぞれの背景色として白、赤を定義します。

main.xml

「main.xml」の「Layout (レイアウト)」タブを開いて、2 つの新規「TextView (テキスト・ビュー)」ウィジェット (「EditText (テキスト編集)」ウィジェットと「Button (ボタン)」ウィジェット) をドラッグ・アンド・ドロップしてください。次に、「main.xml」の「Properties (プロパティー)」タブを開いて、各ウィジェットの属性を編集します。

リスト 3. 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:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<TextView 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:id="@+id/mainTextView" 
    android:gravity="center" 
    android:text="@string/mainText" 
    android:textStyle="italic" 
    android:typeface="serif" 
    android:background="@color/White">
</TextView>
<TextView 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:layout_margin="20sp" 
    android:gravity="left" 
    android:id="@+id/subTextView" 
    android:padding="10sp" 
    android:text="@string/subText" 
    android:textStyle="bold" 
    android:typeface="monospace" 
    android:background="@color/Red">
</TextView>
<EditText 
    android:text="Enter text here" 
    android:id="@+id/EditText01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
</EditText>
<Button 
    android:text="Click me!" 
    android:id="@+id/Button01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
</Button>
</LinearLayout>

これで、UI は定義できたので、今度はアクティビティー・コードと UI を関連付けます。

MainActivity.java

これが、実際に UI を実装に関連付けるファイルです。HelloWorld アプリケーションと同じように、 Activity.onCreate(Bundle) メソッドを使用して画面上のすべての UI 要素を修飾します。オーバーライドされた onClick(View) メソッドにボタン・クリックの機能を含めることで、ユーザーが入力したテキストが読み込まれて画面上の「Toast (トースト)」ウィジェットに表示されるようにします。

リスト 4. MainActivity.java ファイル
package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

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);
        
        String title = getString(R.string.title);
        setTitle(title);    // done so that we can change the default title
        
        //get handles to editText and button widgets
        final EditText eText = (EditText) findViewById(R.id.EditText01);
        final Button button = (Button) findViewById(R.id.Button01);
        
        button.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                //get the String entered into the editText widget
                CharSequence editText = eText.getText();
                
                //display the toast
                Toast.makeText(MainActivity.this, editText, Toast.LENGTH_LONG).show();
            }
        });
        
    }
}

このコードを使用すれば、図 8 に示すアプリケーションが完成します。


ウィジェットを使用する: サンプル・アプリケーション

このセクションでは「ListView (リスト・ビュー)」ウィジェットを使用して、電話帳のすべての「Contacts (連絡先)」を表示する新しいサンプル・アプリケーションを作成します (図 9a および 9b を参照)。このアプリケーションの目的は、「ListView (リスト・ビュー)」ウィジェットの使い方を示すことだけでなく、ContentProvider クラスと ContentResolver クラスを使用して電話帳のデータを取得する方法を説明することです。今回は、UI の XML ファイルに注目してください。これらのファイルには、2 つの UI レイアウトがあります。1 つは「ListView (リスト・ビュー)」ウィジェットによって表示されるリストをメイン UI にどのように収めるかを指定し、もう 1 つは、リスト内の各要素を表示する方法を指定します。もう 1 つの重要な点は、アプリケーションが電話帳のデータを読み取れるようにするための許可の設定です。このサンプル・アプリケーションは、インテントとインテント・フィルターをアプリケーションに組み込む方法を理解する最初のステップとなります。インテントについては、このチュートリアルでは詳しく説明しませんが、読者の皆さんには、このサンプル・アプリケーションを実際の電話帳アプリケーションに変換するには、リスト項目にクリック・アクションを実装し、選択された「Contacts (連絡先)」の呼び出しを開始するための呼び出しインテントと呼び出しインテント・フィルターを作成するだけでよい、ということを理解してもらえることと思います。

このサンプル・アプリケーションでは「Contacts (連絡先)」を縦に並べて表示します。選択された「Contacts (連絡先)」は、リストの先頭にイタリック体フォントと青の背景で表示されます。また、画面の左下にはチェック・ボックスを配置して、ここにチェック・マークを付けると、主な「Contacts (連絡先)」 (つまり「Favorites (お気入り)」に登録した「Contacts (連絡先)」) だけが表示されるようにします。このアプリケーションのタイトルは「Contact Manager」で、使用するウィジェットのタイプは「TextView (テキスト・ビュー)」、「ListView (リスト・ビュー)」、および「checkBox (チェック・ボックス)」の 3 つです。「TextView (テキスト・ビュー)」ウィジェットは、現在選択されている「Contacts (連絡先)」を表示するために使用します。「ListView (リスト・ビュー)」ウィジェットは、「TextView (テキスト・ビュー)」ウィジェットのリストであると考えてください。「ListView (リスト・ビュー)」ウィジェットはアダプター・デザイン・パターンを適用して、データ (この場合は、「Contacts (連絡先)」) およびデータ・ビュー (この場合は、「TextView (テキスト・ビュー)」ウィジェット) を「ListView (リスト・ビュー)」ウィジェット自体に接続します。「ListView (リスト・ビュー)」ウィジェット上でのクリックは、AdapterView.OnItemClickListener() を実装することによって常に捕捉できるようになります。

先に進む前に、Android エミュレーター (AVD) の「Contacts (連絡先)」セクションに連絡先をいくつか保存しておかなければなりません。それには、AVD のホーム画面で「Contacts (連絡先)」をクリックし、「Menu (メニュー)」から「Add Contacts (連絡先の追加)」を選択します。「Favorites (お気入り)」のセクションには、「Contacts (連絡先)」にお気に入りとしてマークを付ける方法が示されています。

図 9a. 「ListView (リスト・ビュー)」ウィジェットにすべての「Contacts (連絡先)」が表示された連絡先アプリケーション
AVD で実行されている連絡先アプリケーションのスクリーン・ショット。著者のエントリーが強調表示された状態で、「Contacts (連絡先)」のリストが表示されています。
図 9b. チェック・ボックスが選択されて、「listView (リスト・ビュー)」ウィジェットにお気に入りの「Contacts (連絡先)」だけが表示された連絡先アプリケーション
AVD で実行されている連絡先アプリケーションのスクリーン・ショット。「show-starred contacts only (お気に入りの連絡先のみを表示)」オプションが選択されているため、「Contacts (連絡先)」のリストのエントリー数が少なくなっています。

早速、いくつかのストリングを定義します。

リスト 5. strings.xml ファイルに定義されたストリング
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="hello">Hello World, Manager!</string> 
  <string name="app_name">Contact Manager</string> 
  <string name="selectedEntry" /> 
  <color name="White">#FFFFFF</color> 
  <color name="Black">#000000</color> 
  <color name="Blue">#0000FF</color> 
 <string name="showStarred">Show starred contacts only</string>
</resources>

main.xml

次に、アプリケーションのメイン・レイアウトを定義します。「ListView (リスト・ビュー)」ウィジェットには電話帳のすべての「Contacts (連絡先)」が収容されます。「ListView (リスト・ビュー)」ウィジェットに表示される個々の「Contacts (連絡先)」は、それぞれ別個の「TextView (テキスト・ビュー)」ウィジェット (次に定義します) に入れられます。

リスト 6. 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:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:id="@+id/selectedContact" 
    android:padding="10dp" 
    android:textSize="20sp" 
    android:textStyle="italic" 
    android:typeface="serif" 
    android:background="@color/Blue" 
    android:textColor="@color/White" 
    android:text="@string/selectedEntry"/>
<ListView 
    android:id="@+id/contactsListView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1">
    </ListView>
<CheckBox android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/showStarred"
    android:text="@string/showStarred"/>
</LinearLayout>

ListView (リスト・ビュー)」ウィジェットの layout_weight に “1” を設定することによって、新しいウィジェットが定義されるまでは、リストが画面領域全体に表示されるようにしていることに注意してください。

contactItem.xml

このファイルには、メイン・レイアウトとは別のレイアウトを定義する必要があります。このレイアウトは、「ListView (リスト・ビュー)」ウィジェット内の各要素を表現するためのものです。ここでは単純な「TextView (テキスト・ビュー)」ウィジェットを使用します。

リスト 7. 「ListView (リスト・ビュー)」ウィジェット内の各要素を構成する「TextView (テキスト・ビュー)」ウィジェットのコード
<?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:padding="5dp" 
  android:textStyle="bold" 
  android:id="@+id/contactItem">
</TextView>

独自のレイアウトを定義する代わりに、Android がデフォルトで提供する単純なレイアウトを使用することもできます。このデフォルト・レイアウトを参照するには、android.R.layout.simple_list_item_1 を使用します。

ManageContacts.java

リスト 8 に、メイン・アクティビティーの実装方法を示します。populateContactList() メソッドを使用して、電話帳の Contacts データベースに対してクエリーを実行し、その結果を「ListView (リスト・ビュー)」ウィジェットに表示します。

リスト 8. メイン・アクティビティーの実装
public class ManageContacts extends Activity {
    private ListView mContactList;
    private CheckBox mCheckBox;
    private boolean mShowStarred;
    private TextView selectedText;
     /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mContactList = (ListView) findViewById(R.id.contactsListView);
        mCheckBox = (CheckBox) findViewById(R.id.showStarred);
        selectedText = (TextView) findViewById(R.id.selectedContact);
        mShowStarred = false;
        
        mCheckBox.setOnCheckedChangeListener(new CheckChangedListener());
        
        mContactList.setOnItemClickListener(new ClickListener());
        
        populateContactList();
       
    }
    
    public void populateContactList() {
         Uri uri = ContactsContract.Contacts.CONTENT_URI;
         String[] projection = new String[] {
                 ContactsContract.Contacts._ID,
                 ContactsContract.Contacts.DISPLAY_NAME,
         };
         String[] selectionArgs = null;
         String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + 
" COLLATE LOCALIZED ASC";
         String selection = mShowStarred? ContactsContract.Contacts.STARRED + 
" ='1'" : null;
         Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, 
sortOrder);
         
         String[] fields = new String[] {
                 ContactsContract.Data.DISPLAY_NAME
         };
         SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contactitem,
c, fields, new int[] {R.id.contactItem});
         mContactList.setAdapter(adapter);
         
    }
    
    private class ClickListener implements OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> arg0, View textView, int pos, long arg3) {
            if(textView instanceof TextView)
                selectedText.setText(((TextView) textView).getText());
         }
     }
    
    private class CheckChangedListener implements OnCheckedChangeListener {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
             mShowStarred = isChecked;
             selectedText.setText("");
             populateContactList();
            
        }
        
    }
}

以下の点に注意してください。

  • リスナーは 2 つあります。1 つはリスト項目上でのクリックを処理するためのリスナー、もう 1 つはチェック・ボックスのクリックを処理するためのリスナーです。前者のリスナーは単純に、青い背景色の「TextView (テキスト・ビュー)」ボックスに表示されるテキストを、現在選択されている「Contacts (連絡先)」の表示名に設定するだけです。後者のリスナーは、mShowStarred フィールドを設定してリストを取り込み直します。
  • 電話帳の Contacts データベースから連絡先を読み取るには、このデータベースに対してクエリーを実行してカーソルを取得する必要があります。このクエリーには以下のパラメーターがあります。
    1. uri — content:// スキームを使用した、取得する連絡先の URI。
    2. projection — 取得する列のリスト。null を渡すと、すべての列が返されます。使用する予定のないデータをストレージから読み取ることがないように、null を渡すことは避けてください。
    3. selection — SQL の WHERE 節 (WHERE 自体は除外) の形式で、取得する行を宣言するフィルター。null を渡すと、指定された URI のすべての行が返されます。
    4. selectionArgsselection に含められている ? は、selection に登場する順に selectionArgs 配列の要素で置き換えられます。これらの値は String としてバインドされます。
    5. sortOrder — SQL の ORDER BY 節のフォーマット (ORDER BY 自体は除外) で、行のソート方法を指定します。null を渡すとデフォルトのソート順が使用されますが、デフォルトのソート方法が指定されていない場合にはソートは行われません。

このようにして取得した結果セットのカーソルは、アダプターを介して UI と関連付ける必要があります。ここでは SimpleCursorAdapter を使用しますが、Android には ListAdapter も用意されています。アダプターを取得して、それを「ListView (リスト・ビュー)」ウィジェットにアタッチすれば作業は完了です。

許可

サンプル・アプリケーションを Android 機器上で正常に実行させるための最後のステップは、許可の設定です。電話帳の Contacts データベースの読み取りが許可されていなければ、機器の Linux カーネルがアプリケーションに読み取り操作を許可しません。したがって、AndroidManifest.xml の「Permissions (許可)」タブに進んで、以下の許可を設定する必要があります。

  1. android.permission.GET_ACCOUNTS
  2. android.permission.READ_CONTACTS

上記を設定するには、U アイコンをクリックして許可を定義します。「Permissions (許可)」タブは、図 10 のようになっているはずです。

図 10. Android の許可マニフェスト
「Permissions (許可)」タブを示すスクリーン・ショット。「android.permission.GET_ACCOUNTS (Uses Permission)」と「android.permission.READ_CONTACTS (Uses Permission)」が設定されています。

ListActivity を使用した「ListView (リスト・ビュー)」ウィジェット

このサンプル・アプリケーションは、「ListView (リスト・ビュー)」ウィジェットを実装するもう 1 つの方法を紹介することを目的としています。上記のアプリケーションでは、メイン・アクティビティーがアクティビティー・クラスを実装していることに注意してください。「ListView (リスト・ビュー)」ウィジェットを扱う際には、ListActivity クラスのほうが重宝する場合があります。それは、このクラスの公開 API がリスト項目上でのクリックを処理して、リスト・アダプターの設定、クリック位置の取得などに対処するためです。

ListActivity を実装するには、リスト 9 に示すようにアクティビティーを変更します。

リスト 9. ListActivity を使用した実装
public class ManageContacts extends ListActivity {
    @Override
    protected void onListItemClick(ListView l, View v, 
int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if(v instanceof TextView)
selectedText.setText(((TextView) v).getText());
}
private CheckBox mCheckBox;
private boolean mShowStarred;
private TextView selectedText;
/** Called when the activity is first created. */
@Override
public void 
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mCheckBox = (CheckBox) findViewById(R.id.showStarred);
selectedText = (TextView) 
findViewById(R.id.selectedContact);
mShowStarred = false;

mCheckBox.setOnCheckedChangeListener(new 
CheckChangedListener());

populateContactList();

}

public void populateContactList() {
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
};
String[] selectionArgs = null;
String sortOrder = 
ContactsContract.Contacts.DISPLAY_NAME +      
" COLLATE LOCALIZED ASC";
String selection = mShowStarred?
ContactsContract.Contacts.STARRED + " ='1'" : null;
Cursor c = 
getContentResolver().query(uri, projection, 
selection, selectionArgs, sortOrder);

String[] fields = new String[] {
ContactsContract.Data.DISPLAY_NAME
};
ListAdapter adapter = new 
SimpleCursorAdapter(this, 
R.layout.contactitem, c, fields, new 
int[]{R.id.contactItem});
setListAdapter(adapter);

}

private class CheckChangedListener 
implements OnCheckedChangeListener {

@Override
public void onCheckedChanged(CompoundButton 
buttonView, boolean isChecked) {
mShowStarred = isChecked;
selectedText.setText("");
populateContactList();
   }
        
    }
}

上記リストでは、クリックを処理するための匿名クラスを宣言する代わりに、単純に ListActivityonListItemClick メソッドを実装していることに注意してください。また、main.xml に定義された「ListView (リスト・ビュー)」ウィジェットを参照する必要もありません。ListActivity は、「ListView (リスト・ビュー)」ウィジェットが @android:id/list という ID で定義されていることを前提とするからです。これは重要な点です。ListActivity を使用する場合には、ID を @android:id/list に設定した「ListView (リスト・ビュー)」ウィジェットを必ず main.xml の中で定義してください。そうでないと、どの「ListView (リスト・ビュー)」ウィジェットを参照すればよいかを ListActivity が認識することができなくなってしまいます。


まとめ

このチュートリアルでは、Android 開発用に Eclipse をセットアップする方法、Android アプリケーションを作成する際のあらゆるステップを支援する Eclipse の充実した機能、そして Android エミュレーター (AVD) ではいかに簡単にアプリケーションをデプロイしてテストできるかについて説明しました。さらに、Hello World アプリケーションを例に、Android アプリケーションの際立った特徴を紹介するとともに、Android アプリケーションを構成するファイルについて解説しました。その後、Android が提供しているウィジェットをいくつか取り上げ、実際のサンプル・アプリケーションでそれぞれのウィジェットの使い方を紹介しました。もうこれで、読者の皆さんは巧妙な UI を備えた素晴らしいアプリケーションの作成に取り掛かれるはずです。その最初のステップとして、連絡先アプリケーションを拡張してリスト項目上でのクリック・アクションを実装し、電話番号と連絡先の詳細、そして選択した連絡先を呼び出すためのボタンを表示してください。それには呼び出しインテントと呼び出しインテント・フィルターも定義して、発信機能を実装する必要もあります。

Android はモバイル・アプリケーションの強力なプラットフォームです。Eclipse で Android 開発ツール (Android Development Tools: ADT) プラグインを使用して Java 技術でコーディングできることから、初心者でも簡単に Android アプリケーションの開発を始めることができます。また、広範なウィジェットが揃っていること、UI 要素を実装に動的にバインドできることから、リッチな UI にも関わらず軽量のアプリケーションを極めて柔軟に作成することが可能です。アクティビティー、インテント、コンテンツ・プロバイダーなどの概念は UI およびデータ要素の管理、これらの要素の間のバインディングの制御を容易にします。Android には多彩なネットワーク API が用意されているので、それについても調べてみてください。さらに、Google API が提供する地図、検索、メールなどの機能はすべて、Android アプリケーションに簡単に組み込むことができます。この素晴らしい Android の世界に飛び込んで、皆さんの想像力を存分に発揮させてください。

参考文献

学ぶために

製品や技術を入手するために

議論するために

  • Eclipse に関する質問を投じる最初の場所として、Eclipse Platform newsgroups があります (このリンクをクリックすると、デフォルト Usenet ニュース・リーダー・アプリケーションが起動され、eclipse.platform が開きます)。
  • Eclipse newsgroups には Eclipse を利用し、拡張することに関心を持つ人達のために、さまざまなリソースが用意されています。
  • developerWorks blogs から developerWorks コミュニティーに加わってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Industries
ArticleID=782712
ArticleTitle=Eclipse と Android ウィジェットを使用した Android アプリケーション開発手法の紹介
publish-date=01062012