Hatena::ブログ(Diary)

脱エンタープライズ志向 このページをアンテナに追加 RSSフィード

2009-01-17

第1回Androidプログラミング 〜Rクラスとかmain.xmlやstrings.xmlってなんなの?って思っているあなた!これをみればAndroidプログラミングはできる〜

| 21:08 | 第1回Androidプログラミング 〜Rクラスとかmain.xmlやstrings.xmlってなんなの?って思っているあなた!これをみればAndroidプログラミングはできる〜 - 脱エンタープライズ志向 を含むブックマーク

前回はADTEclipseプラグインインストールし、Hello World的なアプリを作成したけど、今回はプロジェクトの作り方からここのファイルの役割等、わかるところまで作りながら一緒に解説する。

Androidプロジェクト作成

Eclipseを起動し、Androidプロジェクトを作成。今回はテキストフィールドに入力された文字をボタンをクリックしたときにラベルに表示するという簡単なアプリだけど前回よりは複雑だろう。

f:id:hkhumanoid:20090117212539j:image

これはAndroidプロジェクトを作成するときの画像

f:id:hkhumanoid:20090117214118j:image

実際に作られたのが、こんな階層を持つプロジェクト。今回のテーマが早速出てきた。

  • sample.hkhumanoid.DisplayTextData.java : Activity継承クラス
  • sample.hkhumanoid.R,java : main.xmlやstrings.xmlに定義した要素を識別するIDを定義
  • res/drawable/ : 画像ファイル格納場所
  • res/layout/ : レイアウトに関するxmlファイル格納場所
  • res/values/ : 各種の値を設定するxmlファイル格納場所
  • AndroidManifest.xml : androidマニフェストファイル。androidアプリの実行に必要な情報を設定

まずAndroidManifest.xmlはなんなの?


<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="sample.hkhumanoid" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".DisplayTextData"

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> </manifest>

この設定はプロジェクトを作成したときに自動生成されるもので、利用者は触る必要はない。

main.xmlはなんなの?


<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" /> </LinearLayout>

LinearLayoutはLinearLayoutクラスというのがあり、ただ「レイアウト」を指定しているだけ。LinearLayoutの子にTextViewがあるがこれはLabelを設定している。属性についてはこのとおり。

orientation : レイアウトの方向
layout_width : 横幅の指定
layout_height : 縦幅の指定
text : 表示テキストの指定

レイアウトにさらに詳しいサイトは、UIのレイアウトを参考に

strings.xmlってなんなの?


<resources>
    <string name="hello">Hello World, DisplayTextData</string>
    <string name="app_name">display text data</string>
</resources>

デフォルトのstrings.xmlは2つ。app_nameはプロジェクト作成する際に決めたアプリケーション名が設定されている。helloはデフォルトからあるhello world的な文字列。string要素のname属性は変数みたいなもの。これはRクラスに変数として用意されていて、それをDisplayTextDataクラスで利用することにより、画面に表示することができる。

DisplayTextDataクラスってなんなの?

package sample.hkhumanoid;

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

public class DisplayTextData extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

デフォルトは自動生成されたコードがかかれているが、onCreateで画面初期表示を行っている。親クラスのonCreateを呼んでから、setContentViewメソッドを呼んでいる。setContentViewに渡しているR.layout.mainとなっているのはres/layout/main.xmlを指している。で、main.xmlで設定している内容はというと、記憶に新しい先ほど解説した内容だ。

ここまでに説明したのはデフォルトでここからボタンを追加したり、テキストを追加したりって色々プログラミングが必要だけど、ここで一息ついてからにしようと思う。

20090118 0:50加筆

さてさてあれから少し休憩したので早速本題へ。コードを見る前に結果の画面はこれ。

f:id:hkhumanoid:20090118005227j:image入力前f:id:hkhumanoid:20090118005226j:image入力後

とてもシンプルなアプリなだけあって、手を加えた部分だけここに記すことができる。まずは

main.xmlレイアウトを行う。

main.xml


<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:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/info" /> <EditText

android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button

android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/click" /> <TextView

android:id="@+id/display" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

TextViewはテキストフィールドではなく、ラベル。EditTextがテキストフィールドにあたるもの。Buttonはそのままボタンを表示する。中でもポイントなのがandroid:idであり、コンポーネントをユニークにする設定を行う。で、値が@+id/textとなっているが、@id+/ってなに?と思うかもしれないが、ここは(というより今は)機械的にこうしておこう。/(スラッシュ)の後に、ユニークになる値を設定。(これはjava側でコンポーネントを取得する際にキーとして使用)

