###前提・実現したいこと
相談出来る方が居ないので色々とお作法を教えていだければと思います。
ストレートに言えば、サンプルに示すコードのコードレビューをして頂きたいです。
###疑問点
Androidではダイアログを表示する際にAlertDialogを直接使うのではなく、DialogFragmentを介して表示するのが一般的だと解釈しました。
呼び出し元のActivity(やFragment)側でのイベントの取得が面倒になるような気がしつつ、私なりに解釈した確認ダイアログの実装が下のコードです。
自分で駄目だと思っている点
- ダイアログを出すトリガーとなる箇所に、閉じたときのリスナーが直接書けないので可読性が悪い。
- 複数のダイアログを出した場合は、RequestCodeを貰うなど改造して、Positive、Negativeリスナーで処理の振り分けを書かなくてはいけない。
- 他の種類のダイアログ(アラートダイアログとか)作り、同じAcitivityで呼び出すようになると、もう収集がつかなくなりそう。
- その他、なんとなく直感的にコードが書けない。
###サンプルで作ったソースコード
java
public class ManyDialogActivity extends AppCompatActivity implements ConfirmDialogFragment.ConfirmDialogListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_many_dialog); Button button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance(null, "Aを登録しますが良いですか?"); dialog.show(getSupportFragmentManager(), "TAG"); } }); Button button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance(null, "Bを登録しますが良いですか?"); dialog.show(getSupportFragmentManager(), "TAG"); } }); Button button3 = (Button) findViewById(R.id.button3); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance(null, "Bを登録しますが良いですか?"); dialog.show(getSupportFragmentManager(), "TAG"); } }); } @Override public void onClickPositive() { // 引数にRequestCodeのようなものを使って処理を振り分ける? } @Override public void onClickNegative() { // 引数にRequestCodeのようなものを使って処理を振り分ける? } }
java
public class ConfirmDialogFragment extends DialogFragment { public static final String TITLE_KEY = ConfirmDialogFragment.class.getName() + ".TITLE_KEY"; public static final String MESSAGE_KEY = ConfirmDialogFragment.class.getName() + ".MESSAGE_KEY"; public static ConfirmDialogFragment newInstance(@Nullable String title, String message) { ConfirmDialogFragment fragment = new ConfirmDialogFragment(); Bundle bundle = new Bundle(); bundle.putString(TITLE_KEY, title); bundle.putString(MESSAGE_KEY, message); fragment.setArguments(bundle); return fragment; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Bundle arguments = getArguments(); String title = arguments.getString(TITLE_KEY); String message = arguments.getString(MESSAGE_KEY); final Activity activity = getActivity(); AlertDialog.Builder builder = new AlertDialog.Builder(activity) .setTitle(title) .setMessage(message) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (activity instanceof ConfirmDialogListener) { ((ConfirmDialogListener) activity).onClickPositive(); } } } ) .setNegativeButton("キャンセル", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (activity instanceof ConfirmDialogListener) { ((ConfirmDialogListener) activity).onClickNegative(); } } } ); return builder.create(); } interface ConfirmDialogListener { void onClickPositive(); void onClickNegative(); } }
###補足情報(言語/FW/ツール等のバージョンなど)
- Android4.4 から 7 までが一応の対象バージョンです。
- サンプルはJavaで掲示しましたが、Kotlinで書いてます。
まだ回答がついていません
会員登録して回答してみよう