Bagaimana cara menampilkan kotak dialog Ya / Tidak di Android?

358

Ya, saya tahu ada AlertDialog.Builder, tapi saya terkejut mengetahui betapa sulitnya (well, setidaknya tidak ramah programmer) untuk menampilkan dialog di Android.

Saya dulu adalah pengembang .NET, dan saya ingin tahu apakah ada yang setara dengan Android berikut ini?

if (MessageBox.Show("Sure?", "", MessageBoxButtons.YesNo) == DialogResult.Yes){
    // Do something...
}
Solo
sumber
3
Bagaimana cara mengembalikan kode AlertDialog dan menangani acara (ya, tidak ada tindakan) di semua layar? Di .Net kami menggunakan kelas Action untuk menangani acara, apakah ada cara untuk mengimplementasikan ini? Saya tahu menggunakan antarmuka kita bisa melakukan ini tetapi ada cara alternatif?
Ravikumar11
2
Ya .... kami. Pengembang NET benar-benar mengalami kesulitan dengan android .... Saya ingin tahu apakah Xamarin adalah alat yang hebat?
Daniel Möller

Jawaban:

745

AlertDialog.Builder sebenarnya tidak terlalu sulit untuk digunakan. Memang agak menakutkan pada awalnya, tetapi begitu Anda menggunakannya agak sederhana dan kuat. Saya tahu Anda telah mengatakan Anda tahu cara menggunakannya, tetapi ini hanyalah contoh sederhana:

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked
            break;
        }
    }
};

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
    .setNegativeButton("No", dialogClickListener).show();

Anda juga dapat menggunakan kembali itu DialogInterface.OnClickListenerjika Anda memiliki kotak ya / tidak lain yang harus melakukan hal yang sama.

Jika Anda membuat Dialog dari dalam View.OnClickListener, Anda dapat menggunakan view.getContext()untuk mendapatkan Konteks. Atau Anda bisa menggunakan yourFragmentName.getActivity().

Steve Haley
sumber
3
AlertDialog.Builder baru (ini); Kesalahan waktu kompilasi: 'AlertDialog.Builder konstruktor (View.OnClickListener () baru {}) tidak terdefinisi'
Eric Leschinski
3
Dialog yang sederhana dan bermanfaat, btw, akan menghapus sendiri setelah pengguna mengklik tombol "YA" atau "TIDAK". Tidak ada yang perlu Anda lakukan.
RRTW
9
Saya sendiri, saya sudah sering menggunakannya. Tapi saya telah menemukan sebenarnya lebih mudah dan lebih cepat untuk mencarinya di SO. Contoh kode yang diberikan di sini sangat sederhana ... Saya sangat berharap dokumentasi Android akan terlihat seperti ini.
Radu
4
@EricLeschinski mungkin "ini" bukan konteks, coba yang ini: AlertDialog.Builder builder = new AlertDialog.Builder(getView().getContext());
cldrr
1
@davidglorioso Urutan ya / tidak atau tidak / ya tergantung pada versi Android, dan Anda tidak dapat mengendalikannya. Saya tidak ingat kapan itu berubah, tapi saya pikir itu dalam 4.x atau 5. Mengatakan itu, Anda tidak boleh mengubahnya juga. Semua aplikasi yang menggunakan dialog peringatan standar akan menggunakan urutan tombol tidak / ya yang sama, dan itu akan membingungkan bagi pengguna jika milik Anda berbeda. Jika Anda benar-benar menginginkannya berbeda, Anda harus mengatur secara manual tombol positif / negatif Anda bergantung pada versi Android.
Steve Haley
163

Coba ini:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Confirm");
builder.setMessage("Are you sure?");

builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which) {
        // Do nothing but close the dialog

        dialog.dismiss();
    }
});

builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {

        // Do nothing
        dialog.dismiss();
    }
});