そして、そのjava側であるDisplayTextDataクラスを見る

DisplayTextData.java

package sample.hkhumanoid;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class DisplayTextData extends Activity {

	private Button button;
	private EditText text;
	private TextView info;
	private TextView display;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 各種コンポーネント
		button = (Button) this.findViewById(R.id.button);
		text = (EditText) this.findViewById(R.id.text);
		info = (TextView) this.findViewById(R.id.info);
		display = (TextView) this.findViewById(R.id.display);

		// クリックイベント
		button.setOnClickListener(new MyClickAdapter());
	}

	// クリック実装
	private class MyClickAdapter implements OnClickListener {
		@Override
		public void onClick(View v) {
			Editable value = text.getText();
			display.setText("こんにちは、" + value + "さん。");
		}
	}
}

各種コンポーネント追加実装とクリック実装を追加したのみ。JavaSwingみたいな実装方法なのでSwingをかじったことでもあるような方は入りやすいと思う。ポイントは以下のとおりで、これでjava側は終了

  • this.findViewByIdメソッドでmain.xmlに設定したコンポーネントをid指定で取得する(android:id="@+id/text"のtextを指定)
  • クリックイベントを実装
  • 取得したボタンコンポーネントに実装したクリックイベントを設定する

ちなみに注意点はgetTextではStringを返すのではなく、Editableという点。でもStringと同様に扱えるようになっているので特に注意を払う必要はないかな。

後はstrings.xmlリソースは直接main.xmlに書くことも可能だけど(android:text="ここに直接書くことも可能")、strings.xmlに外だしした。

strings.xml


<resources>
    <string name="app_name">display text data</string>
    <string name="info">名前を入力してください。</string>
    <string name="click">クリックしてください。</string>
</resources>

これは前回解説したように表示する内容を記述しているだけ。たったこれだけでモバイルアプリができるなんて簡単だね。いい忘れていたけど、Rクラスは自力で書かなくてもOK。実はmain.xmlやstrings.xmlを更新すると勝手にRクラスを更新してくれるんだ。だからRクラスのわけのわからないIDの値は自分でいじらないように。

今日は(厳密には昨日)初めてモバイルアプリを作ったけど、実際に使えるアプリというのはもっと複雑であると思う。でも今のうちから少しずつコーディングする力を身につけて、徐々に自分の作りたいアプリを作って行きたいと思う。

Google Android用携帯アプリ作成の準備

| 20:25 | Google Android用携帯アプリ作成の準備 - 脱エンタープライズ志向 を含むブックマーク

iphoneが発売され携帯アプリの可能性が大きく膨らんだ世の中だけど実際の利用率はいかほどなのだろうか。(時間があれば調べてみたい)しかし、利用率はここではあまり気にしないでおこう。またiphoneではSDKオープンソースになって、モバイルアプリの開発が一般的に可能になった。また同時期にAR(拡張現実)に関する技術「セカイカメラ」に衝撃を受けたこともあり、モバイルアプリの将来性は高いなと感じた。このセカイカメラの影響も受け、自分もARアプリを作ろうと丁度そのときに良いアイデアが浮かんだのだが、実現にはBluetoothの利用が必要でありiphoneSDKのAPIをさらってみたが今のところ見つかっていない。その他の実現方法を探しているところGoogleAndroidでは"将来的に"BluetoothAPIを組み込むみたいなので、これはいいっ!と思いAndroidに乗り出した。(言語もJavaなので丁度よかった)

ADTEclipseプラグインインストーーール

Google Android用携帯アプリ作成のための基礎知識を参考にやってみた。

自分の環境は以下のとおり

ここで紹介することはあまりない(笑)初めて携帯アプリの環境を整えたけど、Google Android用携帯アプリ作成のための基礎知識を1つずつゆっくりみたいくだけで、Hello World, SampleAndroid表示までたどり着けた。

とりあえず良さげなサイトをピックアップ

androidアプリの基本形とは?

Androidアプリ開発を始めたい!!

Androidアプリ上でネイティブアプリをインストールして動かす

AndroidでC言語で書いたネイティブアプリを動かしてみる

次回はもう少し複雑なアプリを作ってみようと思う。

CoolAppCoolApp 2015/04/08 12:26 はじめまして!
無料でアプリを簡単に作成できるツールを公開中です。
よかったらぜひお試しください(^^)
また遊びにきます!
アプリ&ブログがんばってくださーい
クールアプリ(http://www.coolapp.jp)