14 Şubat 2018 Çarşamba

Android Dersleri 23 - Dialogs

3 - Dialogs

https://github.com/Eajy/MaterialDesignDemo
DialogInterface class'ı şu 2 method'a sahiptir, bu method'lar çağırılınca gösterilen dialog kaybolur.
public void cancel()
Cancels the dialog, invoking the DialogInterface.OnCancelListener. This is essentially the same as calling dismiss(), but it will also call your DialogInterface.OnCancelListener (if registered).
public void dismiss()
Dismisses the dialog, invoking the DialogInterface.OnDismissListener.

Difference between cancel() and dismiss() methods : Typically, a dialog is dismissed when its job is finished and it is being removed from the screen. A dialog is canceled when the user wants to escape the dialog and presses the Back button.

For example, you have a standard Yes/No dialog on the screen. If the user clicks No, then the dialog is dismissed and the value for No is returned to the caller. If instead of choosing Yes or No, the user clicks Back to escape the dialog rather than make a choice then the dialog is canceled and no value is returned to the caller.

DialogInterface class'ı ayrıca şu 6 inner class'a sahiptir :




Example 1 :


activity_main.xml : Ekrana sığmayacak kadar çok buton koyacağımız için root view olarak NestedScrollView'i kullandık.
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
       android:paddingBottom="@dimen/activity_vertical_margin"
       android:paddingLeft="@dimen/activity_horizontal_margin"
       android:paddingRight="@dimen/activity_horizontal_margin"
       android:paddingTop="@dimen/activity_vertical_margin">

       <Button
           android:id="@+id/btn_dialog_1"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:backgroundTint="#F44336"
           android:padding="@dimen/btn_padding"
           android:text="@string/main_dialog_simple"
           android:textColor="@color/white"
           android:textSize="14sp" />

       <Button
           android:id="@+id/btn_dialog_2"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_marginTop="@dimen/btn_margin"
           android:backgroundTint="#E91E63"
           android:padding="@dimen/btn_padding"
           android:text="@string/main_dialog_simple"
           android:textColor="@color/white"
           android:textSize="14sp" />

       <Button
           android:id="@+id/btn_dialog_3"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_marginTop="@dimen/btn_margin"
           android:backgroundTint="#9C27B0"
           android:padding="@dimen/btn_padding"
           android:text="@string/main_dialog_single_choice"
           android:textColor="@color/white"
           android:textSize="14sp" />

   </LinearLayout>
</android.support.v4.widget.NestedScrollView>

MainActivity.java : MainActivity class'ında bu butonlara listener register ederiz. MainActivity class'ı View.OnClickListener'I implement eder su sayede bu class içerisinde onClick() method'unu override edebiliriz. onClick() method'unda switch case kullanarak hangi butona tıklandığını anlarız.
1. butona tıklanmışsa, aşağıdaki kod ile basit bir dialog gösterilir. setMessage method'u ile dialog'un body'sinde gösterilecek text'i set ederiz. setIcon() method'u ile default bir image olan ic_dialog_alert.png'yi set ederiz, setPositive() method'u ile dialog'daki OK'a tıklayınca ne yapılacağını belirtiriz:
new AlertDialog.Builder(MainActivity.this)
                       .setMessage(getString(R.string.main_dialog_simple_title))
                       .setPositiveButton(getString(R.string.dialog_ok), null)
                       .setIcon(android.R.drawable.ic_dialog_alert)
                       .show();
Dialog şöyle gözükür :


2. butona tıklanırsa aşağıdaki kod ile icon'u, başlığı ve 2 farklı seçim butonu olan bir dialog gösterilir,show() method'unu çağırmak zorundayız aksi takdirde dialog gözükmez:
new AlertDialog.Builder(MainActivity.this)
       .setTitle(getString(R.string.main_dialog_simple_title))
       .setMessage(getString(R.string.main_dialog_simple_message))
       .setPositiveButton(getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
               Toast.makeText(MainActivity.this, "Positive button is clicked!", Toast.LENGTH_LONG).show();
               dialog.cancel(); // cancel ve dismiss ayni isi yapar.
           }
       } )
       .setNegativeButton(getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
               Toast.makeText(MainActivity.this, "Positive button is clicked!", Toast.LENGTH_LONG).show();
               dialog.dismiss(); // cancel ve dismiss ayni isi yapar.
           }
       } )
       .setIcon(R.drawable.omer)
       .show();
Dialog şöyle gözükür :
 


