「はじめてのEclipse3」著者サポートページ

工学社刊「はじめてのEclipse3」の著者によるサポートページです。本書で書ききれなかったこと、それからなるべくないほうがよいのですが本書にもし間違いがあった場合その訂正等を書いていきます。参考にしていただければ幸いです。 清水 美樹

全体的なこと

Android編


全体的なこと


「ナントカ.zipが不正なファイルフォーマット」と言われてソフトウェア更新がエラー

最近(バージョン3.2以降)のEclipseのプラグインは、ほとんどがEclipseの「ソフトウェア更新」機能を用い、指定されたWebサイトから自動でダウンロード・インストールするしくみになっています。本書で用いたAndroid, JavaFX, Silverlight用のプラグインも全てその方法です。
これは、プラグインの「zipファイル」を「一時フォルダ」にダウンロードして解凍し、Eclipseのプラグインフォルダにコピーするものです。
しかし、このzipファイルも、大変長い名前のファイルからできていることが多々あります。
そんなとき、Windows XPの一時フォルダのデフォルトと言えば
C:\Documents and Settings\ユーザー名\Local Settings\Temp
です。Eclipse本体を解凍するとき(本書25ページ、26ページなどで解説)同様、うんざりするほど長いパスです。ときどき、この長さがWindowsの処理能力を超えて解凍エラーになる...これが、「ソフトウェア更新」中に出される「ナントカ.zipが不正なファイルフォーマット」というメッセージのインストールエラーの原因と考えられます。

そのような場合、「一時フォルダ」の場所を、もっと短いファイルパスに変更してみましょう。

「一時フォルダ」の場所は、環境変数「TEMP」及び「TMP」によって指定されています。環境変数の設定画面を出すには、本書45ページをごらんください。46ページの図3-6には、その長ーい「TEMP」及び「TMP」の値も表示されています。その値を編集して、たとえば

c:\mytemp
のような短い場所のフォルダに指定します(フォルダは自分で作る必要があります)。「TEMP」も「TMP」も同じ値で構いません。

図1 短い場所のフォルダに指定した例

Eclipseそのものや、ワークスペースを最初からやり直したい

Eclipse本体の設定やワークスペースの内容がなんだかゴチャゴチャになってしまった、もう一度キレイに出直したい、ということがあるかも知れません。

Eclipse本体は簡単です。もとの「pleiades-all-in-one-.....zip」という圧縮ファイルを展開して「eclipse」フォルダを得て、それを適当なフォルダ名に変更し、適当な場所に置けばよいだけです。

ワークスペースも、やり直すのは簡単です。本書29ページ「作ったプロジェクトの保存場所」で述べたとおり、ワークスペースを変更すればよいだけです。

とはいえ、古いワークスペースにこれまで作ったプロジェクトのうち、活かせるものは再び活かしたいということもあるでしょう。その場合、古いワークスペースのプロジェクトフォルダを新しいワークスペースにただコピーペーストするだけではダメなことがあります。

こういうときは、「インポート」です。Eclipseにファイルやプロジェクトを「インポート」する方法は、本書198ページや218ページで「Silverlight2プロジェクトとして必要な設定も自動で行ってもらうために」実践していますが、「フツーのEclipseプロジェクト」でも同じ方法でできます。

「インポート・ソース」の選択では「既存プロジェクトをワークスペースへ」を選びます。

図2 「既存プロジェクトをワークスペースへ」

ルートディレクトリの選択に、古いワークスペースフォルダを選びます。せっかくワークスペースを新しくしたのですから、必要なものだけを少しずつ選ぶとよいでしょう。デフォルトでは古いワークスペースにある全てのフォルダが選ばれます。一度「選択をすべて解除」してからゆっくり選びなおすのがよいと思います。
ただし、「プロジェクトをワークスペースにコピー」を選ばないと、古いワークスペースフォルダに位置したままプロジェクトが編集されます。

図3 欲しいものを少しずつ選ぼう。多くは「プロジェクトをワークスペースにコピー」するのがよい


XML文書、要素、属性

本書のXML文書の説明においては「要素」「属性」などの単語を特に説明せずに使っていますが、その意味をごく簡単に説明しましょう。

まず、「文書(Document)」とはなにか、も押さえておいたほうがよいと思います。「文書」とはWikipediaによると「参照されることを前提として記録される情報」のことだそうです。なるほどヨイ説明です。これに基づくと「XML文書」とは、「他のプログラムが必要とする情報をXML形式で書いたもの」ということになります。普通はある目的を達成するための内容が首尾一貫まとまったものを文書と呼びます。一件のファイルがひとつの文書になる場合も、ファイルの一部分を文書と呼ぶこともあります。ファイルに書かれず、一時的に変数に保存されたりネットワーク経由で送られたりするものも文書と呼ばれます。

