リストを表示して選択させる形式のダイアログを表示するケースで、数種類の画面で動的に変化
したり、同じようなリストだが並びが違うなどのケースで、
ダイアログ生成を数か所で同じようなコードを書くのがとてもセンスないと思ったので、
抽象化やインターフェースの切り出しを行ってみた。
import android.content.Context;
/**
* Selector. リスト選択形式ダイアログ選択インターフェース
*/
public interface Selector{
public void exec(Context context,Object...params);
}
---------------------------------------------------------------------
import android.content.DialogInterface.OnClickListener;
/**
* SelectorItem. リスト選択形式ダイアログ インターフェース
*/
public interface SelectorItem{
/**
* @return 表示するタイトルを返す(不要なら null を返す)
*/
public String title();
/**
* @return リスト選択で表示するアイコンの drawable ID を返す(不要なら null を返す)
*/
public Integer icon();
/**
* @return リスト選択形式ダイアログ表示文字列リストを返す
*/
public String displays();
public OnClickListener createListner();
}
---------------------------------------------------------------------
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
/**
* SelectorList. リスト選択形式ダイアログ表示抽象クラス
*/
public abstract class SelectorList implements SelectorItem{
protected Context context;
protected Object params;
public abstract Selector asigneExecutor();
public SelectorList(Context context,Object...params){
this.context = context;
this.params = params;
}
@Override
public OnClickListener createListner(){
return new OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
asigneExecutor()[which].exec(context,params);
}
};
}
}
----------------------------------------------------------------------
import android.app.AlertDialog;
import android.content.Context;
import android.view.View;
/**
* SelectorUtil.
*/
public final class SelectorUtil{
private SelectorUtil(){}
/**
* リスト選択形式ダイアログを表示する View.OnClickListener を生成
*/
public static View.OnClickListener getOnClickListner(final Context context,final SelectorItem item){
return new View.OnClickListener(){
@Override
public void onClick(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
String title = item.title();
if (title != null){
builder.setTitle(title);
Integer id = item.icon();
if (id != null) builder.setIcon(id.intValue());
}
builder.setItems(item.displays(),item.createListner());
builder.create().show();
}
};
}
}
----------------------------------------------------------------------
これらを使う例は、、
public class LoginSelector implements Selector{
@Override
public void exec(Context context,Object...params){
// 選択された時の処理
}
}
public class SetteingSelector implements Selector{
@Override
public void exec(Context context,Object...params){
// 選択された時の処理
}
}
public class LoginSettingSelector extends SelectorList{
public LoginSettingSelector(Context context){
super(context);
}
// タイトル
@Override
public String title(){
return "メニュー";
}
// アイコン無しにするので、null を返す。
@Override
public Integer icon(){
return null;
}
// セレクト形式ダイアログ表示文字列配列
@Override
public String displays(){
return new String{ "ログイン" , "設定" };
}
// セレクト形式ダイアログ選択インターフェース配列
@Override
public Selector asigneExecutor(){
return new Selector[]{ new LoginSelector() , new SetteingSelector() };
}
}
を用意して、Activity の中で、以下のようにボタンクリックなどで表示するための
android.view.View.OnClickListener を 上の SelectorUtil で生成する。
View.OnClickListener listner = SelectorUtil.getOnClickListner(this,new LoginSettingSelector(this));