Android DialogFragmentとダイアログ


Answers

YesNoDialogやOkDialogのような一般的なDialogFragmentサブクラスを作成し、アプリケーションで多くのダイアログを使用する場合はタイトルとメッセージを渡すことができます。

public class YesNoDialog extends DialogFragment
{
    public static final String ARG_TITLE = "YesNoDialog.Title";
    public static final String ARG_MESSAGE = "YesNoDialog.Message";

    public YesNoDialog()
    {

    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle args = getArguments();
        String title = args.getString(ARG_TITLE);
        String message = args.getString(ARG_MESSAGE);

        return new AlertDialog.Builder(getActivity())
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
                }
            })
            .create();
    }
}

それから、以下を使用して呼び出します。

    DialogFragment dialog = new YesNoDialog();
    Bundle args = new Bundle();
    args.putString(YesNoDialog.ARG_TITLE, title);
    args.putString(YesNoDialog.ARG_MESSAGE, message);
    dialog.setArguments(args);
    dialog.setTargetFragment(this, YES_NO_CALL);
    dialog.show(getFragmentManager(), "tag");

そして、 onActivityResultの結果を処理onActivityResultます。

Question

Fragments APIを使用してDialogFragment代わりに使用することをお勧めしFragments APIが、単純なYes-No確認メッセージボックスには隔離されたDialogFragmentを使用するのは不合理です。 この場合のベストプラクティスは何ですか?




DialogFragment使用をお勧めしDialogFragment

確かに、「はい/いいえ」ダイアログを作成することはかなり単純ですが、 Dialog使って同様のダイアログボックスを作成することは驚くほど複雑です。

(アクティビティのライフサイクルは複雑になります。 Activityにダイアログボックスのライフサイクルを管理させる必要があります。また、APIレベルを8で使用している場合は、カスタムメッセージなどのカスタムメッセージをActivity.showDialogに渡す方法はありません)

素晴らしいことは、通常、 DialogFragment上に独自の抽象を簡単に構築できることです。




私は@ ashishduhの答えの少し簡素化をお勧めしますか:

public class AlertDialogFragment extends DialogFragment {
public static final String ARG_TITLE = "AlertDialog.Title";
public static final String ARG_MESSAGE = "AlertDialog.Message";

public static void showAlert(String title, String message, Fragment targetFragment) {
    DialogFragment dialog = new AlertDialogFragment();
    Bundle args = new Bundle();
    args.putString(ARG_TITLE, title);
    args.putString(ARG_MESSAGE, message);
    dialog.setArguments(args);
    dialog.setTargetFragment(targetFragment, 0);
    dialog.show(targetFragment.getFragmentManager(), "tag");
}

public AlertDialogFragment() {}

@NonNull
@Override
public AlertDialog onCreateDialog(Bundle savedInstanceState)
{
    Bundle args = getArguments();
    String title = args.getString(ARG_TITLE, "");
    String message = args.getString(ARG_MESSAGE, "");

    return new AlertDialog.Builder(getActivity())
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                }
            })
            .create();
}

コンポーネントの内部に精通しているユーザー(クラス)の必要性がなくなり、使い方が簡単になります。

AlertDialogFragment.showAlert(title, message, this);

PS私の場合、私は簡単なアラートダイアログが必要なので、それは私が作成したものです。 Yes / Noまたは必要な他のタイプにアプローチを適用することができます。