Tuesday, September 21, 2010
Android の アプリコーディングは結構楽しいです。はじめて JavaのAWTにふれたときのわくわく感がよみがえってきます。
環境の構築が面倒なのですが、それさえ済んでしまえばコーディングからとりあえずテストとして実機へのデイプロイまで含めてとても簡単にできます。これはすごい。
GUIはXMLで記述します。
一方でコントロールは普通にJavaでコーディングするので、
このGUIで宣言した部品のインスタンスをどうやってとればいいのか、という話。
findViewById() メソッドを使えばOK.
<EditText android:id="@+id/text"
android:layout_width="240dip"
android:layout_height="wrap_content"
android:text="" />
というXMLによるGUI設定をしている場合は、
android.widget.EditText et = (EditText)findViewById(R.id.text);
でインスタンスを取得できます。
Viewのコンストラクタでこのコードを実行しても null 値しかかえってこないので注意。まだその段階ではインスタンス化されていないのでしょう。Viewの onCreate() などのメソッド内で call すればOK.
これは android.content.Context クラスの openFileInput(),openFileOutput() メソッドを使うと便利。それぞれ、java.io.FileInputStream, java.io.FileOutputStream のインスタンスが返ってきます。
テキストデータを保存する場合は、(Contextのサブクラスの場合...)
String enc = "UTF-8";
String text = "hogehoge"
PrintWriter pw = new PrintWriter( new OutputStreamWriter( this.openFileOutput('test.txt',MODE_PRIVATE ),enc) );
pw.println(text);
pw.close();
Context.MODE_PRIVATE は書き込みオプションのようなものです。ほかのアプリから読み出し禁止にする場合は、MODE_PRIVATE を使用。その他のオプションについては、Javadoc の android.content.Context クラスを参照。
読み出す場合は、こんな感じで。
String enc = "UTF-8";
BufferedReader br = new BufferedReader( new InputStreamReader( this.openFileInput(),enc ) )
String line = null;
while( (line=br.readLine())!=null ){
//
}
br.close();
ネットに接続し情報を取得して表示、という場合 スレッドは必須。スレッドなしで書いていると、実機では、アプリがハングしたと見なされる場合もある。
Swingなら SwingUtilities.invokeLater() とするところだが、Android でもほとんど同じようにコーディングする。(ただし android.os.Handler の postメソッドを使う)
Handler handler= new Handler();
private void updateView(){
Runnable r = new Runnable(){
public void run(){
// ネット接続して情報を取得する等
// スレッドとして実行したいの処理を記述
}
}
handler.post(r);
}
MindBoard は 直観的な操作で簡単にマインドマップを描くことができる Android タブレット用アプリです。