3.butona tıklanırsa aşağıdaki kod ile başlığı ve radio button'ları olan bir dialog gösterilir.  setSingleChoiceItems() method'u radio button gösterilmesini sağlar, bu method'un 1. parametresi gösterilecek item'ları içeren array'dir, 2. parametresi dialog ilk açıldığında default olarak seçili gelecek olan item'ı belirtir, 3.parametresi ise radioButton'lardan birine tıklayınca çağırılacak listener object'dir, bu object'in onClick() method'unun 2. parametresi kaçıncı radioButton'ına tıklandığını gösterir :
final String[] singleChoiceItems = getResources().getStringArray(R.array.dialog_choice_array);
int itemSelected = 0; // baslangicta 0. item'in secili olmasını soyledik.
new AlertDialog.Builder(MainActivity.this)
       .setTitle(getString(R.string.main_dialog_single_choice))
       .setSingleChoiceItems(singleChoiceItems, itemSelected, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialogInterface, int i) {
               Toast.makeText(MainActivity.this, singleChoiceItems[i] + " selected !", Toast.LENGTH_LONG).show();
           }
       })
       .setPositiveButton( getString(R.string.dialog_ok ), new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
               Toast.makeText(MainActivity.this, "Positive button is clicked!", Toast.LENGTH_LONG).show();
               dialog.dismiss(); // cancel ve dismiss ayni isi yapar.
           }
       } )
       .setNegativeButton(getString(R.string.dialog_cancel), null)
       .show();
   


4.butona tıklanırsa aşağıdaki kod ile başlığı ve checkbox'ları yani multichoiceItem'ları olan bir dialog gösterilir.  
setMultiChoiceItems() method'u checkbox gösterilmesini sağlar, bu method'un 1. parametresi gösterilecek item'ları içeren array'dir, 2. parametresi dialog ilk açıldığında default olarak seçili gelecek olan item'ları belirten bir Boolean array'dir, 3.parametresi ise checkbox'lardan birine tıklayınca çağırılacak listener object'dir, bu object'in onClick() method'unun 2. parametresi kaçıncı checkbox'a tıklandığını gösterir,3. parametresi ise tıklanılan checkbox'ın checked mi unchecked mi olduğunu gösterir :
final String[] multiChoiceItems = getResources().getStringArray(R.array.dialog_choice_array);
boolean[] checkedItems = {true, false, false, false, false}; // baslangicta checked olan item'lar.
new AlertDialog.Builder(MainActivity.this)
       .setTitle(getString(R.string.main_dialog_multi_choice))
       .setMultiChoiceItems(multiChoiceItems, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which, boolean isChecked) {
               Toast.makeText(MainActivity.this, multiChoiceItems[which] + " : " + isChecked , Toast.LENGTH_LONG).show();
           }
       })
       .setPositiveButton(getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               Toast.makeText(MainActivity.this, " You clicked positive button ! which : " + which , Toast.LENGTH_LONG).show();
           }
       })
       .setNegativeButton(getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               Toast.makeText(MainActivity.this, " You clicked negative button ! which : " + which , Toast.LENGTH_LONG).show();
           }
       })
       .show();


     


