Android Ders 8 : AlertDialog ve ProgressDialog Kullanımı




Merhaba arkadaslar , bugün Android içerisinde yine sıkça kullanılan iki View nesnesinden bahsedicem .
Bunlar AlertDialog ve ProgressDialog olacak . Öncelikle bu iki View nesnesi hakkında biraz bilgi verelim .
  • AlertDialog : Bir işlem yaparken kullanıcaya son olarak işlemin gerçekleşmesi için onay istemek için kullanılır . Mesela bir dosya silmek yada bir dosya indirmek  ( ki bugün biz bunu yapıcaz :) ) gibi durumlarda kullanıcıya sunulan ve genellikle Evet/Hayır şeklinde gösterilen bir view nesnesidir .
  • ProgressDialog  : Arka planda herhangi uzun bir işlem yaparken kullanıcı sıkılmasın ve programın çalışıtıgı görsün diye ekranda işlem yapılıyor tarzında bir yapı gösteren ve bu yapıyı işlem sonunda işlem tamamlandı tarzı bilgi mesajı veren bir view nesnesidir .
* Evet arkadaslar kısaca bilgi verdikten sonra uygulamamıza bir göz atalım . Uygulamamızın senaryosu ; Layoutumuzda bulunan "Download" butonuna tıklandıgında ekrana "Dosya İndirme İşlemini Gerçekleştirmek İstiyormusunuz ? " sorusunu yonelten bir AlertDialog kullacagız . Bu AlertDialog Evet/Hayır butonları olacak ve seçilen butona göre gerekli işlemleri yapıcaz . Evet seçilirse "İndirme başladı" diye bilgi gösterdikten sonra ProgressDialog^umuzu ekranda gösterip onu belli bir zaman aralıgı ile güncelleyecegiz . Hayır seçilirse "İndirme İptal Edildi .." diye mesaj vericez . Hemen başlayalım ..
* Öncelikle activity_main.xml ile başlayalım ;
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}" >

    TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="50dp"
        android:text="Dosyayı indirmek için Download Butonuna basınız .."
        android:textAppearance="?android:attr/textAppearanceLarge" />

    Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="25dp"
        android:text="Download" />

RelativeLayout>
 * Yukarda gördügünüz gibi arkadaslar , Layoutumzda bir TextView ve bir Button bulunmakta .
* Geçelim Java kodumuza , şöyle ki ;
package com.example.alerdialogandprogresbarexample;

import java.util.Random;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

 public static final int MAX_PROGRESS = 100;
 public static final String DIALOG_MESSAGE = "Arkanıza yaslanın ve indirmenin bitmesini bekleyin :)";
 Random random;
 Button btnDownload;
 TextView txtInfo;
 ProgressDialog progressDialog;
 Context context = this;

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

  /*
   * Çaycı! , getir ilaç kokulu çay'dan , Dakika düşelim senelik paydan ..
   * Nfk
   */

  random = new Random();
  btnDownload = (Button) findViewById(R.id.button1);
  txtInfo = (TextView) findViewById(R.id.textView1);

  btnDownload.setOnClickListener(clickDownload);

 }

 OnClickListener clickDownload = new OnClickListener() {

  @Override
  public void onClick(final View v) {
   // TODO Auto-generated method stub
   final AlertDialog.Builder alertDialog = new AlertDialog.Builder(
     context);
   alertDialog.setTitle("Dosya İndirme!");
   alertDialog
     .setMessage("Download işlemini gerçekleştirmek istiyormusunuz?");
   alertDialog.setPositiveButton("Evet",
     new DialogInterface.OnClickListener() {

      @Override
      public void onClick(final DialogInterface dialog,
        final int which) {
       // TODO Auto-generated method stub
       Toast.makeText(context, "Dosya İndirme Başladı..",
         Toast.LENGTH_SHORT).show();
       dialog.dismiss();
       showProgress();

      }
     });
   alertDialog.setNegativeButton("Hayır",
     new DialogInterface.OnClickListener() {

      @Override
      public void onClick(final DialogInterface dialog,
        final int which) {
       // TODO Auto-generated method stub
       Toast.makeText(context,
         "Dosya İndirme İptal edildi..",
         Toast.LENGTH_SHORT).show();
       dialog.dismiss();
      }
     });

   alertDialog.show();
  }
 };

 public void showProgress() {

  /*
   * Alper Gencer …seni çay içerken izlemek, seni çay doldururken, seni
   * demlerken çayı, kimseler inanmasa da düpedüz sevap…
   */

  progressDialog = new ProgressDialog(context);
  progressDialog.setMessage(DIALOG_MESSAGE);
  progressDialog.setCancelable(true);
  progressDialog.setMax(100);
  progressDialog.setProgress(0);
  progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  progressDialog.show();

  final Thread thread = new Thread() {
   int status = 0;

   @Override
   public void run() {

    try {
     while (status <= MAX_PROGRESS) {
      Thread.sleep(1000);
      status += random.nextInt(20);
      progressDialog.setProgress(status);
     }
     progressDialog.setProgress(100);
     Thread.sleep(1000);
     progressDialog.dismiss();
    } catch (final Exception e) {

    }

   }

  };

  thread.start();
 }

}
* Şimdi sıra ile neler yaptık bir bakalım ;
public static final int MAX_PROGRESS = 100;
public static final String DIALOG_MESSAGE = "Arkanıza yaslanın ve indirmenin bitmesini bekleyin :)";
Random random;
Button btnDownload;
TextView txtInfo;
ProgressDialog progressDialog;
Context context = this;
  1. İlk olarak MAX_PROGRESS diye bir int sayı tanımladık. Bunu ProgressDialog üzerinde gösterecegimiz indirme yüzdesinin max değeri için kullanıcaz .
  2. Yine İndirme işleminde kullanıcıya bir msj ile verdik DIALOG_MESSAGE sayesinde .
  3. Java'daki random sınıfından bir nesne olusturduk . Bunu ProgressDialog'u güncellemede rastgele bir sayı üretmek için  kullanıcaz .
  4. Son olarak TextView , ProgressDialog ve Content nesnelerimizi olusturduk .
