AlertDialog

[Reference]

AlertDialog sınıfı bir dialog penceresi oluşturmaya yarayan bir sınıftır. Toast sınıfından farklı olarak bu sınıf kullanıcıyla doğrudan etkileşim halindedir.AlertDialog sınıfı diğer sistemlerde .Net'teki MessageBox Swing içerisindeki JoptionPane penceresine benzemektedir.

AlertDialog sınıfı türünden bir nesne yaratmak için AlertDialog.Builder sınıfı kullanılmalıdır. Bu sınıf türünden nesne için çeşitli belirlemeler yapılarak create isimli metod çağrılır ve nesne yaratılır.AlertDialog.Builder sınıfının constructoru hangi activity için AlertDialog oluşturulacağını bildirmektedir.

[DROPBOX]055-AlertDialog

24NISAN

AlertDialog.Builder sınıfının metodları aynı referansa geri dönmektedir.Dolayısıyla bu metodlar zincir (fluent) halinde geri dönmektedir.

AlertDialog penceresinin genel olarak 3 bölümü vardır.

  1. Title
  2. Content Area
  3. Buttons

Bir başlığı bir de üzerindeki mesaja ilişkin yazı olan bir AlertDialog aşağıdaki gibi yaratılabilir:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog dlg = builder.setTitle("Uyarı").setMessage("Bu bir uyarıdır").create();
dlg.show();

Burada setTitle ve setMessage metodları ve diğer tüm String parametreli metodlar argümanlarını String kaynağından da alabilirler.Buna ilişkin int türünden parametreli versiyonları da bulunmaktadır.

Dialog pencerisin butonları negative positive ve neutral olarak ayrılmaktadır.Positif buton genel olarak kabul etme amaçlı , Negatif buton da red etmeyi temsil etmektedir.Nötr buton ise genel durumlu bir buton ve ya iptal işlemi için düşünülmüştür.

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

        builder.setPositiveButton(R.string.alertposbutton, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getBaseContext(), "Evet", Toast.LENGTH_SHORT).show();
            }
        });

        builder.setNegativeButton(R.string.alertnegbutton, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getBaseContext(), "Hayır", Toast.LENGTH_SHORT).show();
            }
        });

        builder.setNeutralButton(R.string.alertneutbutton, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getBaseContext(), "İptal", Toast.LENGTH_SHORT).show();
            }
        });

        AlertDialog dlg = builder.setTitle(R.string.alerttitle).setMessage(R.string.alertmessage).create();

        dlg.show();

AlertDialog sınıfına ilişkin pencereye bir liste eklenebilir.Bunun için setItems metodları kullanılmalıdır. setItems metodlarının ilgili listede gözükecek yazıya ilişkin bir yazı olan ve dizi kaynağı olan parametereli versiyonları bulunmaktadır.

Anahtar Notlar : Java kütüphanesi ve android kütüphanesinde charSequence isimli bir arayüz bulunmaktadır.Bu arayüz char türden dizilimler için genel amaçlı kullanımlar için düşünülmüştür.Char türden dizilimler; char türden diziler String türünden işlemler için düşünülmüştür.

String sınıfı da Charsequence arayüzü implemente etmiş bir sınıftır.


setItem metodu AlertDialog penceresinin Content bölümüne ekleme yapar.

setItem metoduyla eklenen elemanin click işlemine ilişkin kod şöyle kurgulanabilir.

public void onClick(DialogInterface dialog, int which) {
                ListView lv = (ListView) ((AlertDialog) dialog).getListView();
                Toast.makeText(getBaseContext(), lv.getItemAtPosition(which).toString(), Toast.LENGTH_LONG).show();
            }

onClick metodunun dialog türünden parametresi bu metod için AlertDialog türünü dinamik olarak göstermektedir.Bu durumda programcı downCasting yaparak AlertDialog türüyle çalışabilir. Burada diğer bir yöntem eklenen diziye erişmektir.Şüphesiz bunun için dizinin uygun şekilde erişilebilecek şekilde tasarımı yapılmalıdır.

Programcı isterse ContentArea bölümüne eklenen listeyi "Checkable" yapabilir.Bunun iiçin setSingleChoiceItem ve ya setMultiChoiceItems metodlarını çağırabilir

[DROPBOX]056-AlertDialogMultiChoice

ListView içerisinde dolaşım yapmak için SpareBooleanArray ya da aşağıdaki gibi bir kullanım tercih edilebilir.

chehkedTextView ve ya AppCompatCheckedTextView kullanılabilir.

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ListView lv = ((AlertDialog) dialog).getListView();

                String str = "";
                for (int i = 0; i < lv.getChildCount(); ++i) {
                    CheckedTextView chk = (CheckedTextView) lv.getChildAt(i);

                    if (chk.isChecked()) {
                        if (!str.equals(""))
                            str += ",";

                        str += chk.getText().toString();
                    }
                }

                m_editTextLangs.setText(str);
            }
        });

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

            }
        });

Bir layout xml dosyası da AlertDialog sınıfına iliştirilebilmektedir.Bunun için layoutInflater nesnesi gerekmektedir. layoutInflater nesnesi Context sınıfının getView metodu ve getInflater metodu ile elde edilebilmektedir.

[DROPOX]057-LoginAlertDialog

Android Studio içerisinde bir xml dosyası kolaylıkla eklenmeketedir.

NOTLARIM [DROPOX]057-LoginAlertDialog ne yapar?7

Verilen xml dosyasindaki layout tasarımını AlertDialog'a uygular.

AlertDialog sınıfı için pozitif ve negatif butonlar dismiss işlemi yaparlar.Yani programcı tekrar aynı builderi kullanarak alert dialog nesnesi elde edemez.Tekrar gerekli elemanları oluşturup AlertDialog nesnesini create diyerek tekrar yaratmalıdır. Ya da türetme yaparak tüm bunları sarmalayabilir.

Ancak programcı istersen Builderi saklamak yerine AlertDialog türünden nesneyi saklayabilir.AlertDialog saklanırsa sürekli aynı nesne kullanılabilir.

AlertDialog üzerindeki kontrollere ilişkin bilgiler almak için en iyi yerler ya create edildikten sonra ya da ilgili butonların onClick metodlarında ele almaktır.Burada AlertDialog sınıfın findViewbyId metodu kullanılır. AlertDialog bağlandığı activity nesnesinin mesaj kuyruğunu kullanmaktadır.Dolayısıyla bağlı olduğu activitye ait her türlü işlem yapılabilir. Yani AlertDialog ve bağlı olduğu activity aynı Thread içerisinde çalışabilmektedir.

setView metodu ile daha önce dinamik olarak oluşturulmuş olan ve ya View referansı elde olan başka bir view nesnesi de iliştirilebilir.

[DROPBOX]058-CustonDialog