C:\Documents and Settings\ユーザー名\Local Settings\Tempです。Eclipse本体を解凍するとき(本書25ページ、26ページなどで解説)同様、うんざりするほど長いパスです。ときどき、この長さがWindowsの処理能力を超えて解凍エラーになる...これが、「ソフトウェア更新」中に出される「ナントカ.zipが不正なファイルフォーマット」というメッセージのインストールエラーの原因と考えられます。
そのような場合、「一時フォルダ」の場所を、もっと短いファイルパスに変更してみましょう。
「一時フォルダ」の場所は、環境変数「TEMP」及び「TMP」によって指定されています。環境変数の設定画面を出すには、本書45ページをごらんください。46ページの図3-6には、その長ーい「TEMP」及び「TMP」の値も表示されています。その値を編集して、たとえば
c:\mytempのような短い場所のフォルダに指定します(フォルダは自分で作る必要があります)。「TEMP」も「TMP」も同じ値で構いません。
Eclipse本体は簡単です。もとの「pleiades-all-in-one-.....zip」という圧縮ファイルを展開して「eclipse」フォルダを得て、それを適当なフォルダ名に変更し、適当な場所に置けばよいだけです。
ワークスペースも、やり直すのは簡単です。本書29ページ「作ったプロジェクトの保存場所」で述べたとおり、ワークスペースを変更すればよいだけです。
とはいえ、古いワークスペースにこれまで作ったプロジェクトのうち、活かせるものは再び活かしたいということもあるでしょう。その場合、古いワークスペースのプロジェクトフォルダを新しいワークスペースにただコピーペーストするだけではダメなことがあります。
こういうときは、「インポート」です。Eclipseにファイルやプロジェクトを「インポート」する方法は、本書198ページや218ページで「Silverlight2プロジェクトとして必要な設定も自動で行ってもらうために」実践していますが、「フツーのEclipseプロジェクト」でも同じ方法でできます。
「インポート・ソース」の選択では「既存プロジェクトをワークスペースへ」を選びます。
ルートディレクトリの選択に、古いワークスペースフォルダを選びます。せっかくワークスペースを新しくしたのですから、必要なものだけを少しずつ選ぶとよいでしょう。デフォルトでは古いワークスペースにある全てのフォルダが選ばれます。一度「選択をすべて解除」してからゆっくり選びなおすのがよいと思います。
ただし、「プロジェクトをワークスペースにコピー」を選ばないと、古いワークスペースフォルダに位置したままプロジェクトが編集されます。
まず、「文書(Document)」とはなにか、も押さえておいたほうがよいと思います。「文書」とはWikipediaによると「参照されることを前提として記録される情報」のことだそうです。なるほどヨイ説明です。これに基づくと「XML文書」とは、「他のプログラムが必要とする情報をXML形式で書いたもの」ということになります。普通はある目的を達成するための内容が首尾一貫まとまったものを文書と呼びます。一件のファイルがひとつの文書になる場合も、ファイルの一部分を文書と呼ぶこともあります。ファイルに書かれず、一時的に変数に保存されたりネットワーク経由で送られたりするものも文書と呼ばれます。
XML文書で、一組の開始タグと終了タグの間に書かれた情報を、タグそのものも含めて一単位とし「要素(element)」と呼びます。タグの名前がそのまま要素の名前として呼ばれることが多くあります。たとえば<name>....</name>なら「name要素」になります。
タグの中にさらに開始タグと終了タグの組すなわち要素がある場合、中にあるのを子要素(child)と呼びます。
一方、タグの中にキーワードと値が<要素名 キーワード="値">のように書かれている場合、キーワードを「属性(attribute)」と呼びます。たとえば、<name french="ピエール">の場合、frenchが属性(属性名)、その値が"ピエール"です。値はたとえ数値を表したくても"5"のように二重引用符あるいは単引用符で囲まなければなりません。そのような値をプログラムが読み取るときは一旦文字列として読み取ってから数値変換するのが普通です。
「クラス」とは、「プログラムが動作するために必要と決められた書き方」で、「変数とメソッド」が決められています。「変数」にはすでに値が決められているものも、決まっていないものもあります。「メソッド」は変数名を使ってその処理方法が記述されています。 「オブジェクト」は「クラス」の書き方に従い、クラスで与えられた変数に実際の文字列や数値などの値を代入したものです。プログラムはオブジェクトを操作して進行します。
引数は、メソッド名の後にカッコをつけ、その中に引数名を列記して指示します。実際に使うときは、メソッド名の後のカッコに、引数名の順番に具体的な値を列記します。引数をとらないメソッドにはメソッド名のあとに空のカッコを置くのが、Jvaのキマリです。
MyClassというクラスを作るとします。これはMyClass.javaという名前のファイルに書かなければなりません。MyClass.javaというファイルには「public class MyClass」と「クラス宣言」をして、そのあと「{」と「}」の中にクラスの記述をします。ですから、Javaのソースファイルは必ず最後は「}」で終わらなければなりません。最近は例外もあるかも知れませんが、基本はコレです。一方、「クラス宣言」の前(上)のほうには、後述のパッケージ宣言やインポート宣言を書きます。これらは、逆に「クラス宣言」の中に入れてはいけません。
ただし、あるクラスの内部で使う別のクラスを、そのクラス宣言の中で宣言することもあります。これを「内部クラス」といいます。Androidデータベースプログラミングではこの内部クラスがバッチリ使われます。
パッケージ名は長ければ長いほど他のクラスと競合する懸念が少なくなりますが、プログラム中に書くのが大変になります。そこで、人間が見てもわかりやすいように、短い名前をドット(.)で区切って並べます。この「ドットで区切る」というのがJavaのパッケージ名の唯一のキマリで、その他には特にキマリはありません。でも命名の方針としては、「org.eclipse...」のように開発者の所属する団体名(組織のデカい分類から小さい分類へ書いていくのが慣例)か、「swt.widget...」のようにそのクラスの機能を表す分類、あるいは両者を組み合わせたものが一般的です。
Javaの場合、「パッケージ名」は実際には「プログラムファイルが入っているフォルダの構造」に相当します。「org.eclipse....MyClass」というクラスがあったとしたら、それは「org」というフォルダに入っています。「org」フォルダを開けると「eclipse」フォルダがあって、どんどん開けていった最後に「MyClass.class」というファイルがある、という構造です。
あるパッケージに所属するクラスを記述するソースファイルでは、ファイルの一番最初にパッケージ名を宣言する必要があります。これが「パッケージ宣言」です。
Eclipseでは新しいクラスを作るとき、新規作成の設定画面(ウィザード)でパッケージ名を指定して、ファイルに自動記入してもらいます。
多くの場合同じパッケージに複数のクラスがあって連携しながら動作します。その場合、同じパッケージのクラス同士なら、パッケージ名の指定は不必要です。
他のパッケージのクラスを指定する場合は、パッケージ名を全部書かなければなりません。そうしたクラスを何度も使う場合はめんどくさいので、ファイルの最初のほう(パッケージ宣言の後、自身のクラスを宣言する前)に、パッケージ名を全部書いてこれを使うことを宣言します。これが「インポート宣言」です。
Eclipseでは、「インポート宣言」をしないで他のクラスのクラス名だけを書くと、編集中のその部分にまず「クラスが見つかりません」というエラーが示されます。そうしておいて「このクラスはあのパッケージに所属すると思うんですが、そういうことでインポート宣言を自動記入しましょうか」という提案がなされます。「パッケージに属することがわかっているならエラー表示するな」と言いたいところですが、とにかくこの提案に従えば、インポート宣言は自動でなされます。
実際は、「C」とか「Java」のように「『Windows版SQL』をインストール」のように使う独立した言語ソフトウェアはありません。その「C」とか「Java」のようなプログラムの中で、SQL文を文字列でデータベースソフトウェアに送ります。ですから、ワタシたちが組むプログラムとデータベースソフトウェアの仲立ちをするプログラムが必要です。これを「データベースドライバ」と呼び、データベースソフトウェアとプログラミング言語によって異なるデータベースドライバがあります。本書で学ぶAndroidには、データベースソフトウェアSQLite3と、Javaプログラム用のデータベースドライバが最初から入っています。
リファレンスマニュアルのURLは以下に示すとおりです。
http://developer.android.com/reference/classes.html
<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の実行環境が使います。ですから、この識別名が間違っていると、ビルド(コンパイル)エラーにはなりませんが、実行エラーになります。
なお、「xmlns」はXML name space--名前空間--の意味で、「空間」なんて言われると特殊な世界のような気がしますが、「同じ決まりに従って書かれる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になります。
<?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」要素に加えてしまった場合は、「ラベル」の部分でなく「テキストフィールド」の部分に文字列が表示されてしまうので気をつけましょう。
<EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/label_ini"/>
Androidのプログラムは「Activity」クラスを元に作られるプログラムを単位として構成されます。「ある画面を表示してナニかをする」ことがまとめて記述されるもの、それが「Activity」です。本書では、「WordsList」アクティビティーでデータの一覧表示、「WordsView」アクティビティーで「新規入力」画面と「個々のデータの表示」画面を兼ねています。
では、個々のデータを表示させるにはどのような命令を書けばよいでしょうか。「アクティビティーを開始しなさい」という一般的なメソッドがあって、その但し書きに「WordsViewクラスで書いたアクティビティーだヨ」と書くのがいいでしょう。以下のようなイメージになるはずです。
startActivity(WordsView.class)新規作成画面ならこれでオッケーです。でも「個々のデータを表示」させる場合にはこれでは困ります。「どのデータを表示させるか」という情報がありません。
そこでIntentクラスです。本書では以下のリスト3-52のような方法でIntentクラスのオブジェクトを作りました。
Intent data=new Intent(this, WordsView.class)Intentクラスのオブジェクトの作り方はいろいろあって、本書で扱ったのはそのうちのひとつです。「this」は「今操作しているこのアプリケーションの動作として」というような意味です。それと「WordsView.class」という二つの具体的な値を与えていますから、オブジェクトです。 こうして作成したIntentオブジェクトにはputExtraというメソッドでそうした付加情報を加えてやることができます(本書128ページ)。
startActivity(data)そうすると、開始されたアクティビティーはこのIntentオブジェクトの情報を持っていますから、付加情報を取り出すことができます(本書129ページ)