【Android】ダイアログ表示 ~ 基本編 / YES/NO/CANCELボタン ~

■ はじめに

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;
        }
    }
}

 参考資料

色々なサイトを見たが、以下が一番分かりやすい
http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90android%E3%80%91%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%EF%BC%88alertdialog%EF%BC%89%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
 

関連記事

ダイアログ表示 ~ 入門編 / トースト・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