XML文書で、一組の開始タグと終了タグの間に書かれた情報を、タグそのものも含めて一単位とし「要素(element)」と呼びます。タグの名前がそのまま要素の名前として呼ばれることが多くあります。たとえば<name>....</name>なら「name要素」になります。

タグの中にさらに開始タグと終了タグの組すなわち要素がある場合、中にあるのを子要素(child)と呼びます。

一方、タグの中にキーワードと値が<要素名 キーワード="値">のように書かれている場合、キーワードを「属性(attribute)」と呼びます。たとえば、<name french="ピエール">の場合、frenchが属性(属性名)、その値が"ピエール"です。値はたとえ数値を表したくても"5"のように二重引用符あるいは単引用符で囲まなければなりません。そのような値をプログラムが読み取るときは一旦文字列として読み取ってから数値変換するのが普通です。


クラスとオブジェクト

Androidは生Java、JavaFXは「最終的にJavaプログラムに翻訳されるスクリプト」、Silverlight2はC#で書かれますが、いずれも「クラス」を定義し、「そのクラスのオブジェクト」を生成させるプログラムを書きます。

「クラス」とは、「プログラムが動作するために必要と決められた書き方」で、「変数とメソッド」が決められています。「変数」にはすでに値が決められているものも、決まっていないものもあります。「メソッド」は変数名を使ってその処理方法が記述されています。 「オブジェクト」は「クラス」の書き方に従い、クラスで与えられた変数に実際の文字列や数値などの値を代入したものです。プログラムはオブジェクトを操作して進行します。


メソッドと引数

クラスは「書き方」を示すものですから、クラスの中で「メソッド」を定義するときにも、具体的な処理対象の値は書けません。その部分を、適当な変数名で置き換えて式を示します。この変数を引数と呼びます。

引数は、メソッド名の後にカッコをつけ、その中に引数名を列記して指示します。実際に使うときは、メソッド名の後のカッコに、引数名の順番に具体的な値を列記します。引数をとらないメソッドにはメソッド名のあとに空のカッコを置くのが、Jvaのキマリです。


Javaのファイルはクラス単位

クラスとオブジェクトはいろいろなプログラミング言語で採用した考えですが、Javaでは必ず、ひとつのクラスをひとつのファイルに書くキマリになっています。

MyClassというクラスを作るとします。これはMyClass.javaという名前のファイルに書かなければなりません。MyClass.javaというファイルには「public class MyClass」と「クラス宣言」をして、そのあと「{」と「}」の中にクラスの記述をします。ですから、Javaのソースファイルは必ず最後は「}」で終わらなければなりません。最近は例外もあるかも知れませんが、基本はコレです。一方、「クラス宣言」の前(上)のほうには、後述のパッケージ宣言やインポート宣言を書きます。これらは、逆に「クラス宣言」の中に入れてはいけません。
ただし、あるクラスの内部で使う別のクラスを、そのクラス宣言の中で宣言することもあります。これを「内部クラス」といいます。Androidデータベースプログラミングではこの内部クラスがバッチリ使われます。


パッケージ宣言、インポート宣言

世の中実に多くの人がいろいろなクラスを作りますから、それが公開されたときクラスの名前が競合するのを防ぐために、クラスに所属名をつけます。Javaの場合これを「パッケージ名」と呼びます。

パッケージ名は長ければ長いほど他のクラスと競合する懸念が少なくなりますが、プログラム中に書くのが大変になります。そこで、人間が見てもわかりやすいように、短い名前をドット(.)で区切って並べます。この「ドットで区切る」というのがJavaのパッケージ名の唯一のキマリで、その他には特にキマリはありません。でも命名の方針としては、「org.eclipse...」のように開発者の所属する団体名(組織のデカい分類から小さい分類へ書いていくのが慣例)か、「swt.widget...」のようにそのクラスの機能を表す分類、あるいは両者を組み合わせたものが一般的です。

Javaの場合、「パッケージ名」は実際には「プログラムファイルが入っているフォルダの構造」に相当します。「org.eclipse....MyClass」というクラスがあったとしたら、それは「org」というフォルダに入っています。「org」フォルダを開けると「eclipse」フォルダがあって、どんどん開けていった最後に「MyClass.class」というファイルがある、という構造です。

あるパッケージに所属するクラスを記述するソースファイルでは、ファイルの一番最初にパッケージ名を宣言する必要があります。これが「パッケージ宣言」です。
Eclipseでは新しいクラスを作るとき、新規作成の設定画面(ウィザード)でパッケージ名を指定して、ファイルに自動記入してもらいます。

