Android開発準備 お勉強

2007年11月25日 (日)

HelloWorldのソースコードについて考える 続き

 

前回、HelloWorldのソースコードについて考える で、実際に稼動するHello,Android! からサンプル の使い方を探ろうとしたのですが、いまいち解決しませんでした。

 そもそも、Hello,Android!のサンプル の一行が、まったくわかりませんでした。

       setContentView(R.layout.hello_world);

 この一行について、もう一度よく考えてみます。とりあえず、setContentView()メソッドの引数にR.layout.hello_worldを取っていることは、わかります。 

 setContentView()メソッドは、setText()でセットした文字列をAndroidの画面に表示する役目があるらしい??ので、おそらくR.layout.hello_worldは、「Hello!Android!」のような任意の文字列をセットする役目がありそうです。

 そこで、先ず最初に「R(ラージアール)」について考えてみます。これは何らかの意味を持った記号だと思っていた(思い込んでいた)のですが、某所で質問した所、偉い方々が教えてくれました。(教えて君ですいません。)

229 :デフォルトの名無しさん:2007/11/19(月) 22:28:42
resフォルダにあわせてR.Javaは自動生成される。
中身はリソースID。
235 :デフォルトの名無しさん:2007/11/20(火) 00:23:43
実際に Eclipse で Android プロジェクト作ってみたらすぐわかると思うんだが・・・

236 :デフォルトの名無しさん:2007/11/20(火) 06:37:03
あんまいじめんなや、
237 :デフォルトの名無しさん:2007/11/20(火) 07:39:13
res/layout/ フォルダみりゃ一発で分かると思うんだがなぁ。

238 :228:2007/11/20(火) 07:43:22
>>235-237
ありがとうございます
 
たしかにオートコンパイルされたものを眺めたらわかりそうです
res/layoutなんてのも出来てたんですね
 
239 :デフォルトの名無しさん:2007/11/20(火) 07:46:13
逆だ。res/ の内容をリソースとしてバイナリに変換した際に R.javaがビルドのたびに生成される。

 更にsetContentView(R.layout.hello_world);について強力なヒントが!(つーか、答えそのもの)

233 :デフォルトの名無しさん:2007/11/19(月) 23:17:51
>>232
public class layout {
public class Hello_world implements TextView {
public Hello_workd { setText("Hello, Android"); }
}
public static Hello_world hello_world = new Hello_world();
}
 

ここまで、ヒントもらって、やっとわかったああああああああ!

って言ってもAndroidについてじゃあ、ありません。javaの超基本についてですw。おそらくjavaと言うのは、ツリー型の構造をしていて、ツリーの頂点にjavaの基本となるような機能をもったクラスがあって、そのクラスの下にクラスがどんどんくっついていくような感じじゃないかと。

 調べてみるとありました。Objectクラス

Object クラスは、クラス階層のルートです。すべてのクラスは、スーパークラスとして Object を持ちます。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。

 らしいです。ここから推測するに、AndroidもObjectクラスの木にぶらさがったクラスで、Android自身もAndroidの頂点になるクラスがあって、そのクラスにどんどんAndroid独自の機能をもったクラスがぶら下がっているのではないかと想像できます。

 この考えでいくと、まずはAndroidがどのような設計で、どう動くかをおおまかに知って、それからsetContentView(R.layout.hello_world);については、某所の偉い方々に聞いた通りEclipseのプロジェクト内のディレクトリ構造や自動生成されるファイルを見ればわかるんじゃないかな???

 ところで、実はエクササイズ日本語版)なる練習用サンプルコードが「Hello,Android!」以外にも用意されていることがわかりました。

 次回からは、このエクササイズ日本語版)をやりすすめてみたいと思います。一つのことを深く調べていくのも大事だと思いますが、ある程度の理解で先へすすめてみるのも学習の効率を上げると思うので…

 もちろん、並行してsetContentView(R.layout.hello_world);を理解するため、javaの基本から理解することと、Androidがどのような設計で、どう動くかを考えてみようと思います。

