Android'de Evet / Hayır iletişim kutusu nasıl görüntülenir?


359

Evet, AlertDialog.Builder olduğunu biliyorum, ancak Android'de bir iletişim kutusu görüntülemenin ne kadar zor olduğunu (en azından programcı dostu değil) bilmek şok oldum.

Bir .NET geliştiricisiydim ve aşağıdakilerin Android eşdeğeri olduğunu merak ediyorum?

if (MessageBox.Show("Sure?", "", MessageBoxButtons.YesNo) == DialogResult.Yes){
    // Do something...
}


3
AlertDialog kodunu nasıl çözebilir ve tüm ekranlarda olayları (evet, eylem yok) nasıl işleyebilirim? .Net'te olayları işlemek için Action sınıfını kullanıyoruz, bunu uygulamanın herhangi bir yolu var mı? Arabirimleri kullanarak bunu yapabiliriz ama alternatif bir yol biliyorum?
Ravikumar11

2
Evet .... biz .NET geliştiricileri gerçekten android ile zor anlar var .... Acaba Xamarin harika bir araç mı?
Daniel Möller

Yanıtlar:


745

AlertDialog.Builder kullanımı gerçekten zor değil. İlk başta biraz korkutucu, ama biraz kullandıktan sonra hem basit hem de güçlü. Nasıl kullanılacağını bildiğini söylediğini biliyorum, ama işte basit bir örnek:

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();

Aynı şeyi yapması DialogInterface.OnClickListenergereken başka evet / hayır kutularınız varsa da yeniden kullanabilirsiniz .

İletişim Kutusunu a içinden oluşturuyorsanız, Bağlam'ı almak için View.OnClickListenerkullanabilirsiniz view.getContext(). Alternatif olarak kullanabilirsiniz yourFragmentName.getActivity().


3
yeni AlertDialog.Builder (this); Derleme zamanı hatası: 'Yapıcı AlertDialog.Builder (yeni View.OnClickListener () {}) tanımlanmamış'
Eric Leschinski

3
Basit ve kullanışlı, btw, iletişim kutusu kullanıcı "EVET" veya "HAYIR" düğmesine tıkladıktan sonra kendi kendine kapanır. Yapmanız gereken hiçbir şey yok.
RRTW

9
Ben kendim, birçok kez kullandım. Ama ben SO üzerinde aramak aslında daha kolay ve daha hızlı buldum. Burada verilen kod örneği çok basit ... Keşke gerçekten Android belgeleri böyle görünecektir.
Radu

4
@EricLeschinski muhtemelen "bu" bir bağlam değil, bunu deneyin: AlertDialog.Builder builder = new AlertDialog.Builder(getView().getContext());
cldrr

1
@davidglorioso Evet / hayır veya hayır / evet sırası Android sürümüne bağlıdır ve kontrol edemezsiniz. Ne zaman değiştiğini hatırlamıyorum, ama sanırım 4.x ya da 5. idi. Bunu söyleyerek, yine de değiştirmemelisin. Standart uyarı iletişim kutuları kullanan tüm uygulamalar aynı hayır / evet düğmesi sırasını kullanır ve sizinkiler farklı olsaydı kullanıcılar için kafa karıştırıcı olurdu. Gerçekten farklı olmasını istiyorsanız, pozitif / negatif düğmelerinizi Android sürümüne bağlı olarak manuel olarak ayarlamanız gerekir.
Steve Haley

163

Bunu dene:

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();

25
Şahsen, bu kod pasajını kabul edilen cevaptan daha çok seviyorum
John

1
@nikki neden ikisinde de dismiss () var?
likejudo

The constructor AlertDialog.Builder(MainActivity.DrawerItemClickListener) is undefined
Hash

@likejiujitsu işinizi yaptıktan sonra her durumda iletişim kutusunu bellekten temizlemek istediğiniz için.
Avi Levin

32

Steve H'nin cevabı açık, ancak burada biraz daha fazla bilgi var: Android'de diyalogların senkronize olmamaları (diyalog görüntülendiğinde yürütme durmuyor). Bu nedenle, kullanıcının seçimini gerçekleştirmek için bir geri arama kullanmanız gerekir.

Android ve .NET arasındaki farklar (diyaloglarla ilgili olarak) arasında daha uzun bir tartışma için bu soruya göz atın: Diyaloglar / AlertDialogs: Diyalog açıkken "yürütme nasıl engellenir" (.NET tarzı)


8
Teşekkürler, Android iletişim kutularının eşzamansız olması, şimdi her şeyi net (ve makul) hale getiriyor. Android için uygulamalar geliştirirken "Net üzerinden düşünmem" gerekiyor gibi görünüyor
Solo

FYI: GUI terminolojisinde "eşzamansız diyalog" olarak adlandırdığınız şeye GUI terminolojisinde "modelsiz diyalog", "eşzamanlı diyalog" ise "kalıcı diyalog" denir. Android modsal diyaloglar içermez (çok istisnai durumlar hariç).
Alex

Android, sistem kalıcı iletişim kutularına çok iyi bir nedenden dolayı izin vermez: cihazdaki başka uygulamalara müdahale etmesine izin verilmez.
Renascienza

14

Bu benim için çalışıyor:

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();

7