多くの場合同じパッケージに複数のクラスがあって連携しながら動作します。その場合、同じパッケージのクラス同士なら、パッケージ名の指定は不必要です。
他のパッケージのクラスを指定する場合は、パッケージ名を全部書かなければなりません。そうしたクラスを何度も使う場合はめんどくさいので、ファイルの最初のほう(パッケージ宣言の後、自身のクラスを宣言する前)に、パッケージ名を全部書いてこれを使うことを宣言します。これが「インポート宣言」です。
Eclipseでは、「インポート宣言」をしないで他のクラスのクラス名だけを書くと、編集中のその部分にまず「クラスが見つかりません」というエラーが示されます。そうしておいて「このクラスはあのパッケージに所属すると思うんですが、そういうことでインポート宣言を自動記入しましょうか」という提案がなされます。「パッケージに属することがわかっているならエラー表示するな」と言いたいところですが、とにかくこの提案に従えば、インポート宣言は自動でなされます。


SQL文

SQLとはもともと「Structured Query Language」の略で、筆者はよく「Standard...」と間違えて赤ッ恥をかきますが、いずれにしろ今は「エスキューエル」が正式名になりましたからまあ関係ないでしょう。これは「データベースソフトウェアとデータのやりとりをするときはこの言語を使う」と標準として決められている言語です。ただしデータベースの歴史は古いので、データベースソフトウェアによって少しずつ違うこともありますから、そのデータベースソフトウェアのマニュアルなどでよく確認することが必要です。

実際は、「C」とか「Java」のように「『Windows版SQL』をインストール」のように使う独立した言語ソフトウェアはありません。その「C」とか「Java」のようなプログラムの中で、SQL文を文字列でデータベースソフトウェアに送ります。ですから、ワタシたちが組むプログラムとデータベースソフトウェアの仲立ちをするプログラムが必要です。これを「データベースドライバ」と呼び、データベースソフトウェアとプログラミング言語によって異なるデータベースドライバがあります。本書で学ぶAndroidには、データベースソフトウェアSQLite3と、Javaプログラム用のデータベースドライバが最初から入っています。


Android編


Androidリファレンスマニュアルの場所変更(本書97ページ)

最近、上記のURLが変更になりました。「http://code.google.com/intl/ja/android/reference/index.html」ページはもう存在しないようです。

リファレンスマニュアルのURLは以下に示すとおりです。

http://developer.android.com/reference/classes.html


xmlns:android="http://schemas.android.com/apk/res/android"とは(本書62ページ)

「main.xml」など、Androidのレイアウトを記述しておくXMLファイルの大枠について、本書リスト3-2に以下のような要素を挙げました。
本書におけるリスト3-2「全体のレイアウト」
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
たくさんのことが書いてありますが、結局は<LinearLayout>という開始タグで、ファイルの終わりの</LinearLayout>とペアになっています。

そのリスト3-2のxmlns:android="http://schemas.android.com/apk/res/android"というのは何でしょうか?
本書では長くなるので説明を省きましたが、気になった人もいるのではないでしょうか。

これはものすごく手っ取り早く説明しますと、これらのXMLファイルに頻繁に出てくる「android:ナニナニ」という書き方の「識別名」です。
さらに手っ取り早く説明しますと、これらの識別名はAndroidの実行環境が使います。ですから、この識別名が間違っていると、ビルド(コンパイル)エラーにはなりませんが、実行エラーになります。


なぜインターネットURLのような書式なのか
XMLはなにせただのタグですから、同じような要素や属性の名前でXMLファイルを書き、別のプログラムで別の目的のために利用する人が他にいるかも知れません。そのため、Androidプログラムで使うXML文なんだヨと、識別名をつけるのです。
でも、いい加減な識別名だとそれまで偶然同じことになってしまわないとも限りません。そこで識別名が「世界にひとつしかない」という保証をつけます。それがもっとも簡単に得られるのが「WebサイトのURL」です。WebサイトのURLは「ICANN」日本では「JPNIC」という団体を筆頭にした管理系統で、「世界にひとつ」になるように管理されているからです。そのURLアドレスに実際にブラウザで見られるWebページなどは、ある場合もない場合もあります。

なお、「xmlns」はXML name space--名前空間--の意味で、「空間」なんて言われると特殊な世界のような気がしますが、「同じ決まりに従って書かれるXML文のグループ」と考えればよいと思います。


本書65ページから66ページのわかりにくい部分

上記2ページ、具体的なコードを示していないので、わかりにくいです。すみません。
本書65ページの5行目(空白行は除く)の「結果的に、リスト3-5のコードが二組できることになります」という時点での「main.xml」ファイルの全文は、リスト3-5-1です。

リスト3-5-1「結果的にリスト3-5のコードが二組できた」時点での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"
>
    
<LinearLayout android:orientation="horizontal"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">

		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content"/>
		<EditText 
		  android:layout_width="wrap_content"
			android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout android:orientation="horizontal"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">

		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content"/>
		<EditText 
		  android:layout_width="wrap_content"
			android:layout_height="wrap_content"/>

