DialogFragmentを使う
最終更新日:2020-07-10
    
    Activityでダイアログを出そうとすると、実は大変でした。
- ActivityのshowDialog()を呼ぶ
 - すると、onCreateDialog()が呼ばれるので、そこでダイアログを生成する
 - ダイアログはキャッシュされるので、一工夫必要
 
Fragmentを使ったアプリ開発では、ダイアログは画面遷移のように扱えるようになりました。次の手順で呼び出します。
- DialogFragmentを継承したクラスを作る
 - onCreateDialog()を実装する
 - 呼び出し側でDialogFragmentオブジェクトを作り、show()を呼ぶ
 
では、順にみていきましょう
DialogFragmentを継承したクラスを作る
まずはFragmentと同様に、DialogFragmentを継承したクラスを作ります。ここでは単純にメッセージを表示するだけのMessageDialogFragmentを作ってみます。
public class MessageDialogFragment extends DialogFragment {
    public static MessageDialogFragment newInstance() {
        MessageDialogFragment fragment = new MessageDialogFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }
}
onCreateDialog()を実装する
DialogFragmentでは、onCreateDialog()を実装します。このメソッドでは、Dialogオブジェクトを生成しreturnします。AlertDialog.Builderを使ってメッセージを出すだけのDialogを生成してみます。
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Activity activity = getActivity();
    if (activity == null) {
        return super.onCreateDialog(savedInstanceState);
    }
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    builder.setMessage("やほー");
    builder.setPositiveButton(android.R.string.ok, null);
    return builder.create();
}
MessageDialogFragment全体は次のようになります。
public class MessageDialogFragment extends DialogFragment {
    public static MessageDialogFragment newInstance() {
        MessageDialogFragment fragment = new MessageDialogFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Activity activity = getActivity();
        if (activity == null) {
            return super.onCreateDialog(savedInstanceState);
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setMessage("やほー");
        builder.setPositiveButton(android.R.string.ok, null);
        return builder.create();
    }
}
呼び出し側でDialogFragmentオブジェクトを作り、show()を呼ぶ
ダイアログの表示はDialogFragmentオブジェクトのshow()で行います。
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.fragment_title, container, false);
    View button = root.findViewById(R.id.button_next);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            MessageDialogFragment dialog = MessageDialogFragment.newInstance();
            dialog.show(getFragmentManager(), "");
        }
    });
    return root;
}
実際にボタンをタップすると、次のようにダイアログが表示されます。