Full source codes of MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

   private Button btn_dialog_1, btn_dialog_2, btn_dialog_3, btn_dialog_4;
   Calendar calendar;

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

       btn_dialog_1 = (Button) findViewById(R.id.btn_dialog_1);
       btn_dialog_2 = (Button) findViewById(R.id.btn_dialog_2);
       btn_dialog_3 = (Button) findViewById(R.id.btn_dialog_3);
       btn_dialog_4 = (Button) findViewById(R.id.btn_dialog_4);

       calendar = Calendar.getInstance();

       btn_dialog_1.setOnClickListener(this);
       btn_dialog_2.setOnClickListener(this);
       btn_dialog_3.setOnClickListener(this);
       btn_dialog_4.setOnClickListener(this);
   }

   @Override
   public void onClick(View view) {
       switch (view.getId()) {
           case R.id.btn_dialog_1:
               /*AlertDialog.Builder() constructor'inin 1. argument'i getApplicationContext() idi ve su hatayi aliyordum :
               * You need to use a Theme.AppCompat theme (or descendant) with this activity.
               * 1. argument'e MainActivity.this verince sorun duzeldi.
               * */
               new AlertDialog.Builder(MainActivity.this)
                       .setMessage(getString(R.string.main_dialog_simple_title))
                       .setPositiveButton(getString(R.string.dialog_ok), null)
                       .setIcon(android.R.drawable.ic_dialog_alert)
                       .show();
               break;

           case R.id.btn_dialog_2:
               new AlertDialog.Builder(MainActivity.this)
                       .setTitle(getString(R.string.main_dialog_simple_title))
                       .setMessage(getString(R.string.main_dialog_simple_message))
                       .setPositiveButton(getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int which) {
                               Toast.makeText(MainActivity.this, "Positive button is clicked!", Toast.LENGTH_LONG).show();
                               dialog.cancel(); // cancel ve dismiss ayni isi yapar.
                           }
                       } )
                       .setNegativeButton(getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int which) {
                               Toast.makeText(MainActivity.this, "Positive button is clicked!", Toast.LENGTH_LONG).show();
                               dialog.dismiss(); // cancel ve dismiss ayni isi yapar.
                           }
                       } )
                       .setIcon(R.drawable.omer)
                       .show();
               break;
           case R.id.btn_dialog_3:
               final String[] singleChoiceItems = getResources().getStringArray(R.array.dialog_choice_array);
               int itemSelected = 0; // baslangicta 0. item'in secili olmasını soyledik.
               new AlertDialog.Builder(MainActivity.this)
                       .setTitle(getString(R.string.main_dialog_single_choice))
                       .setSingleChoiceItems(singleChoiceItems, itemSelected, new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialogInterface, int i) {
                               Toast.makeText(MainActivity.this, singleChoiceItems[i] + " selected !", Toast.LENGTH_LONG).show();
                           }
                       })
                       .setPositiveButton(getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int which) {
                               Toast.makeText(MainActivity.this, "Positive button is clicked!", Toast.LENGTH_LONG).show();
                               dialog.dismiss(); // cancel ve dismiss ayni isi yapar.
                           }
                       } )
                       .setNegativeButton(getString(R.string.dialog_cancel), null)
                       .show();
               // Dialog'un ekranda gosterilmesi icin show() method'Unu cagirmak zorundayiz.
               // AlertDialog.Builder show() method'Unu çağırmadan önce create() method'unu da
               // cagirabilirdik ancak bu optional'dir, olmasa da olur.
               break;

           case R.id.btn_dialog_4:
               final String[] multiChoiceItems = getResources().getStringArray(R.array.dialog_choice_array);
               boolean[] checkedItems = {true, false, false, false, false}; // baslangicta checked olan item'lar.
               new AlertDialog.Builder(MainActivity.this)
                       .setTitle(getString(R.string.main_dialog_multi_choice))
                       .setMultiChoiceItems(multiChoiceItems, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                               Toast.makeText(MainActivity.this, multiChoiceItems[which] + " : " + isChecked , Toast.LENGTH_LONG).show();
                           }
                       })
                       .setPositiveButton(getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               Toast.makeText(MainActivity.this, " You clicked positive button ! which : " + which , Toast.LENGTH_LONG).show();
                           }
                       })
                       .setNegativeButton(getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               Toast.makeText(MainActivity.this, " You clicked negative button ! which : " + which , Toast.LENGTH_LONG).show();
                           }
                       })
                       .show();
               break;
       }
   }
}


Example 2 ( 23_2_Dialogs )
: 1.örneğin üzerinden devam ettim:
ProgressDialog class :
The dialog can be made cancelable on back key press.
The progress range is 0 to max.
5.butona tıklayınca aşağıdaki kod çalışır :
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage(getString(R.string.main_dialog_progress_title));
progressDialog.show();
ProgressDialog object default olarak aşağıdaki gibi bir spinner gösterir ekranda. Aslında bu object'in style'ı aşağıdaki gibi set edilmiştir otomatik olarak. setMesssage() method'U ile dialog'daki text'i set ederiz. show() method'unun ise Dialog'un ekranda gösterilmesi için çağırılması zorunludur :
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
 


ProgressDialog class'ını kullanarak yukarıdaki gibi bir spinner da gösterebiliriz veya ProgressDialog object 'in setProgressStyle( ProgressDialog.STYLE_HORIZONTAL); method'unu çağırarak aşağıdaki gibi bir ProgressDialog da gösterebiliriz:
setMessage() method'u ile dialog'da bir text set ederiz, setCancelable(false) method'unu çağırarak dialog tamamlanmadan dialog'Un kapatılamamasını cancel edilememesini sağlarız, setMax(100) diyerek progress dialog'un 0-100 arasında çalışmasını sağlarız, show() method'unu çağırarak dialog'un ekranda görülmesini sağlarız.
Sonra bir thread yaratırız, bu thread'de progress isimli bir variable tanımlarız. Bir while döngüsü içerisinde :
horizontalProgressDialog.setProgress(progress);
ProgressDialog'un ilerlemesini ayarlarız sonra thread'i 35 saniye uyuturuz, progress variable 100 olunca yani progress dialog tamamen ilerleyince
horizontalProgressDialog.dismiss();
diyerek dialog'u ekrandan kaldırırız. Kodun tamamı aşağıdadır :
final ProgressDialog horizontalProgressDialog = new ProgressDialog(MainActivity.this);
horizontalProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
horizontalProgressDialog.setMessage(getString(R.string.main_dialog_progress_title));
horizontalProgressDialog.setCancelable(false);
horizontalProgressDialog.setMax(100);
horizontalProgressDialog.show();