</LinearLayout>


</LinearLayout>


また、66ページのリスト3-8を書いた時点での「main.xml」ファイルの全文はリスト3-8-1になります。

リスト3-8-166ページのリスト3-8を書いた時点での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"
>
    
<LinearLayout android:orientation="horizontal"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">

		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="@string/label_ini" />
		<EditText 
		  android:layout_width="wrap_content"
			android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout android:orientation="horizontal"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">

		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="@string/label_word" />
		<EditText 
		  android:layout_width="wrap_content"
			android:layout_height="wrap_content"/>

</LinearLayout>


</LinearLayout>


なお、リスト3-8-1の太字部分を間違ってリスト3-8-2のように「EditText」要素に加えてしまった場合は、「ラベル」の部分でなく「テキストフィールド」の部分に文字列が表示されてしまうので気をつけましょう。

リスト3-8-2 「android:text」という「属性」を「EditText」要素に加えてしまうと
<EditText 
	 android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:text="@string/label_ini"/>

図4 「テキストフィールド」の中に表示されてしまう


チラリと見えるステキな画面

Androidプログラムの作成が進んで来るにつれ、エミュレータで実行すると図5のような画面が見えることがあります。
図5 面白そうな画面

コレこそがAndroidの「ようこそ画面」です。でも、ワレワレのアプリケーションの実行画面ではありません。ワレワレはEclipseを通じて、エミュレータが起動したら即開発中のアプリケーションを実行するように操作しています。でもアプリケーションが複雑になるとちょっと時間がかかり、その間このようこそ画面が表示されるのです。ですから、ちょっと待てば、無愛想ではありますが自分でゼロから作ったアプリケーションの画面に切り替わります。
また、自分でゼロから作ったアプリケーションが失敗して、94ページ図3-55のようなエラー画面が出てしまった場合、エミュレータを閉じてしまってもいいのですが「Force Close」ボタンをクリックすると、エミュレータは起動したままこのようこそ画面が現れます。せっかくですからいろいろ操作して憂さを晴らすのもよいでしょう。


superって何だ

Eclipseで自動記入されるコードのメソッドの中によく「super」という語が出てきます。これは、「継承元(スーパー)クラスの同じ名前のメソッドをそのまま用いなさい」という意味です。
Androidプログラミングでは、すでに用意されているクラスを用いて(継承)自分のクラスを作ることが非常に多くあります。あるクラスを継承すると、その継承元クラスのメソッドも無条件で使えますが、そのメソッドの一部または全部を書き直す(再定義)することもできます。特に、「継承元のメソッドとおんなじことをやった上にさらに別のことをやる」ような書き直し方であれば、「おんなじこと」は「super」と書くことができます。

Intentって何だ

本書113ページに「Intentとは、Androidアプリケーションに用意されているクラスで、ひとまとまりの処理における操作とデータの情報というようなもの」と書きました。もうちょっと説明しましょう。

Androidのプログラムは「Activity」クラスを元に作られるプログラムを単位として構成されます。「ある画面を表示してナニかをする」ことがまとめて記述されるもの、それが「Activity」です。本書では、「WordsList」アクティビティーでデータの一覧表示、「WordsView」アクティビティーで「新規入力」画面と「個々のデータの表示」画面を兼ねています。
では、個々のデータを表示させるにはどのような命令を書けばよいでしょうか。「アクティビティーを開始しなさい」という一般的なメソッドがあって、その但し書きに「WordsViewクラスで書いたアクティビティーだヨ」と書くのがいいでしょう。以下のようなイメージになるはずです。

startActivity(WordsView.class)
新規作成画面ならこれでオッケーです。でも「個々のデータを表示」させる場合にはこれでは困ります。「どのデータを表示させるか」という情報がありません。

そこでIntentクラスです。本書では以下のリスト3-52のような方法でIntentクラスのオブジェクトを作りました。

リスト3-52 Intentクラスのオブジェクトを作成
Intent data=new Intent(this, WordsView.class)
Intentクラスのオブジェクトの作り方はいろいろあって、本書で扱ったのはそのうちのひとつです。「this」は「今操作しているこのアプリケーションの動作として」というような意味です。それと「WordsView.class」という二つの具体的な値を与えていますから、オブジェクトです。 こうして作成したIntentオブジェクトにはputExtraというメソッドでそうした付加情報を加えてやることができます(本書128ページ)。
こうして三種類の情報(thisとWordsView.classと付加情報)を与えられたIntentオブジェクト「data」を使って以下をやるのです。
startActivity(data)
そうすると、開始されたアクティビティーはこのIntentオブジェクトの情報を持っていますから、付加情報を取り出すことができます(本書129ページ)