Bir Kişiye Diyalog Aramak isteyip istemediğini sormak ..

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

5

Steves cevabı doğru olsa da, parçaları ile modası geçmiş. İşte FragmentDialog ile bir örnek.

Sınıf:

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

İletişim kutusunu başlatmak için:

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

Ayrıca sınıfın onClickListenergömülü dinleyiciler yerine bunu uygulamasına ve kullanmasına izin verebilirsiniz .


Yukarıdaki @likejiujitsu yeterlidir.
Warpzit

Sadece bir hayır / evet kutusu yapmak için bir FragmentDialog sınıfı oluşturun biraz fazla tasarım ... :) Varsayılan bir AlertDialog henüz yeterince adil.
Renascienza

@Renascienza evet ama eski olduğuna inanıyorum.
Warpzit

Pek sayılmaz. FragmentDialog, bir iletişim kutusundaki bir parçayı yeniden kullanmanıza izin vermek için yararlı bir şey olarak eklenmiştir. Parçalar tamamen kullanıcı arayüzünün yeniden kullanımı ile ilgilidir. Sadece yeni bir şey olduğu için fragmanları kullanmanıza gerek olmadığından (fragmanlar etkinliklerin yerini almaya gelmez), FragmentDialog'u kazanmanın olmadığı durumlarda kullanmanıza gerek yoktur. Örneğin basit Evet / Hayır uyarıları.
Renascienza

2
Benim tavsiyem: yalnızca bir düzeni değil, arka plan ve yaşam döngüsü kodunu yeniden kullanmanız gerekiyorsa, Parça iletişim kutusunu kullanın. Parça ile ilgili etkinlik yaşam döngüsü kontrolüne sahip olursunuz ve create (kullanıcı cihazını döndürdüğünde UI yeniden oluşturulduğu için), duraklatma, devam etme vb. Gibi olaylara tepki verebilir. Buna ihtiyacınız yoksa ve iletişim kutunuz oldukça basitse, normal iletişim kutuları işe yarar.
Renascienza

5

Teşekkürler nikki Cevabınız, istediğiniz işlemi aşağıdaki gibi ekleyerek var olanı geliştirmeme yardımcı oldu

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();

Ben OP AlertDialog.Builder kullanmak istemiyor izlenimi aldım. OP bir kısayol yardımcı programı olup olmadığını bilmek wats,
walrii

1
Ben aynı kodu yazdım ama önce NO görünür ve sonra YES temelde bir NO / YES iletişim kutusu ama bir YES / NO iletişim kutusuna ihtiyacım var Nasıl yaparım
Sagar Devanga

EVET / HAYIR / HAYIR / EVET ile ilgili olarak şu yanıta bakın: stackoverflow.com/a/13644589/1815624 bu yanıtta açıklandığı gibi kullanabilirsiniz: stackoverflow.com/a/13644536/1815624
CrandellWS

4

Kotlin'de:

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()

3

İletişim kutusunu anonim olarak komut zinciri olarak ve başka bir nesne tanımlamadan göster:

 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();

2

Buradaki tüm cevaplar uzun ve okuyucu dostu olmayan bir kodla kaynar: sadece sorduğu kişinin kaçınmaya çalıştığı şey. Bana göre en kolay yaklaşım burada lambda kullanmaktı:

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();

Android'deki Lambdas, retrolambda eklentisini ( https://github.com/evant/gradle-retrolambda ) gerektirir , ancak yine de daha temiz kod yazarken son derece yararlıdır.


1

Teşekkürler. Ben API Düzey 2 (Android 1.1) ve yerine kullanmak BUTTON_POSITIVEve BUTTON_NEGATIVEi kullanmak zorunda BUTTON1ve BUTTON2.


1

1.Create AlertDialog set mesajı, başlık ve Pozitif, Negatif Düğme:

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();

Şimdi DialogInterface üzerinde her iki düğmeyi de bulun ve ardından setOnClickListener () öğesine tıklayın:

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. uyarı göstermek için:

alertDialog.show();

Not: AlertDialog ile Nihai Anahtar Kelimeyi unutmayın.


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();  

0

kararlar için genel bir çözüm uygulayabilir ve yalnızca evet / hayır için değil başka bir durumda da kullanabilir ve uyarıyı animasyonlar veya düzen ile özelleştirebilirsiniz:

Böyle bir şey; önce transfer verileri için sınıfınızı oluşturun:

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

Sonucu döndürmek için bir arabirimden sonra

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

Artık kolayca erişim için bir araç oluşturabilirsiniz (bu sınıfta uyarı için farklı animasyon veya özel düzen uygulayabilirsiniz):

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

ve aktivite veya fragmandaki son çağrı; bunu sizin durumunuzda veya başka bir görev için kullanabilirsiniz:

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

0

Kotlin'de bunu çok kolay yapabilirsiniz:

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

0

For KOTLIN Android'de ::

    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()
    } 

0

Kotlin uygulaması.

Bunun gibi basit bir işlev oluşturabilirsiniz:

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()
    }

ve şöyle deyin:

dialogYesOrNo(
  this,
  "Question",
  "Would you like to eat?",
  DialogInterface.OnClickListener { dialog, id ->
    // do whatever you need to do when user presses "Yes"
  }
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.