new Thread(new Runnable() {
   int progress = 0;

   @Override
   public void run() {
       while (progress <= 100) {
           horizontalProgressDialog.setProgress(progress);
           if (progress == 100) {
               horizontalProgressDialog.dismiss();
           }
           try {
               Thread.sleep(35);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           progress++;
       }
   }
}).start();

DatePickerDialog class'ını kullanarak tarih seçilmesini sağlayan bir diyalog göstereceğiz. Bunu daha önce AlarmManager örneğinde de kullandık ve anlattık oraya da bakabilirsin. Önce bir calendar object yaratırız. Bu object'in get() method'larını çağırarak initial year, month ve day variable'ları elde ederiz, bu variable'ları DatePickerDialog() constructor'ının 3., 4. ve 5. parametrelerine veririz. Kullanıcının hangi yılı, ayı ve günü seçtiğini ise, onDateSet() method'unu 2., 3. ve 4. parametreleri gösterir, bunları kullanarak calendar object'imizin yılını ayını gününü set ederiz. En son, seçtiğimiz tarihi tarih seçmek için tıklanılan butonda gösteririz :
Calendar calendar = Calendar.getInstance();
int mYear =  calendar.get(Calendar.YEAR)  
int mMonth =  calendar.get(Calendar.MONTH)
int mDay =  calendar.get(Calendar.DAY_OF_MONTH)
DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
   @Override
   public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedday ) {
       calendar.set(Calendar.YEAR, selectedYear);
       calendar.set(Calendar.MONTH, selectedMonth);
       calendar.set(Calendar.DAY_OF_MONTH, selectedday);
       String date = selectedYear + "-" + (selectedMonth + 1) + "-" + selectedday;
       btn_dialog_7.setText(date);
   }
}, mYear , mMonth, mDay );
datePickerDialog.show();
    

TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
   @Override
   public void onTimeSet(TimePicker timePicker, int i, int i1) {
       
   }
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true);
timePickerDialog.show();


TimePicker Dialog :


TimerPickerDialog constructor'ının aldığı 1. parametre Context object'dir, 2.parametre new TimePickerDialog.OnTimeSetListener() çağırılarak yaratılan bir object alır. 3. ve 4. parametre initial hour ve initial minute'dür, 5.parametre ise 24 saatlik gösterim olup olmadığını gösterir.
3. ve 4. parametrenin ne olduğunu tam anlamadım Calendar class'ından bir instance yaratılıp bu instance'ın saat ve dakikası elde edilip 3. ve 4.argument olarak verilir. Kullanıcının seçtiği zaman değildir bu parametreler.
Kullanıcının seçtiği zaman nedir? 2.parametredeki listener object'in onTimeSet() method'unun aldığı 2. ve 3. parametre'lerdir. Kullanıcı bunları seçince bir TextView'i set ederek kullanıcının gösterdiği zamanı textview'de gösteririz.

final Calendar c = Calendar.getInstance();
mHour_4 = c.get(Calendar.HOUR_OF_DAY);
mMinute_4 = c.get(Calendar.MINUTE);
// Launch Time Picker Dialog
TimePickerDialog timePickerDialog = new TimePickerDialog( MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
       @Override
        public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
c.set(Calendar.HOUR_OF_DAY, selectedHour);
        c.set(Calendar.MINUTE, selectedMinute);
       btn_dialog_8.setText(selectedHour + ":" + selectedMinute);
        }
     }, mHour_4, mMinute_4, true);

timePickerDialog.show();


TimePickerDialog
TimePickerDialog (Context context,
         TimePickerDialog.OnTimeSetListener listener,
               int hourOfDay,
               int minute,
               boolean is24HourView)
Creates a new time picker dialog with the specified theme. The theme is overlaid on top of the theme of the parent context. If themeResId is 0, the dialog will be inflated using the theme specified by theandroid:timePickerDialogTheme attribute on the parent context's theme.
Parameters
context
Context: the parent context
themeResId
int: the resource ID of the theme to apply to this dialog
listener
TimePickerDialog.OnTimeSetListener: the listener to call when the time is set
hourOfDay
int: the initial hour
minute
int: the initial minute
is24HourView
boolean: Whether this is a 24 hour view, or AM/PM.


Bu dersin geri kalan kısmını okumak için bu dersin tamamını içeren pdf'i link'ten indirebilirsiniz :
https://drive.google.com/open?id=1_J_OAP8nrZqBCJdfOtQR6aZ2Z3Ri13wxEVDGDyB2CTE

Hiç yorum yok:

Yorum Gönder