* Devam edelim ,
random = new Random();
btnDownload = (Button) findViewById(R.id.button1);
txtInfo = (TextView) findViewById(R.id.textView1);

btnDownload.setOnClickListener(clickDownload);
* Yukarıda random nesnemizi , butonumuzu ve textView nesnemiz ile iletişime geçtik . TextView nesnesi ile işimiz olmadıgında declare etmeyebilirdik de size kalmış birşey :) . Son olarak Download butonumuzun tıklanma olayını dinliyoruz . clickDownload arabirimi ile butonumuzun tıklandıgında neler yapmışız bir bakalım ;
OnClickListener clickDownload = new OnClickListener() {

  @Override
  public void onClick(final View v) {
   // TODO Auto-generated method stub
   final AlertDialog.Builder alertDialog = new AlertDialog.Builder(
     context);
   alertDialog.setTitle("Dosya İndirme!");
   alertDialog.setMessage("Download işlemini gerçekleştirmek istiyormusunuz?");
   alertDialog.setPositiveButton("Evet",
     new DialogInterface.OnClickListener() {

      @Override
      public void onClick(final DialogInterface dialog,
        final int which) {
       // TODO Auto-generated method stub
       Toast.makeText(context, "Dosya İndirme Başladı..",
         Toast.LENGTH_SHORT).show();
       dialog.dismiss();
       showProgress();

      }
     });
   alertDialog.setNegativeButton("Hayır",
     new DialogInterface.OnClickListener() {

      @Override
      public void onClick(final DialogInterface dialog,
        final int which) {
       // TODO Auto-generated method stub
       Toast.makeText(context,
         "Dosya İndirme İptal edildi..",
         Toast.LENGTH_SHORT).show();
       dialog.dismiss();
      }
     });

   alertDialog.show();
  }
 };
* AlertDialog olayına burada giriyoruz arkadaslar , neler yaptık bir bakalım ;
  1. Öncelikle bir AlertDialog.Builder nesnesi olusturduk .
  2. Daha sonra setTitle() ile kullanıcıya soracagımız sorunun başlıgını belirledik .
  3. setMessage() ile sorumuzu ayarladık .
  4. Daha sonra gördügünüz gibi iki tane uzun method yazdık . Gözünüz korkmasın oldukça basitler :) .
    alertDialog.setPositiveButton
    alertDialog.setNegativeButton
    ile Positif ve Negatif butonlarımızı olusturduk . Bu methodlar 2 parametre almakta . İlk parametre Butonun text özelliği , ikinci parametre ise bu butonun tıklanma olayın dinleyen arabirim .
  5. Evet butonumuzun onClick olayına ise "İndirme başladı " diye mesaj gosterdikten sonra dialogu ekrandan kaldıran dismiss() methodunu kullandık . Ve daha sonra İndirme işleminin yapılacağı methodu çağırdık .
  6. Hayır butonumuzun onClick olayında ise herhangi bir işleme kullanıcı izin vermediği için sadece "İndirme iptal edildi" mesajını verdik .
* Evet arkadaslar , Dialog alanımzdaki Evet butonuna basıldıgında İndirme işleminin gerçekleşeceği methodu çağırdık dedik . Şimdi ona bir bakalım ;
public void showProgress() {

  /*
   * Alper Gencer …seni çay içerken izlemek, seni çay doldururken, seni
   * demlerken çayı, kimseler inanmasa da düpedüz sevap…
   */

  progressDialog = new ProgressDialog(context);
  progressDialog.setMessage(DIALOG_MESSAGE);
  progressDialog.setCancelable(true);
  progressDialog.setMax(100);
  progressDialog.setProgress(0);
  progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  progressDialog.show();

  final Thread thread = new Thread() {
   int status = 0;

   @Override
   public void run() {

    try {
     while (status <= MAX_PROGRESS) {
      Thread.sleep(1000);
      status += random.nextInt(20);
      progressDialog.setProgress(status);
     }
     progressDialog.setProgress(100);
     Thread.sleep(1000);
     progressDialog.dismiss();
    } catch (final Exception e) {

    }

   }

  };

  thread.start();
 }
