1) ボタンの onclick 属性とアクティビティ内のメソッド。それが私の当初の計画でしたが、アクティビティからダイアログを取得してそれを閉じる方法がわかりません。これが正しい方法ではないとしても、どうすればこれを行うことができるでしょうか? これがどのように機能するかを理解したいと思います。
基本的に、アクティビティは、現在どのダイアログがアクティブであるかを のようなもので記憶/認識しているcurDialog=dialogFragment;
必要があります。その後、ボタンの onclick アクションを処理するときに、どのダイアログを閉じるかがわかります。しかし、基本的にボタン ビューが DialogFragment からアクティビティに「リーク」し、オブジェクトのカプセル化が壊れるため、これは本当に良い考えではありません。
2) ダイアログが DialogFragment で作成されるときに、ボタンのクリック リスナーに設定します。これには、Activity から DialogFragment に何らかのコンテキストを渡す必要があるため、これを回避したいと思います (DialogFragment をできるだけシンプルに保ちます)。
前の回答で述べたように、特に を呼び出すことでアクティビティを取得できるため、Context を渡す必要はありませんgetActivity()
。
解決策は、このダイアログが複数のアクティビティで使用されるかどうかによって異なります。
- 単一のアクティビティで使用: @Martin のソリューションは問題なく動作します
複数のアクティビティで使用: 抽象化を使用して、ユーザーの決定のみがリスナーに渡されるようにすることができます。これは、同じ問題に対して思いついた (変更された) ソリューションです。
public class BaseDialogFragment extends DialogFragment {
protected TextView dialogEn;
protected Button dialogYes;
private Button dialogNo;
protected OnSelectListener listener;
public interface OnSelectListener {
public void onSelect(int type, boolean yes);
}
public void setOnSelectListener(OnSelectListener listener) {
this.listener = listener;
}
public BaseDialogFragment() {
super();
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.dialog_confirm, container, false);
dialogYes = (Button) v.findViewById(R.id.yes);
dialogNo = (Button) v.findViewById(R.id.no);
dialogEn = (TextView) view.findViewById(R.id.dialog_en);
dialogEn.setText(getArguments().getString("text_en"));
dialogYes.setOnClickListener(this);
dialogNo.setOnClickListener(this);
return v;
}
public void onClick(View v) {
if (listener != null) {
listener.onSelect(getArguments().getInt("type"),
v == dialogYes ? true : false);
}
getDialog().dismiss();
}
}
それを使用するには、いくつかの追加情報を提供する必要があります。
Bundle bundle = new Bundle();
bundle.putInt("type", type); //type: an unique integer value that helps differentiate result from different dialogs
bundle.putString("text_en", en); //en: String to be displayed
dialog.setArguments(bundle);
dialog.setOnSelectListener(this);
したがって、type
上記の値が 115 に設定されている場合、dialogYes
ボタンをクリックすると、public void onSelect(int type, boolean yes)
メソッドが呼び出され、1 番目と 2 番目のパラメーターとして呼び出されます。115
true