###前提・実現したいこと
相談出来る方が居ないので色々とお作法を教えていだければと思います。
ストレートに言えば、サンプルに示すコードのコードレビューをして頂きたいです。
###疑問点
Androidではダイアログを表示する際にAlertDialogを直接使うのではなく、DialogFragmentを介して表示するのが一般的だと解釈しました。
呼び出し元のActivity(やFragment)側でのイベントの取得が面倒になるような気がしつつ、私なりに解釈した確認ダイアログの実装が下のコードです。
自分で駄目だと思っている点
- ダイアログを出すトリガーとなる箇所に、閉じたときのリスナーが直接書けないので可読性が悪い。
- 複数のダイアログを出した場合は、RequestCodeを貰うなど改造して、Positive、Negativeリスナーで処理の振り分けを書かなくてはいけない。
- 他の種類のダイアログ(アラートダイアログとか)作り、同じAcitivityで呼び出すようになると、もう収集がつかなくなりそう。
- その他、なんとなく直感的にコードが書けない。
###サンプルで作ったソースコード
java
1public class ManyDialogActivity extends AppCompatActivity implements ConfirmDialogFragment.ConfirmDialogListener { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_many_dialog); 7 8 Button button1 = (Button) findViewById(R.id.button1); 9 button1.setOnClickListener(new View.OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance(null, "Aを登録しますが良いですか?"); 13 dialog.show(getSupportFragmentManager(), "TAG"); 14 } 15 }); 16 Button button2 = (Button) findViewById(R.id.button2); 17 button2.setOnClickListener(new View.OnClickListener() { 18 @Override 19 public void onClick(View v) { 20 ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance(null, "Bを登録しますが良いですか?"); 21 dialog.show(getSupportFragmentManager(), "TAG"); 22 } 23 }); 24 Button button3 = (Button) findViewById(R.id.button3); 25 button3.setOnClickListener(new View.OnClickListener() { 26 @Override 27 public void onClick(View v) { 28 ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance(null, "Bを登録しますが良いですか?"); 29 dialog.show(getSupportFragmentManager(), "TAG"); 30 } 31 }); 32 } 33 34 @Override 35 public void onClickPositive() { 36 // 引数にRequestCodeのようなものを使って処理を振り分ける? 37 } 38 39 @Override 40 public void onClickNegative() { 41 // 引数にRequestCodeのようなものを使って処理を振り分ける? 42 } 43}
java
1public class ConfirmDialogFragment extends DialogFragment { 2 public static final String TITLE_KEY = ConfirmDialogFragment.class.getName() + ".TITLE_KEY"; 3 public static final String MESSAGE_KEY = ConfirmDialogFragment.class.getName() + ".MESSAGE_KEY"; 4 5 public static ConfirmDialogFragment newInstance(@Nullable String title, String message) { 6 ConfirmDialogFragment fragment = new ConfirmDialogFragment(); 7 Bundle bundle = new Bundle(); 8 bundle.putString(TITLE_KEY, title); 9 bundle.putString(MESSAGE_KEY, message); 10 fragment.setArguments(bundle); 11 return fragment; 12 } 13 14 @NonNull 15 @Override 16 public Dialog onCreateDialog(Bundle savedInstanceState) { 17 Bundle arguments = getArguments(); 18 String title = arguments.getString(TITLE_KEY); 19 String message = arguments.getString(MESSAGE_KEY); 20 21 final Activity activity = getActivity(); 22 AlertDialog.Builder builder = new AlertDialog.Builder(activity) 23 .setTitle(title) 24 .setMessage(message) 25 .setPositiveButton("OK", new DialogInterface.OnClickListener() { 26 @Override 27 public void onClick(DialogInterface dialog, int which) { 28 if (activity instanceof ConfirmDialogListener) { 29 ((ConfirmDialogListener) activity).onClickPositive(); 30 } 31 } 32 } 33 ) 34 .setNegativeButton("キャンセル", new DialogInterface.OnClickListener() { 35 @Override 36 public void onClick(DialogInterface dialog, int which) { 37 if (activity instanceof ConfirmDialogListener) { 38 ((ConfirmDialogListener) activity).onClickNegative(); 39 } 40 } 41 } 42 ); 43 return builder.create(); 44 } 45 46 interface ConfirmDialogListener { 47 void onClickPositive(); 48 49 void onClickNegative(); 50 } 51}
###補足情報(言語/FW/ツール等のバージョンなど)
- Android4.4 から 7 までが一応の対象バージョンです。
- サンプルはJavaで掲示しましたが、Kotlinで書いてます。
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2017/03/31 09:21
2017/03/31 09:30
2017/04/03 02:01
2017/04/03 02:17
2017/04/04 02:12