DialogでActivityのデータ表示を更新する
3161 ワード
タイトルがはっきりしていないので、activityがあると仮定し、activityにButtonとTextViewがあると仮定し、ボタンをクリックしてDialogをポップアップし、ダイアログボックスにListViewがあり、ListViewのいずれかを選択し、ダイアログボックスを閉じ、activityのEditTextの値を選択した値を更新します.
この問題を分析し、DialogがAlertDialogであると仮定すると、ButtonのOnClickListenerイベントでDialogを直接作成し、AlertDialogのsetPositiveButtonまたは他のボタンリスナーでEditText値の更新を完了することができます.DialogがカスタムDialogである場合、このカスタムDialogをActivity内部クラスで完全に実装することもできます.これにより、DialogのListViewの選択イベントリスナーでEditTextにアクセスできます.
しかし、コードの複雑さの原因でも結合の原因でも、カスタムDialogを個別のクラスで作成するのが好きではありません.これでDialogではActivityのEditTextにアクセスできません.EditTextをpublicに設定しない限り(もちろん良い方法ではありません).ネットで調べてみると、コールバック関数で実現できることがわかり、前の記事で使用したカスタムダイアログボックスを例に挙げています.具体的な手順は以下の通りです.
1、DialogのListenerとしてインタフェースを新規作成し、インタフェースでコールバック関数を宣言します.
2、カスタムDialogにListenerパラメータ付き構造関数を追加する:
3、Dialogで必要な場所でコールバック関数を呼び出す.例えば、ListViewの選択イベントがトリガーされた場合:
4、その後、ActivityでListerパラメータ付きコンストラクション関数を使用してカスタムDialogをインスタンス化し、Listerで宣言されたコールバック関数を実装すればいいです.
この問題を分析し、DialogがAlertDialogであると仮定すると、ButtonのOnClickListenerイベントでDialogを直接作成し、AlertDialogのsetPositiveButtonまたは他のボタンリスナーでEditText値の更新を完了することができます.DialogがカスタムDialogである場合、このカスタムDialogをActivity内部クラスで完全に実装することもできます.これにより、DialogのListViewの選択イベントリスナーでEditTextにアクセスできます.
しかし、コードの複雑さの原因でも結合の原因でも、カスタムDialogを個別のクラスで作成するのが好きではありません.これでDialogではActivityのEditTextにアクセスできません.EditTextをpublicに設定しない限り(もちろん良い方法ではありません).ネットで調べてみると、コールバック関数で実現できることがわかり、前の記事で使用したカスタムダイアログボックスを例に挙げています.具体的な手順は以下の通りです.
1、DialogのListenerとしてインタフェースを新規作成し、インタフェースでコールバック関数を宣言します.
/** * Dialog
* @author Kael.Chen
* */ public interface PriorityListener { /** * , Dialog Activity UI */ public void refreshPriorityUI();
}
2、カスタムDialogにListenerパラメータ付き構造関数を追加する:
private PriorityListener listener; public PriorityDlg(Context context) { super(context); this.context = context; // TODO Auto-generated constructor stub } public PriorityDlg(Context context, int theme) { super(context, theme); this.context = context;
} public PriorityDlg(Context context, int theme, PriorityListener listener) { this(context, theme); this.listener = listener;
}
3、Dialogで必要な場所でコールバック関数を呼び出す.例えば、ListViewの選択イベントがトリガーされた場合:
dlg_priority_lvw.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
dismiss();
listener.refreshPriorityUI();
}
});
4、その後、ActivityでListerパラメータ付きコンストラクション関数を使用してカスタムDialogをインスタンス化し、Listerで宣言されたコールバック関数を実装すればいいです.
// task_simple_form_priority.setOnClickListener(new OnClickListener() {
@Override public void onClick(View arg0) { // PriorityDlg dlg = new PriorityDlg(SimpleTaskActivity.this, R.style.dlg_priority, new PriorityDlg.PriorityListener() {
@Override public void refreshPriorityUI() { // Activity UI , Dialog , Toast.makeText(SimpleTaskActivity.this, " ", Toast.LENGTH_SHORT).show();
}
});
dlg.show();
}
});