* Uzun gibi görünen ama aslında basit olan methodda ne yaptık bir bakalım ;
progressDialog = new ProgressDialog(context);
progressDialog.setMessage(DIALOG_MESSAGE);
progressDialog.setCancelable(true);
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.show();
  1.  Öncelikle ProgressDialog nesnemizi olusturduk . Constructor da ise sınıfımızın Context bilgisini verdik .
  2. progressDialog.setMessage() ile indirme olayının mesajını ayarladık . Mesajımızı hatırlayacak olursak , şöyle idi : Arkanıza yaslanın ve indirmenin bitmesini bekleyin :)
  3. setCancelable(true); ile kullanıcın indirme işlemini iptal edebilmesine izin verdik . Eğer geri tuşuna basarsa progressDialog ekrandan kaybolacak.
  4. setMax() ile indirme çubugunun max boyutunu , setProgress() ile de başlangıç durumunu ayarladık .
  5. Methodu ile progressDialog stilimizi belirledik.
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  6. Son olarak progressDialog^u show() methodu ile gösterdik .
* Gelelim progressDialog'umuzu güncelleme olayına, şöyle ki  ;
final Thread thread = new Thread() {
   int status = 0;

   @Override
   public void run() {

    try {
     while (status <= MAX_PROGRESS) {
      Thread.sleep(1000);
      status += random.nextInt(20);
      progressDialog.setProgress(status);
     }
     progressDialog.setProgress(100);
     Thread.sleep(1000);
     progressDialog.dismiss();
    } catch (final Exception e) {
                                    //Hata bilgisi
    }

   }

  };

  thread.start();
* Güncelleme olayında bir Thread yapısı kullandım  , farklı yolları da var . Handler ve Runnable yapısını kullanmak gibi .Bu daha basit gözüktüğünden bu şekilde yapmak istedim :) . Neler yaptık bir bakalım .
  1. ProgressDialogu güncellemek için bir int değeri tutuyoruz .
  2. run() methodunda ise bir try-catch yapısı mevcut . Bunu kullanmak zorundayız , Thread.sleep(1000); methodundan dolayı compiler bizi buna zorluyor. Bu checked exception türü oldugu icin bu tür işlemlerde try-catch yapısı kullanmak mecburiyetindeyiz . Unchecked exceptionlarda ise boyle bir zorlama yoktur . Neyse fazla girmeyelim bu konulara Java yazılarında bolca konusuruz bunları :)
  3. While döngüsünü status değermizin MAX_PROGRESS yani 100 den küçük oldugu sürece devam ettiriyoruz .
  4. Thread.sleep(1000) ile 1 sn aralıklarla ilerleme çuğumuzu güncelliyoruz .
  5. Bu iki method ile random olarak yeni üretilen sayıyı status'a ekliyor ve ilerleme çubuğumuzu güncelliyoruz .
    status += random.nextInt(20);
    progressDialog.setProgress(status);
  6. Bu arada random.nextInt(20) ile 0..19 arasında rastgele bir sayı alıyoruz arkadaslar .
  7. While döngüsünden çıktımızda son olarak ilerleme çubuğunu güncelliyoruz . Bunu örneğin şu durum için kullandım ; Status 95 oldugunda ve randomdan gelen sayı +5 oldugu için while dongumuz dışına çıkılacak ama kullanıcı ilerleme çubugunda 95/100 yazısını görücek . Bizde son olarak progress^i 100'e set ederek kullanıcıya net bilgi veriyoruz :) ve tekrar 1 sn bekleyerek bunun kullanıcı tarafından görünmesini sağlıyoruz .
  8. Son olarak arkadaslar thread^ı start() ederek başlatıyoruz .
* Yazımızın sonuna geldik arkadaslar , faydalı olması dileğiyle :)
* Kodların arasında kod olmayan bir iki söz dikkatinizi çekmiştir belki . Bunları notlarımın arasına alıyordum artık kodlarımın arasına alıcam . Bu düşünceyi zihnimde setVisible(true); eden Mert Çeltikoğlu^na teşekkürler :)  . Dileyen onlardan da istifade edebilir .
* Mutlu Kalın , Kod'la kalın ve bol bol Çay için ...
* Birkaç çıktı verelim ;
2014-05-27 04:00:44
2014-05-27 04:01:152014-05-27 04:01:39
Kaynak
http://alicanakkus.blogspot.com.tr/2014/05/alertdialog-ve-progressdialog-kullanm.html
Google Plus ile Paylaş

Kısaca: seymanblog

Panelde şablon düzenle deyip, bu satırı aratarak buraya kısaca hakkımda yazısı yazabilirsiniz.
    BLOGGER YORUMLARI
    FACEBOOK YORUMLARI

0 yorum:

Yorum Gönder