AlertDialog alert = builder.create();
alert.show();
nikki
sumber
25
Secara pribadi, saya suka cuplikan kode itu lebih dari jawaban yang diterima
John
1
@nikki mengapa keduanya memberhentikan ()?
likejudo
The constructor AlertDialog.Builder(MainActivity.DrawerItemClickListener) is undefined
hash
@likejiujitsu itu karena Anda ingin membersihkan dialog dari memori dalam hal apa pun setelah Anda melakukan pekerjaan Anda.
Avi Levin
32

Jawaban Steve H tepat, tetapi ini sedikit informasi lebih lanjut: alasan dialog berjalan seperti yang mereka lakukan adalah karena dialog di Android tidak sinkron (eksekusi tidak berhenti ketika dialog ditampilkan). Karena itu, Anda harus menggunakan panggilan balik untuk menangani pilihan pengguna.

Lihatlah pertanyaan ini untuk diskusi yang lebih panjang antara perbedaan Android dan .NET (yang berkaitan dengan dialog): Dialog / AlertDialogs: Cara "memblokir eksekusi" saat dialog naik (.NET-style)

Erich Douglass
sumber
8
Terima kasih, fakta bahwa dialog Android asinkron membuat semuanya jelas (dan masuk akal) sekarang. Sepertinya saya perlu "berpikir keluar. Net" ketika mengembangkan aplikasi untuk Android :)
Solo
FYI: apa yang Anda sebut "dialog asinkron" disebut "dialog modeless" dalam terminologi GUI, sedangkan "dialog sinkron" disebut "dialog modal". Android tidak menampilkan dialog modal (kecuali dalam kasus yang sangat luar biasa).
Alex
Android tidak mengizinkan dialog modal sistem karena alasan yang sangat baik: tidak diizinkan mengganggu aplikasi lain di perangkat.
Renascienza
14

Ini bekerja untuk saya:

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

    builder.setTitle("Confirm");
    builder.setMessage("Are you sure?");

    builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {

            // Do nothing, but close the dialog
            dialog.dismiss();
        }
    });

    builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            // Do nothing
            dialog.dismiss();
        }
    });

    AlertDialog alert = builder.create();
    alert.show();
hash
sumber
7

Menanyakan Seseorang apakah dia ingin menelepon atau tidak Dialog ..

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;

public class Firstclass extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.first);

        ImageView imageViewCall = (ImageView) findViewById(R.id.ring_mig);

        imageViewCall.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v){
                try{
                    showDialog("0728570527");
                } catch (Exception e){
                    e.printStackTrace();
                }                   
            }    
        });    
    }

    public void showDialog(final String phone) throws Exception {
        AlertDialog.Builder builder = new AlertDialog.Builder(Firstclass.this);

        builder.setMessage("Ring: " + phone);       

        builder.setPositiveButton("Ring", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){

                Intent callIntent = new Intent(Intent.ACTION_DIAL);// (Intent.ACTION_CALL);                 
                callIntent.setData(Uri.parse("tel:" + phone));
                startActivity(callIntent);

                dialog.dismiss();
            }
        });

        builder.setNegativeButton("Abort", new DialogInterface.OnClickListener(){   
            @Override
            public void onClick(DialogInterface dialog, int which){
                dialog.dismiss();
            }
        });         
        builder.show();
    }    
}
Zar E Ahmer
sumber
5

Jawaban Steves benar meskipun ketinggalan zaman dengan fragmen. Berikut ini adalah contoh dengan FragmentDialog.

Kelas:

public class SomeDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle("Title")
            .setMessage("Sure you wanna do this!")
            .setNegativeButton(android.R.string.no, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do nothing (will close dialog)
                }
            })
            .setPositiveButton(android.R.string.yes,  new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do something
                }
            })
            .create();
    }
}

Untuk memulai dialog:

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            // Create and show the dialog.
            SomeDialog newFragment = new SomeDialog ();
            newFragment.show(ft, "dialog");

Anda juga bisa membiarkan kelas menerapkan onClickListenerdan menggunakannya sebagai ganti pendengar yang tertanam.

