■ はじめに
https://dk521123.hatenablog.com/entry/2013/10/14/002656
https://dk521123.hatenablog.com/entry/2013/10/05/214058
の続き。 今回は、YES/NO/CANCELボタンのダイアログを学ぶ。 また、ダイアログのボタン押下した際に、画面側に処理が戻るような コールバック関数も実装していく
■ サンプル
Kotlin
* コールバック関数も実装する
SimpleDialogFragment.kt
import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.content.DialogInterface import android.os.Bundle import androidx.fragment.app.DialogFragment class SimpleDialogFragment : DialogFragment() { // ★コールバック用インターフェース★ interface OnClickListener { abstract fun onYesClick(dialog: DialogInterface) abstract fun onNoClick(dialog: DialogInterface) abstract fun onCancelClick(dialog: DialogInterface) } private var listener: OnClickListener? = null // listener の初期化 override fun onAttach(context: Context) { super.onAttach(context) if (context is SimpleDialogFragment.OnClickListener) { this.listener = context } } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val context = this.context if (context == null) { return super.onCreateDialog(savedInstanceState) } val builder = AlertDialog.Builder(context).apply { setTitle("Title : Hello") setMessage("Message : Message") // Yes setPositiveButton("Yes") { dialog, id -> // コールバック listener?.onYesClick(dialog) } // No setNegativeButton("No") { dialog, id -> // コールバック listener?.onNoClick(dialog) } // Cancel setNeutralButton("Cancel") { dialog, id -> // コールバック listener?.onCancelClick(dialog) } } return builder.create() } }
activity_main.xml
* button x 1 を画面に追加
MainActivity.java
import android.app.AlarmManager import android.app.PendingIntent import android.content.DialogInterface import android.content.Intent import android.os.Build import android.os.Bundle import android.widget.Toast import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import com.dk.jpalarm.alarm.AlarmBroadcastReceiver import kotlinx.android.synthetic.main.activity_main.* import java.util.* // コールバック用インターフェースを実装 class MainActivity : AppCompatActivity(), SimpleDialogFragment.OnClickListener { @RequiresApi(Build.VERSION_CODES.KITKAT) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { var dialog = SimpleDialogFragment() dialog.show( supportFragmentManager, "alert") } } // コールバック override fun onYesClick(dialog: DialogInterface) { Toast.makeText( this, "Select Yes!!", Toast.LENGTH_SHORT).show() } // コールバック override fun onNoClick(dialog: DialogInterface) { Toast.makeText( this, "Select No.", Toast.LENGTH_SHORT).show() } // コールバック override fun onCancelClick(dialog: DialogInterface) { Toast.makeText( this, "Select Cancel...", Toast.LENGTH_SHORT).show() } }
Java
activity_main.xml
* button x 1、EditText x1 を画面に追加
MainActivity.java
import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener { private Button button1; private EditText editText1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.button1 = (Button) findViewById(R.id.button1); this.button1.setOnClickListener(this); this.editText1 = (EditText)findViewById(R.id.editText1); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: // ★ここで表示★ AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("Hello, Title!"); dialog.setMessage("Hello, Dialog Message!"); dialog.setPositiveButton("Yes", new SampleDialogClickHandler(this.editText1)); dialog.setNegativeButton("No", new SampleDialogClickHandler(this.editText1)); dialog.setNeutralButton("Cancel", new SampleDialogClickHandler(this.editText1)); dialog.show(); } } }
SampleDialogClickHandler.java
// クリックイベント専用クラス。別にクラス分けずに、 // 実装可能だがソースを見易くしたいので // 最終的にはクリックイベントこみのダイアログを // ラップしたクラスを作成した方がいい気がする import android.app.AlertDialog; import android.content.DialogInterface; import android.widget.EditText; public class SampleDialogClickHandler implements DialogInterface.OnClickListener { private EditText editText1; public SampleDialogClickHandler(EditText editText1) { this.editText1 = editText1; } @Override public void onClick(DialogInterface arg0, int arg1) { switch(arg1){ case AlertDialog.BUTTON_POSITIVE: this.editText1.setText("Click Yes!!!"); break; case AlertDialog.BUTTON_NEGATIVE: this.editText1.setText("Click No..."); break; case AlertDialog.BUTTON_NEUTRAL: this.editText1.setText("Click Cancel."); break; } } }
参考資料
関連記事
ダイアログ表示 ~ 入門編 / トースト・Toast ~
https://dk521123.hatenablog.com/entry/2013/10/14/002656
ダイアログ表示 ~ 基本編 / アラートダイアログ ~
https://dk521123.hatenablog.com/entry/2013/10/05/214058
ダイアログ表示 ~ 基本編 / リスト選択 ~
https://dk521123.hatenablog.com/entry/2013/10/07/005850
ダイアログ表示 ~ 基本編 / チェックボックス・ラジオボタン ~
https://dk521123.hatenablog.com/entry/2013/10/09/001500
ダイアログ表示 ~ 基本編 / 日付・時間ダイアログ ~
https://dk521123.hatenablog.com/entry/2020/07/26/000000
ダイアログ表示 ~ 基本編 / Notification(通知) ~
https://dk521123.hatenablog.com/entry/2020/08/01/000000