Javaのリハビリをかねて非常に単純なアプリを作成します。
インプットした値を表示するだけの内容。
http://d.hatena.ne.jp/hkhumanoid/20090117/1232194093
こちらのサイトが非常に平易な解説をしてくれていますのでパクって参考にしてみます。
まずはプロジェクトの作成。
プロジェクト名「DisplayText」、アプリケーション名「DisplayText」、パッケージ名「com.example.display.text」、アクティビティ名「DisplayTextActivity」
ビルドターゲットはGoogleAPIsを選択します。
これAndroid2.1でかつGoogleAPIを使いたいとかだったらどうすればいいんだろう。
というかこのターゲットの違いってどういう意味があるのかわからん。
リンク先ではR.javaがsrc配下にありますが、最近のEclipseではgen配下に作成されます。
このファイルは自動更新され、それどころか任意に編集することができません。
それ以外はだいたい同じ作りのはず。
デフォルトで"Hello world"と表示するアプリが完成していますので、これから改造していきます。
まずはビューであるところの/res/layout/main.xmlを編集。
「レイアウト」編集だとドラッグでボタンを追加したり出来ますが、その配置を自由に移動したりは残念ながら出来ません。
「レイアウト」で部品の設置を行ったあと、「main.xml」で調整を行う流れになるでしょう。
「レイアウト」からとりあえずTextView、EditText、Button、TextViewの順に画面に部品を配置します。
するとmain.xmlにこんなタグが自動的に追加されます。
<TextView android:text="@+id/TextView01" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> <EditText android:text="@+id/EditText01" android:id="@+id/EditText01" android:layout_width="wrap_content" android:layout_height="wrap_content"> </EditText> <Button android:text="@+id/Button01" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> <TextView android:text="@+id/TextView02" android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView>
TextViewはベタテキスト、EditTextが文字入力フォーム(<;input type="text">)、Buttonが押しボタン(<input type="button">)です。
属性値として、textはテキストとして表示する値、idは全ての部品につく部品IDとなります。
値が"@+id/**"とよくわからない値になっていますが、これはJavaがXMLとプログラムの値を付き合わせたりする設定らしいです。
よく見るとR.javaあたりになんか増えてます。
layout_widthとlayout_heightはそのまま表示幅と高さです。
値は"wrap_content"とか"fill_parent"とかの定数なのですが、これらが何処で定義されているのかよくわかりませんでした。
"wrap_content"は必要最小限の幅と高さ、"fill_parent"が横幅いっぱいのようです。
部品が出来たのでプログラム側を作ってみます。
/src/com.example.display.text/DisplayTextActivity.java
package com.example.display.text; public class DisplayTextActivity extends Activity { private Button button; private EditText text; private TextView display; }
まずは使用するインスタンス変数を追加しただけ。
一行書くごとにエラーが出ますが、エラーが出たところにカーソルを持っていくと、解決策として該当クラスをインポートしてくれます。
Buttonって書くだけで勝手にimport android.widget.Button;を出してくれるとか便利すぎる。
ちなみに元ソースにあるinfoは使用していないので不要です。
あってもかまいませんが、最近のIDEだと使ってないぞとNoticeが出ます。
次にデフォルトのonCreate()を変更。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 各種コンポーネント button = (Button) this.findViewById(R.id.Button01); text = (EditText) this.findViewById(R.id.EditText01); display = (TextView) this.findViewById(R.id.TextView02); // クリックイベント button.setOnClickListener(new MyClickAdapter()); }
setContentView(R.layout.main);はビューとして/res/layout/main.xmlを適用するという意味の決まり文句です。
IDの値が"@+id/EditText01"であれば、それを見つける方法はActivity.findViewById(R.id.EditText01)となります。
JavaScriptで言うところのdocument.getElementByIdみたいなものでしょうか。
さて、ButtonやTextViewなんかはViewクラスを継承していますが、View.setOnClickListener()というリスナーインターフェイスがあります。
OnClickListenerインターフェイスを実装したクラスを突っ込むと、クリック時にOnClickListener.onClick()メソッドを実行してくれます。
MyClickAdapterクラスを突っ込むことにしたので、実装を行います。
// クリック実装 private class MyClickAdapter implements OnClickListener { @Override public void onClick(View v) { Editable value = text.getText(); display.setText("こんにちは、" + value + "さん。"); } }
Editableってなんかよくわからないんですが、EditText.getText()がEditableで返ってくるみたいです。
Textって名前なのにStringじゃないのか。
で、これをこのままコピペしたところpublic void onClick(View v)でコンパイルエラーが発生しました。
public static interface OnClickListener{ public abstract void onClick(View view); }
> 型 DisplayTextActivity.MyClickAdapter のメソッド onClick(View) はスーパークラスのメソッドをオーバーライドする必要があります
え?
いやいやオーバーライドしてるじゃん。
解決策として表示されるのが、
> '@Override'注釈を除去します
なぜ???
http://d.hatena.ne.jp/waman/20090421/1240325650
> インターフェースに宣言されているメソッドをオーバーライドする際にも @Override アノテーションを使えるように拡張されました
> Java SE 6 から@Override アノテーションを付加することが可能になったのは、拡張される型 (super) がインターフェースの場合です(黄色い部分)。
実はできないので正解だった。
ということで'@Override'を削除して完成。
実行すると入力フォームとボタンが現れ、ボタンを押すと「ようこそ○○さん」と表示するフォームが完成しました。