Warpzit
sumber
@likejiujitsu di atas sudah cukup.
Warpzit
Buat kelas FragmentDialog hanya untuk melakukan kotak tidak / ya sedikit overdesign ... :) AlertDialog default sudah cukup adil.
Renascienza
@Renascienza ya tapi saya percaya itu sudah usang.
Warpzit
Tidak juga. FragmentDialog ditambahkan sebagai hal yang berguna untuk memungkinkan Anda menggunakan kembali sebuah fragmen pada dialog. Fragmen adalah semua tentang penggunaan kembali UI. Karena Anda tidak perlu menggunakan fragmen hanya karena itu adalah hal baru (fragmen tidak datang untuk menggantikan kegiatan), Anda tidak perlu menggunakan FragmentDialog pada kasus-kasus di mana tidak ada untungnya dilakukan. Lansiran Ya / Tidak Sederhana, misalnya.
Renascienza
2
Rekomendasi saya adalah: jika Anda perlu menggunakan kembali tidak hanya tata letak, tetapi kode latar belakang dan siklus hidup, gunakan dialog Fragmen. Dengan fragmen Anda memiliki kontrol siklus hidup aktivitas terkait dan dapat bereaksi terhadap peristiwa seperti buat (karena UI dibuat kembali saat pengguna memutar perangkatnya), jeda, lanjutkan, dll. Singkatnya, dialog dengan beberapa UI yang rumit. Jika Anda tidak membutuhkan ini dan dialog Anda cukup sederhana, dialog reguler berfungsi dengan baik.
Renascienza
5

Terima kasih nikki jawaban Anda telah membantu saya meningkatkan yang sudah ada hanya dengan menambahkan tindakan yang saya inginkan sebagai berikut

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Do this action");
builder.setMessage("do you want confirm this action?");

builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which) {
        // Do do my action here

        dialog.dismiss();
    }

});

builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        // I do not need any action here you might
        dialog.dismiss();
    }
});

AlertDialog alert = builder.create();
alert.show();
CrandellWS
sumber
Saya mendapat kesan bahwa OP tidak ingin menggunakan AlertDialog.Builder. OP wats untuk mengetahui jika ada metode utilitas pintas,
walrii
1
Saya telah menulis kode yang sama tetapi TIDAK muncul terlebih dahulu dan kemudian YA pada dasarnya itu adalah kotak dialog TIDAK / YA tetapi saya membutuhkan kotak dialog YA / TIDAK Bagaimana saya melakukannya
Sagar Devanga
Sedangkan untuk YA / TIDAK vs TIDAK / YA lihat jawaban ini: stackoverflow.com/a/13644589/1815624 Anda dapat memanipulasinya seperti yang dijelaskan dalam jawaban ini: stackoverflow.com/a/13644536/1815624
CrandellWS
4

Di Kotlin:

AlertDialog.Builder(this)
    .setTitle(R.string.question_title)
    .setMessage(R.string.question_message)
    .setPositiveButton(android.R.string.yes) { _, _ -> yesClicked() }
    .setNegativeButton(android.R.string.no) { _, _ -> noClicked() }
    .show()
Cristan
sumber
3

Tampilkan dialog secara anonim sebagai rantai perintah & tanpa mendefinisikan objek lain:

 new AlertDialog.Builder(this).setTitle("Confirm Delete?")
                        .setMessage("Are you sure?")
                        .setPositiveButton("YES",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {

                                       // Perform Action & Dismiss dialog                                 
                                        dialog.dismiss();
                                    }
                                })
                        .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // Do nothing
                                dialog.dismiss();
                            }
                        })
                        .create()
                        .show();
Hitesh Sahu
sumber
2

Semua jawaban di sini bermuara pada kode yang panjang dan tidak ramah pembaca: hanya apa yang ingin dihindari oleh orang yang bertanya. Bagi saya, pendekatan yang paling mudah adalah menggunakan lambdas di sini:

