*この記事はやたら長いですが、初心者が試行錯誤したあげく答えが出ていないので読むと損するかもしれません。初心者があれこれ苦しんでいる姿を見て楽しんでもかまいません。
ドキュメントのサンプルコードを動かしてみるでサンプルコード を動かそうとしましたが上手くいきませんでした。
import com.google.android.samples.R;
setContentView(R.layout.save_restore_state);
あたりの「R(ラージアール)」が怪しいんでは無いかと…
つーか、この部分に対する明らかに私の理解が足りません。と、そこでサンプルコードがあり、更に実際に動作しているソースもあるものを比べて「R」について探ることにしました。
このサイトでも実際に動作させたHelloWorld! がGoogleのドキュメントでプロジェクトの作成から実行まで丁寧に解説されているのでサンプルコードと比較するのに最適です。更に、既にドキュメントが日本語化されています。
それでは、実際に動作するソースコードとサンプルコード を比較してみます。
●実際に動作するソースコード
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
●サンプルコード
public class HelloWorld extends Activity
{
@Override
protected void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.hello_world);
}
}
赤い部分が差異になっています。public と protected は、ただのアクセス修飾子なので気にしなくてもいいとして(いいのか?)、
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
と
setContentView(R.layout.hello_world);
の違いについて考えてみます。この部分がAndroidのエミュレーターに「Hello, Android」と表示する部分と思われます。下のsetContentView(R.layout.hello_world);をAPIリファレンスの何らかのルール、もしくはjavaの開発に慣れた人の共通ルールにのとって動作するように書き換えると上の3行の形になるのでは無いかと推測できます。そのルールを考えてみます。
ちなみにAPIリファレンスの読み方についてはネットで調べたり書籍をあたりましたが、特にこれと言って今回の問題を解決するヒントのようなものはありませんでした。
それでは
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
について一行づつ見ていきます。まずは、
TextView tv = new TextView(this);
これは、TextViewクラスからtvオブジェクトを作っているだけです。ただし、TextViewの引数にthisを取っています。
と、ここまでは素人の私でもわかりますが、そもそもTextViewクラスが何なのか?さっぱりわかりません。たぶん、こういう時にAPIリファレンス見ればいいのかな?
それでは、さっそくAPIリファレンスを見てみます。TOPからReference Information > Class Index と移動するとアルファベットが並んでいて「T」の所にありました。
「TextView
」Displays text to the user and optionally allows them to edit it.
画面にテキストを表示して、オプションでそのテキストを編集させることもできる。とか簡単に説明がついてるようです。
とりあえずTextViewが画面にテキストを表示できるクラスということはわかりましたが、もうちょっと詳しく見てみます。TextViewをクリックするとTextViewの詳細が表示されます。
なんか、ずらーっと英語で並んでいて、記号みたいだし初心者には辛すぎます。クラスと言うのは何かの処理をするメソッドをひとまとめにしたもの(初心者の理解)なので、たぶんTextViewで使用できる各種メソッドの説明があるはずです。
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
のtv.setText("Hello, Android");
の部分はTextViewをオブジェクトにしたtvのメソッドなので、setText("Hello, Android"); のように書いている部分を探してみます。ページ内を検索してみるといろいろ出てくるのですが、なぜかsetText(A); (Aは任意の文字列)のような形のものが見つかりません。
いちばんそれっぽいのがsetText(CharSequence,TextView.BufferType)です。なんかsetText(A,B)みたいな形でsetText(A)の形と微妙に違います。説明に「text to display」とあり、settextなんて言う名前、これは画面に表示する文字を表示用の領域に保存するってこと??
最後にsetContentView(tv);ですが、tv.とかついてないのでHelloWorldの継承したActivityクラスのメソッドっぽいです。APIリファレンスで調べてみるとありました。setContentView
説明は、
Set the activity content to an explicit view. This view is placed
directly into the activity's view hierarchy. It can itself be a complex
view hierarhcy.
なんかview層に渡すだの、何だのそんな意味?この意味はあまりつかめませんが、おそらくここまでの流れから行くとsetContentView(tv);はsetText()でセットした文字列をAndroidの画面に表示する役目があると思われます。
そして、以上の機能が、実際には動作しないサンプルの
setContentView(R.layout.hello_world);
この1行から導きだされるらしいのですが、ここまであれこれやってきたのにさっぱりです。w
もっと調べて出直してきます。(実は、既に某所で聞いてそれをヒントにあれこれ考えたのですが…)
ちなみにこの記事のクラスなどの説明は、より正確な情報がGoogleのドキュメントにあり、すでに日本語化されています。こっちを見ましょう。w