| | コメント (2) | トラックバック (0)

2007年11月21日 (水)

HelloWorldのソースコードについて考える

*この記事はやたら長いですが、初心者が試行錯誤したあげく答えが出ていないので読むと損するかもしれません。初心者があれこれ苦しんでいる姿を見て楽しんでもかまいません。

  

ドキュメントのサンプルコードを動かしてみるサンプルコード を動かそうとしましたが上手くいきませんでした。

 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

| | コメント (0) | トラックバック (0)

2007年11月20日 (火)

ドキュメントのサンプルコードを動かしてみる

 

前回 Androidに関するドキュメント を読めば全てがわかると書きましたが、素人には読めるはずもなく、まずは簡単なサンプルコード を動かそうということに落ち着きました。

 さっそく、Save & Restore Stateというのを動かしてみます。
と言ってもEclipseでプロジェクトを作って、ソースコードを貼り付けるだけです。

 

プロジェクトの作成と同じ要領でSave & Restore Stateプロジェクトを作成します。
そして、SaveRestoreState.javaを開いてSave & Restore Stateにあるソースコードの
package com.google.android.samples.app;」以外、これより下の部分を貼り付けます。

すると

Saverestorestate

動かねえええええええ

赤いバッテンついて動きません

素人にはサンプルコードさえ動かせないと言うのか…

赤いバッテンがつくのは

import com.google.android.samples.R;
setContentView(R.layout.save_restore_state);
((TextView)findViewById(R.id.msg)).setText(R.string.save_restore_msg);
mSaved = (EditText)findViewById(R.id.saved);
return ((EditText)findViewById(R.id.saved)).getText();
((EditText)findViewById(R.id.saved)).setText(text);

以上6箇所、何がおかしいんだよ?
と見てみると初心者の私でもわかる共通点が

「R(ラージアール)」がことごとく入ってる。

こいつが絶対怪しい。つーか、たぶん、これふつうの人ならわかる何かの記号っぽい。
よくよく思い返すと、JSP,Servletの勉強してる時に「E,K,V」なんていう熱力学の第何法則かよ?みたいな大文字が出てきて、実は…

「型パラメータE,K,Vとは?」

 J2SE5.0以降のAPIドキュメントを見ると、データ型の部分にE,K,Vといった文字の大文字のアルファベットが書かれている場合があります。EはElement,KはKey、VはValueを表しています。Element(エレメント、要素)についてはすでに登場した単語ですが、キーやバリュー(値)についても、後ほど登場します。

はじめてのJSP&サーブレットプログラミング
改訂第3版 より引用

なんて、素人には一生かかってもわからないような意味が込められてたりした。
たぶん、このRも何かあるはず。

ちょっと調べてみます。
(つーか、実は昨日一日調べてわからず某所で聞いてヒントもらってまだ調べ中…)

| | コメント (0) | トラックバック (0)

2007年11月19日 (月)

素人がどうやって勉強していけばいいのか?

 とりあえず開発できる環境は整えて、おきまりの「HelloWorld」ならぬ「HelloAndroid」はエミュレーターに表示できたのですが、この先がどうしようも無いです。

 プロのプログラマーならドキュメント を読んで、余裕で理解してガシガシコーディングできるんでしょう。実際、ここ の>124さんはガシガシやってます。

 素人なのでいきなり独自のコーディングは間違った方向に行きそうだし怖いです。良い書籍があればいいのですが、出ているわけもなく…

 と思ったら、さすがGoogle様、サンプルが用意されてました。ここ に色々あります。ゲーム のサンプルとかありますが、ここ のサンプルコードが「HelloWorld」のコードがあることだし簡単そうです。

 と言うことで、暫くはここのサンプルコードを実際に動作させるまでやってみて、やりながら不明な部分をドキュメント を少しづつ調べながら勉強しようと思います。

| | コメント (0) | トラックバック (0)