new AlertDialog.Builder(this)
        .setTitle("Are you sure?")
        .setMessage("If you go back you will loose any changes.")
        .setPositiveButton("Yes", (dialog, which) -> {
            doSomething();
            dialog.dismiss();
        })
        .setNegativeButton("No", (dialog, which) -> dialog.dismiss())
        .show();

Lambdas di Android memerlukan plugin retrolambda ( https://github.com/evant/gradle-retrolambda ), tetapi sangat membantu dalam menulis kode yang lebih bersih.

javaxian
sumber
1

Terima kasih. Saya menggunakan API Level 2 (Android 1.1) dan bukannya BUTTON_POSITIVEdan BUTTON_NEGATIVEsaya harus menggunakan BUTTON1dan BUTTON2.

Kristen
sumber
1

1.Buat AlertDialog mengatur pesan, judul dan Tombol Positif, Negatif:

final AlertDialog alertDialog = new AlertDialog.Builder(this)
                        .setCancelable(false)
                        .setTitle("Confirmation")
                        .setMessage("Do you want to remove this Picture?")
                        .setPositiveButton("Yes",null)
                        .setNegativeButton("No",null)
                        .create();

2. Sekarang temukan kedua tombol di DialogInterface Klik lalu setOnClickListener ():

alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialogInterface) {
                Button yesButton = (alertDialog).getButton(android.app.AlertDialog.BUTTON_POSITIVE);
                Button noButton = (alertDialog).getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
                yesButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //Now Background Class To Update Operator State
                        alertDialog.dismiss();
                        Toast.makeText(GroundEditActivity.this, "Click on Yes", Toast.LENGTH_SHORT).show();
                        //Do Something here 
                    }
                });

                noButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        alertDialog.dismiss();
                        Toast.makeText(GroundEditActivity.this, "Click on No", Toast.LENGTH_SHORT).show();
                        //Do Some Thing Here 
                    }
                });
            }
        });

3.Untuk Tampilkan Alertdialog:

alertDialog.show();

Catatan: Jangan lupa Kata Kunci Akhir dengan AlertDialog.

Wajid khan
sumber
0
AlertDialog.Builder altBx = new AlertDialog.Builder(this);
    altBx.setTitle("My dialog box");
    altBx.setMessage("Welcome, Please Enter your name");
    altBx.setIcon(R.drawable.logo);

    altBx.setPositiveButton("Ok", new DialogInterface.OnClickListener()
    {
      public void onClick(DialogInterface dialog, int which)
      {
          if(edt.getText().toString().length()!=0)
          {
              // Show any message
          }
          else 
          {

          }
      }
    });
    altBx.setNeutralButton("Cancel", new DialogInterface.OnClickListener()
    {
      public void onClick(DialogInterface dialog, int which)
      {
          //show any message
      }

    });
  altBx.show();  
Singhak
sumber
0

Anda dapat menerapkan solusi umum untuk keputusan dan menggunakan dalam kasus lain tidak hanya untuk ya / tidak dan kustomisasi lansiran dengan animasi atau tata letak:

Sesuatu seperti ini; pertama buat kelas Anda untuk mentransfer data:

public class AlertDecision {

    private String question = "";
    private String strNegative = "";
    private String strPositive = "";

    public AlertDecision question(@NonNull String question) {
        this.question = question;
        return this;
    }

    public AlertDecision ansPositive(@NonNull String strPositive) {
        this.strPositive = strPositive;
        return this;
    }

    public AlertDecision ansNegative(@NonNull String strNegative) {
        this.strNegative = strNegative;
        return this;
    }

    public String getQuestion() {
        return question;
    }

    public String getAnswerNegative() {
        return strNegative;
    }

    public String getAnswerPositive() {
        return strPositive;
    }
}

setelah antarmuka untuk mengembalikan hasilnya

public interface OnAlertDecisionClickListener {

