カエルコールアプリを作成する。(3ケロ目)
宛先を選択するときは、下図のダイアログを表示したい。そして、宛先を選ぶとダイアログを閉じる。

しかし、Android ではどうプログラムすればよいのだろうか?そもそも、どんなクラスがあるかもロクに知らないのだから、わかるはずがない。そこでgoogle先生に聞いてみた。「android ダイアログ」・・・。いろいろ調べていくうちに、AlertDialogにListViewを設定すればできそうなことがわかった。
先に結果を載せると、図のダイアログは、次のサンプルコードで実現できる。
package android.sample;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class SampleActivity extends Activity
{
private AlertDialog m_Dlg = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
showDialog();
}
private void showDialog
{
final ArrayList<String> rows = new ArrayList<String>();
rows.add("アドレス帳から選択");
rows.add("びーしむ\nXXX-XXXX-XXXX");
rows.add("びーしむ\nXXX@XXX.XXX");
rows.add("アンドロイドさん\nXXX-XXXX-XXXX");
ListView lv = new ListView(this);
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, rows));
lv.setScrollingCacheEnabled(false);
lv.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> items, View view, int position, long id) {
m_Dlg.dismiss();
Toast.makeText(SampleActivity.this, rows.get(position).toString(), Toast.LENGTH_LONG).show();
}
});
// ダイアログを表示
m_Dlg = new AlertDialog.Builder(this)
.setTitle("宛先を選択")
.setPositiveButton("Cancel", null)
.setView(lv)
.create();
m_Dlg.show();
}
}
このサンプルコードにたどりつくまでに、ハマった個所をメモ。
可変長配列
C++では、std:vectorやstd::listがすぐに思いつくが、javaでこれに対応するものを見つけるのに時間がかかった。(^^;
結論はArrayListを使えばよい(はず)
ListViewの行をクリックしたときに処理を行う。
setOnItemClickListenerの書き方が、見慣れていないので苦労した。
ListView の行をクリックしたときにダイアログを閉じる。
ダイアログを閉じるにはdismiss()を呼べばいいことはわかったが、そのダイアログをどうやってOnItemClickListenerに渡せばいいかわからなかった。サンプルのようにクラスのメンバ変数にして、参照させているが、これは正しい書き方なのだろうか?
一度理解してしまえば、それほど難しい内容ではない。ただし、初めてandroidやjavaのプログラムに挑戦する人にとっては、知らないことばかりなので、かなり時間がかかるんじゃないだろうか。(びーしむは、これを解決するのに何日かかっただろうか。。。)