    /**
     * Interface definition for a callback to be invoked when a view is clicked.
     *
     * @param dialog the dialog that was clicked
     * @param object The object in the position of the view
     */
    void onPositiveDecisionClick(DialogInterface dialog, Object object);
    void onNegativeDecisionClick(DialogInterface dialog, Object object);
}

Sekarang Anda dapat membuat utils untuk akses dengan mudah (di kelas ini Anda dapat menerapkan berbagai animasi atau tata letak khusus untuk lansiran):

public class AlertViewUtils {

    public static void showAlertDecision(Context context,
                                         @NonNull AlertDecision decision,
                                         final OnAlertDecisionClickListener listener,
                                         final Object object) {

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(decision.getQuestion());
        builder.setPositiveButton(decision.getAnswerPositive(),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        listener.onPositiveDecisionClick(dialog, object);
                    }
                });

        builder.setNegativeButton(decision.getAnswerNegative(),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        listener.onNegativeDecisionClick(dialog, object);
                    }
                });

        android.support.v7.app.AlertDialog dialog = builder.create();
        dialog.show();
    }
}

dan panggilan terakhir dalam aktivitas atau fragmen; Anda dapat menggunakan ini dalam kasus Anda atau untuk tugas lain:

public class MainActivity extends AppCompatActivity {

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        initResources();
    }

    public void initResources() {
        Button doSomething = (Button) findViewById(R.id.btn);
        doSomething.setOnClickListener(getDecisionListener());
    }

    private View.OnClickListener getDecisionListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDecision decision = new AlertDecision()
                        .question("question ...")
                        .ansNegative("negative action...")
                        .ansPositive("positive action... ");
                AlertViewUtils.showAlertDecision(MainActivity.this,
                        decision, getOnDecisionListener(), v);
            }
        };
    }

    private OnAlertDecisionClickListener getOnDecisionListener() {
        return new OnAlertDecisionClickListener() {
            @Override
            public void onPositiveDecisionClick(DialogInterface dialog, Object object) {

                //do something like create, show views, etc...
            }

            @Override
            public void onNegativeDecisionClick(DialogInterface dialog, Object object) {
                //do something like delete, close session, etc ...
            }
        };
    }
} 
Alex Zaraos
sumber
0

Anda dapat melakukannya dengan mudah di Kotlin:

 alert("Testing alerts") {
    title = "Alert"
    yesButton { toast("Yess!!!") }
    noButton { }
}.show()
Serg Burlaka
sumber
0

Untuk Kotlin di Android ::

    override fun onBackPressed() {
        confirmToCancel()
    }

    private fun confirmToCancel() {
        AlertDialog.Builder(this)
            .setTitle("Title")
            .setMessage("Do you want to cancel?")
            .setCancelable(false)
            .setPositiveButton("Yes") {
                dialog: DialogInterface, _: Int ->
                dialog.dismiss()
                // for sending data to previous activity use
                // setResult(response code, data)
                finish()
            }
            .setNegativeButton("No") {
                dialog: DialogInterface, _: Int ->
                dialog.dismiss()
            }
            .show()
    } 
Partha Paul
sumber
0

Implementasi Kotlin.

Anda dapat membuat fungsi sederhana seperti ini:

fun dialogYesOrNo(
        activity: Activity,
        title: String,
        message: String,
        listener: DialogInterface.OnClickListener
    ) {
        val builder = AlertDialog.Builder(activity)
        builder.setPositiveButton("Yes", DialogInterface.OnClickListener { dialog, id ->
            dialog.dismiss()
            listener.onClick(dialog, id)
        })
        builder.setNegativeButton("No", null)
        val alert = builder.create()
        alert.setTitle(title)
        alert.setMessage(message)
        alert.show()
    }

dan menyebutnya seperti ini:

dialogYesOrNo(
  this,
  "Question",
  "Would you like to eat?",
  DialogInterface.OnClickListener { dialog, id ->
    // do whatever you need to do when user presses "Yes"
  }
})
Kristen
sumber