İletişim kutuları

Oluşturma yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'da bileşenleri nasıl ekleyeceğinizi öğrenin.

İletişim kutusu, kullanıcının karar vermesini veya ek bilgiler girmesini isteyen küçük bir penceredir. İletişim kutusu ekranı doldurmaz ve normalde kullanıcıların devam edebilmeleri için bir işlem yapmalarını gerektiren kalıcı etkinlikler için kullanılır.

Temel iletişim kutusunu gösteren resim
Şekil 1. Temel bir iletişim kutusu.

Dialog sınıfı, iletişim kutuları için temel sınıftır ancak Dialog öğesini doğrudan örneklendirmez. Bunun yerine, aşağıdaki alt sınıflardan birini kullanın:

AlertDialog
Başlık, en fazla üç düğme, seçilebilir öğelerin listesi veya özel bir düzen gösterebilen iletişim kutusu.
DatePickerDialog veya TimePickerDialog
Kullanıcının tarih veya saat seçebilmesini sağlayan, önceden tanımlanmış kullanıcı arayüzünün bulunduğu bir iletişim kutusu.

Bu sınıflar iletişim kutunuzun stilini ve yapısını tanımlar. Ayrıca, iletişim kutunuz için kapsayıcı olarak bir DialogFragment öğesine ihtiyacınız vardır. DialogFragment sınıfı, Dialog nesnesinde yöntemler çağırmak yerine iletişim kutunuzu oluşturmak ve görünümünü yönetmek için ihtiyacınız olan tüm denetimleri sağlar.

İletişim kutusunu yönetmek için DialogFragment kullanılması, kullanıcının Geri düğmesine dokunması veya ekranı döndürmesi gibi yaşam döngüsü etkinliklerini doğru şekilde işlemesini sağlar. DialogFragment sınıfı, iletişim kutusu kullanıcı arayüzünün büyük ve küçük ekranlarda farklı görünmesini istediğiniz durumlarda olduğu gibi, iletişim kutusu kullanıcı arayüzünü geleneksel Fragment gibi daha büyük bir kullanıcı arayüzünde yerleştirilebilir bir bileşen olarak yeniden kullanmanıza da olanak tanır.

Bu dokümanın aşağıdaki bölümlerinde DialogFragment öğesinin bir AlertDialog nesnesiyle birlikte nasıl kullanılacağı açıklanmaktadır. Tarih veya saat seçici oluşturmak istiyorsanız Uygulamanıza seçici ekleme bölümünü okuyun.

İletişim kutusu parçası oluşturma

Özel düzenler ve Materyal Tasarım İletişim Kutuları'nda açıklananlar dahil, çok çeşitli iletişim kutusu tasarımları oluşturmak için DialogFragment geri çağırma yöntemini kullanarak ve onCreateDialog() geri çağırma yönteminde bir AlertDialog oluşturabilirsiniz.

Örneğin, DialogFragment içinde yönetilen temel bir AlertDialog aşağıda verilmiştir:

Kotlin

class StartGameDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            // Use the Builder class for convenient dialog construction.
            val builder = AlertDialog.Builder(it)
            builder.setMessage("Start game")
                .setPositiveButton("Start") { dialog, id ->
                    // START THE GAME!
                }
                .setNegativeButton("Cancel") { dialog, id ->
                    // User cancelled the dialog.
                }
            // Create the AlertDialog object and return it.
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

class OldXmlActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_old_xml)

        StartGameDialogFragment().show(supportFragmentManager, "GAME_DIALOG")
    }
}

Java

public class StartGameDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction.
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_start_game)
               .setPositiveButton(R.string.start, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // START THE GAME!
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancels the dialog.
                   }
               });
        // Create the AlertDialog object and return it.
        return builder.create();
    }
}
// ...

StartGameDialogFragment().show(supportFragmentManager, "GAME_DIALOG");

Bu sınıfın bir örneğini oluşturup söz konusu nesnede show() yöntemini çağırdığınızda iletişim kutusu aşağıdaki şekilde gösterildiği gibi görünür.

İki işlem düğmesi içeren temel iletişim kutusunu gösteren resim
Şekil 2. Bir mesaj ve iki işlem düğmesi içeren iletişim kutusu.

Bir sonraki bölümde, iletişim kutusunu oluşturmak için AlertDialog.Builder API'lerinin kullanılmasıyla ilgili daha fazla ayrıntı yer almaktadır.

İletişim kutunuzun ne kadar karmaşık olduğuna bağlı olarak, tüm temel parça yaşam döngüsü yöntemleri dahil olmak üzere DialogFragment içinde diğer çeşitli geri çağırma yöntemlerini uygulayabilirsiniz.

Uyarı oluşturma iletişim kutusu

AlertDialog sınıfı, çeşitli diyalog tasarımları oluşturmanıza olanak tanır ve genellikle ihtiyaç duyduğunuz tek diyalog sınıfıdır. Aşağıdaki şekilde gösterildiği gibi, bir uyarı iletişim kutusunun üç bölgesi vardır:

  • Başlık: Bu kısım isteğe bağlıdır ve yalnızca içerik alanı ayrıntılı bir mesaj, liste veya özel düzenle dolu olduğunda kullanılır. Basit bir mesaj veya soru belirtmeniz gerekiyorsa başlığa gerek yoktur.
  • İçerik alanı: Bu bir mesaj, liste veya başka bir özel düzeni görüntüleyebilir.
  • İşlem düğmeleri: Bir iletişim kutusunda en fazla üç işlem düğmesi olabilir.

AlertDialog.Builder sınıfı, özel bir düzen de dahil olmak üzere bu tür içeriklerle bir AlertDialog oluşturmanıza olanak tanıyan API'ler sağlar.

AlertDialog oluşturmak için aşağıdakileri yapın:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setMessage("I am the message")
    .setTitle("I am the title")

val dialog: AlertDialog = builder.create()
dialog.show()

Java

// 1. Instantiate an AlertDialog.Builder with its constructor.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

// 2. Chain together various setter methods to set the dialog characteristics.
builder.setMessage(R.string.dialog_message)
       .setTitle(R.string.dialog_title);

// 3. Get the AlertDialog.
AlertDialog dialog = builder.create();

Önceki kod snippet'i aşağıdaki iletişim kutusunu oluşturur:

Başlığı, içerik alanı ve iki işlem düğmesi olan iletişim kutusunu gösteren resim.
Şekil 3. Temel uyarı iletişim kutusunun düzeni.

Düğme ekleme

Şekil 2'dekilere benzer işlem düğmeleri eklemek için setPositiveButton() ve setNegativeButton() yöntemlerini çağırın:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setMessage("I am the message")
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Add the buttons.
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // User taps OK button.
           }
       });
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // User cancels the dialog.
           }
       });
// Set other dialog properties.
...

// Create the AlertDialog.
AlertDialog dialog = builder.create();

set...Button() yöntemleri, düğme için bir dize kaynağı tarafından sağlanan bir başlık ve kullanıcı düğmeye dokunduğunda yapılacak işlemi tanımlayan bir DialogInterface.OnClickListener gerektirir.

Ekleyebileceğiniz üç işlem düğmesi vardır:

  • Olumlu: Bunu kabul etmek ve işlemi işleme devam etmek için kullanın ("Tamam" işlemi).
  • Negatif: İşlemi iptal etmek için bunu kullanın.
  • Nötr: Kullanıcı işleme devam etmek istemeyebilir ancak işlemi iptal etmek istemiyorsa bu seçeneği kullanın. Pozitif ve negatif düğmelerin arasında görünür. Örneğin, işlem "Daha sonra hatırlat" olabilir.

Bir AlertDialog öğesine her düğme türünden yalnızca bir tane ekleyebilirsiniz. Örneğin, birden fazla "pozitif" düğmeniz olamaz.

Önceki kod snippet'i, aşağıdaki gibi bir uyarı iletişim kutusu oluşturur:

Başlığı, mesajı ve iki işlem düğmesini içeren uyarı iletişim kutusunu gösteren resim.
Şekil 4. Başlığı, mesajı ve iki işlem düğmesi olan bir uyarı iletişim kutusu.

Liste ekle

AlertDialog API'leriyle kullanılabilen üç tür liste vardır:

  • Geleneksel bir tek seçenekli liste.
  • Kalıcı bir tek seçim listesi (radyo düğmeleri).
  • Kalıcı bir çoktan seçmeli listesi (onay kutuları).

Şekil 5'teki gibi tek seçimli bir liste oluşturmak için setItems() yöntemini kullanın:


Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }
    .setItems(arrayOf("Item One", "Item Two", "Item Three")) { dialog, which ->
        // Do something on item tapped.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(R.string.pick_color)
           .setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
               // The 'which' argument contains the index position of the selected item.
           }
    });
    return builder.create();
}

Bu kod snippet'i, aşağıdakine benzer bir iletişim kutusu oluşturur:

Başlığı ve listesi olan iletişim kutusunu gösteren resim.
Şekil 5. Başlık ve listenin yer aldığı iletişim kutusu.

Liste iletişim kutusunun içerik alanında göründüğünden iletişim kutusunda hem mesaj hem de liste gösterilemez. setTitle() ile iletişim kutusu için bir başlık belirleyin. Listenin öğelerini belirtmek için bir dizi ileterek setItems() yöntemini çağırın. Alternatif olarak setAdapter() kullanarak da bir liste belirtebilirsiniz. Bu, ListAdapter kullanarak listeyi dinamik verilerle (ör. veritabanından alınan) yedeklemenize olanak tanır.

Listenizi bir ListAdapter ile yedekliyorsanız içeriğin eşzamansız olarak yüklenmesi için her zaman Loader kullanın. Bu durum, Bağdaştırıcı ile düzen oluşturma ve Yükleyiciler bölümlerinde daha ayrıntılı olarak açıklanmaktadır.

Kalıcı bir çoktan seçmeli veya tekli seçimli liste ekleme

Çoktan seçmeli öğelerin (onay kutuları) veya tek seçimli öğelerin (radyo düğmeleri) listesini eklemek için sırasıyla setMultiChoiceItems() veya setSingleChoiceItems() yöntemlerini kullanın.

Örneğin, seçili öğeleri bir ArrayList ile kaydeden Şekil 6'da gösterilen gibi çoktan seçmeli bir listeyi şu şekilde oluşturabilirsiniz:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }
    .setMultiChoiceItems(
        arrayOf("Item One", "Item Two", "Item Three"), null) { dialog, which, isChecked ->
        // Do something.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    selectedItems = new ArrayList();  // Where we track the selected items
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Set the dialog title.
    builder.setTitle(R.string.pick_toppings)
    // Specify the list array, the items to be selected by default (null for
    // none), and the listener through which to receive callbacks when items
    // are selected.
           .setMultiChoiceItems(R.array.toppings, null,
                      new DialogInterface.OnMultiChoiceClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which,
                       boolean isChecked) {
                   if (isChecked) {
                       // If the user checks the item, add it to the selected
                       // items.
                       selectedItems.add(which);
                   } else if (selectedItems.contains(which)) {
                       // If the item is already in the array, remove it.
                       selectedItems.remove(which);
                   }
               }
           })
    // Set the action buttons
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   // User taps OK, so save the selectedItems results
                   // somewhere or return them to the component that opens the
                   // dialog.
                   ...
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   ...
               }
           });

    return builder.create();
}
Çoktan seçmeli öğelerin listesini içeren iletişim kutusunu gösteren resim.
Şekil 6. Çoktan seçmeli öğelerin listesi.

Tek seçimli uyarı iletişim kutusu şu şekilde elde edilebilir:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }
    .setSingleChoiceItems(
        arrayOf("Item One", "Item Two", "Item Three"), 0
    ) { dialog, which ->
        // Do something.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

        String[] choices = {"Item One", "Item Two", "Item Three"};
        
        AlertDialog.Builder builder = AlertDialog.Builder(context);
        builder
                .setTitle("I am the title")
                .setPositiveButton("Positive", (dialog, which) -> {

                })
                .setNegativeButton("Negative", (dialog, which) -> {

                })
                .setSingleChoiceItems(choices, 0, (dialog, which) -> {

                });

        AlertDialog dialog = builder.create();
        dialog.show();

Bu, aşağıdaki örnekle sonuçlanır:

Tek seçimli öğelerin listesini içeren iletişim kutusunu gösteren resim.
Şekil 7. Tek seçimli öğelerin listesi.

Özel düzen oluşturma

İletişim kutusunda özel bir düzen oluşturmak isterseniz bir düzen oluşturun ve AlertDialog.Builder nesnenizde setView() yöntemini çağırarak bu düzeni AlertDialog öğesine ekleyin.

Özel iletişim kutusu düzenini gösteren resim.
Şekil 8. Özel iletişim kutusu düzeni.

Varsayılan olarak, özel düzen iletişim penceresini doldurur ancak düğme ve başlık eklemek için AlertDialog.Builder yöntemlerini kullanmaya devam edebilirsiniz.

Örneğin, önceki özel iletişim kutusu düzenine ilişkin düzen dosyasını aşağıda görebilirsiniz:

res/layout/dialog_signin.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:src="@drawable/header_logo"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:scaleType="center"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name" />
    <EditText
        android:id="@+id/username"
        android:inputType="textEmailAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="4dp"
        android:hint="@string/username" />
    <EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:fontFamily="sans-serif"
        android:hint="@string/password"/>
</LinearLayout>

DialogFragment cihazınızın düzenini şişirmek için getLayoutInflater() ile LayoutInflater alın ve inflate() çağrısı yapın. İlk parametre, düzen kaynağı kimliği ve ikinci parametre düzenin üst görünümüdür. Ardından, düzeni iletişim kutusuna yerleştirmek için setView() yöntemini çağırabilirsiniz. Bu, aşağıdaki örnekte gösterilmiştir.

Kotlin

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return activity?.let {
        val builder = AlertDialog.Builder(it)
        // Get the layout inflater.
        val inflater = requireActivity().layoutInflater;

        // Inflate and set the layout for the dialog.
        // Pass null as the parent view because it's going in the dialog
        // layout.
        builder.setView(inflater.inflate(R.layout.dialog_signin, null))
                // Add action buttons.
                .setPositiveButton(R.string.signin,
                        DialogInterface.OnClickListener { dialog, id ->
                            // Sign in the user.
                        })
                .setNegativeButton(R.string.cancel,
                        DialogInterface.OnClickListener { dialog, id ->
                            getDialog().cancel()
                        })
        builder.create()
    } ?: throw IllegalStateException("Activity cannot be null")
}

Java

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater.
    LayoutInflater inflater = requireActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog.
    // Pass null as the parent view because it's going in the dialog layout.
    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
    // Add action buttons
           .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   // Sign in the user.
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().cancel();
               }
           });
    return builder.create();
}

Özel bir iletişim kutusu istiyorsanız Dialog API'lerini kullanmak yerine iletişim kutusu olarak Activity görüntüleyebilirsiniz. Bir etkinlik oluşturun ve <activity> manifest öğesinde temasını Theme.Holo.Dialog olarak ayarlayın:

<activity android:theme="@android:style/Theme.Holo.Dialog" >

Etkinlik artık tam ekran yerine bir iletişim penceresinde görüntülenir.

Etkinlikleri, iletişim kutusunun ana makinesine geri ilet

Kullanıcı iletişim kutusunun işlem düğmelerinden birine dokunduğunda veya listesinden bir öğe seçtiğinde, DialogFragment gerekli işlemi gerçekleştirebilir, ancak genellikle etkinliği iletişim kutusunu açan etkinliğe veya parçaya iletmek istersiniz. Bunu yapmak için, her tıklama etkinliği türü için bir yöntem içeren arayüz tanımlayın. Ardından bu arayüzü, iletişim kutusundan eylem etkinliklerini alan ana makine bileşenine uygulayın.

Örneğin, etkinlikleri ana makine etkinliğine geri gönderdiği bir arayüzü tanımlayan DialogFragment örneğini aşağıda görebilirsiniz:

Kotlin

class NoticeDialogFragment : DialogFragment() {
    // Use this instance of the interface to deliver action events.
    internal lateinit var listener: NoticeDialogListener

    // The activity that creates an instance of this dialog fragment must
    // implement this interface to receive event callbacks. Each method passes
    // the DialogFragment in case the host needs to query it.
    interface NoticeDialogListener {
        fun onDialogPositiveClick(dialog: DialogFragment)
        fun onDialogNegativeClick(dialog: DialogFragment)
    }

    // Override the Fragment.onAttach() method to instantiate the
    // NoticeDialogListener.
    override fun onAttach(context: Context) {
        super.onAttach(context)
        // Verify that the host activity implements the callback interface.
        try {
            // Instantiate the NoticeDialogListener so you can send events to
            // the host.
            listener = context as NoticeDialogListener
        } catch (e: ClassCastException) {
            // The activity doesn't implement the interface. Throw exception.
            throw ClassCastException((context.toString() +
                    " must implement NoticeDialogListener"))
        }
    }
}

Java

public class NoticeDialogFragment extends DialogFragment {

    // The activity that creates an instance of this dialog fragment must
    // implement this interface to receive event callbacks. Each method passes
    // the DialogFragment in case the host needs to query it.
    public interface NoticeDialogListener {
        public void onDialogPositiveClick(DialogFragment dialog);
        public void onDialogNegativeClick(DialogFragment dialog);
    }

    // Use this instance of the interface to deliver action events.
    NoticeDialogListener listener;

    // Override the Fragment.onAttach() method to instantiate the
    // NoticeDialogListener.
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        // Verify that the host activity implements the callback interface.
        try {
            // Instantiate the NoticeDialogListener so you can send events to
            // the host.
            listener = (NoticeDialogListener) context;
        } catch (ClassCastException e) {
            // The activity doesn't implement the interface. Throw exception.
            throw new ClassCastException(activity.toString()
                    + " must implement NoticeDialogListener");
        }
    }
    ...
}

İletişim kutusunu barındıran etkinlik, iletişim kutusu parçasının oluşturucusuyla iletişim kutusunun bir örneğini oluşturur ve iletişim kutusunun etkinliklerini NoticeDialogListener arayüzünün uygulanması yoluyla alır:

Kotlin

class MainActivity : FragmentActivity(),
        NoticeDialogFragment.NoticeDialogListener {

    fun showNoticeDialog() {
        // Create an instance of the dialog fragment and show it.
        val dialog = NoticeDialogFragment()
        dialog.show(supportFragmentManager, "NoticeDialogFragment")
    }

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following
    // methods defined by the NoticeDialogFragment.NoticeDialogListener
    // interface.
    override fun onDialogPositiveClick(dialog: DialogFragment) {
        // User taps the dialog's positive button.
    }

    override fun onDialogNegativeClick(dialog: DialogFragment) {
        // User taps the dialog's negative button.
    }
}

Java

public class MainActivity extends FragmentActivity
                          implements NoticeDialogFragment.NoticeDialogListener{
    ...
    public void showNoticeDialog() {
        // Create an instance of the dialog fragment and show it.
        DialogFragment dialog = new NoticeDialogFragment();
        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
    }

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following
    // methods defined by the NoticeDialogFragment.NoticeDialogListener
    // interface.
    @Override
    public void onDialogPositiveClick(DialogFragment dialog) {
        // User taps the dialog's positive button.
        ...
    }

    @Override
    public void onDialogNegativeClick(DialogFragment dialog) {
        // User taps the dialog's negative button.
        ...
    }
}

Ana makine etkinliği, önceki örnekte gösterilen onAttach() geri çağırma yöntemi tarafından zorunlu kılınan NoticeDialogListener işlemini uyguladığından iletişim kutusu parçası, tıklama etkinliklerini etkinliğe yayınlamak için arayüz geri çağırma yöntemlerini kullanabilir:

Kotlin

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        return activity?.let {
            // Build the dialog and set up the button click handlers.
            val builder = AlertDialog.Builder(it)

            builder.setMessage(R.string.dialog_start_game)
                    .setPositiveButton(R.string.start,
                            DialogInterface.OnClickListener { dialog, id ->
                                // Send the positive button event back to the
                                // host activity.
                                listener.onDialogPositiveClick(this)
                            })
                    .setNegativeButton(R.string.cancel,
                            DialogInterface.OnClickListener { dialog, id ->
                                // Send the negative button event back to the
                                // host activity.
                                listener.onDialogNegativeClick(this)
                            })

            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }

Java

public class NoticeDialogFragment extends DialogFragment {
    ...
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Build the dialog and set up the button click handlers.
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_start_game)
               .setPositiveButton(R.string.start, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // Send the positive button event back to the host activity.
                       listener.onDialogPositiveClick(NoticeDialogFragment.this);
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // Send the negative button event back to the host activity.
                       listener.onDialogNegativeClick(NoticeDialogFragment.this);
                   }
               });
        return builder.create();
    }
}

İletişim kutusu göster

İletişim kutunuzu göstermek istediğinizde DialogFragment öğesinin bir örneğini oluşturun ve iletişim kutusu parçası için FragmentManager ve etiket adını ileterek show() yöntemini çağırın.

FragmentManager numaralı telefonu FragmentActivity numarasından getSupportFragmentManager() veya bir Fragment numarasından getParentFragmentManager() telefonunu arayarak öğrenebilirsiniz. Aşağıda konuyla ilgili bir örnek verilmiştir:

Kotlin

fun confirmStartGame() {
    val newFragment = StartGameDialogFragment()
    newFragment.show(supportFragmentManager, "game")
}

Java

public void confirmStartGame() {
    DialogFragment newFragment = new StartGameDialogFragment();
    newFragment.show(getSupportFragmentManager(), "game");
}

İkinci bağımsız değişken olan "game", sistemin gerektiğinde parça durumunu kaydetmek ve geri yüklemek için kullandığı benzersiz bir etiket adıdır. Etiket, findFragmentByTag() yöntemini çağırarak parçanın bir tanıtıcısını almanızı da sağlar.

İletişim kutusunu tam ekran olarak veya yerleştirilmiş parça olarak gösterme

Kullanıcı arayüzü tasarımınızın bir parçasının bazı durumlarda iletişim kutusu, bazı durumlarda ise tam ekran veya yerleştirilmiş parça olarak görünmesini isteyebilirsiniz. Ayrıca, cihazın ekran boyutuna bağlı olarak farklı bir şekilde görünmesini de isteyebilirsiniz. DialogFragment sınıfı, yerleştirilebilir bir Fragment olarak davranabildiği için bunu gerçekleştirme esnekliği sunar.

Ancak, bu durumda iletişim kutusunu oluşturmak için AlertDialog.Builder veya diğer Dialog nesnelerini kullanamazsınız. DialogFragment öğesinin yerleştirilebilir olmasını istiyorsanız iletişim kutusunun kullanıcı arayüzünü bir düzende tanımlayın, ardından düzeni onCreateView() geri çağırmasıyla yükleyin.

purchase_items.xml adlı bir düzen kullanılarak iletişim kutusu veya yerleştirilebilir bir parça olarak görünebilecek DialogFragment örneğini aşağıda bulabilirsiniz:

Kotlin

class CustomDialogFragment : DialogFragment() {

    // The system calls this to get the DialogFragment's layout, regardless of
    // whether it's being displayed as a dialog or an embedded fragment.
    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
        // Inflate the layout to use as a dialog or embedded fragment.
        return inflater.inflate(R.layout.purchase_items, container, false)
    }

    // The system calls this only when creating the layout in a dialog.
    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        // The only reason you might override this method when using
        // onCreateView() is to modify the dialog characteristics. For example,
        // the dialog includes a title by default, but your custom layout might
        // not need it. Here, you can remove the dialog title, but you must
        // call the superclass to get the Dialog.
        val dialog = super.onCreateDialog(savedInstanceState)
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
        return dialog
    }
}

Java

public class CustomDialogFragment extends DialogFragment {
    // The system calls this to get the DialogFragment's layout, regardless of
    // whether it's being displayed as a dialog or an embedded fragment.
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout to use as a dialog or embedded fragment.
        return inflater.inflate(R.layout.purchase_items, container, false);
    }

    // The system calls this only when creating the layout in a dialog.
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using
        // onCreateView() is to modify the dialog characteristics. For example,
        // the dialog includes a title by default, but your custom layout might
        // not need it. Here, you can remove the dialog title, but you must
        // call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }
}

Aşağıdaki örnek, ekran boyutuna göre parçanın iletişim kutusu mu yoksa tam ekran kullanıcı arayüzü olarak mı gösterileceğini belirler:

Kotlin

fun showDialog() {
    val fragmentManager = supportFragmentManager
    val newFragment = CustomDialogFragment()
    if (isLargeLayout) {
        // The device is using a large layout, so show the fragment as a
        // dialog.
        newFragment.show(fragmentManager, "dialog")
    } else {
        // The device is smaller, so show the fragment fullscreen.
        val transaction = fragmentManager.beginTransaction()
        // For a polished look, specify a transition animation.
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        // To make it fullscreen, use the 'content' root view as the container
        // for the fragment, which is always the root view for the activity.
        transaction
                .add(android.R.id.content, newFragment)
                .addToBackStack(null)
                .commit()
    }
}

Java

public void showDialog() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    CustomDialogFragment newFragment = new CustomDialogFragment();

    if (isLargeLayout) {
        // The device is using a large layout, so show the fragment as a
        // dialog.
        newFragment.show(fragmentManager, "dialog");
    } else {
        // The device is smaller, so show the fragment fullscreen.
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        // For a polished look, specify a transition animation.
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        // To make it fullscreen, use the 'content' root view as the container
        // for the fragment, which is always the root view for the activity.
        transaction.add(android.R.id.content, newFragment)
                   .addToBackStack(null).commit();
    }
}

Parça işlemleri gerçekleştirme hakkında daha fazla bilgi için Parçalar bölümüne bakın.

Bu örnekte mIsLargeLayout boole'si, geçerli cihazın, uygulamanın büyük düzen tasarımını kullanması gerekip gerekmediğini belirtir. Böylece, bu parçayı tam ekran yerine bir iletişim kutusu olarak gösterir. Bu tür boole'yi ayarlamanın en iyi yolu, farklı ekran boyutları için alternatif bir kaynak değerine sahip bir bool kaynak değeri tanımlamaktır. Örneğin, farklı ekran boyutları için bool kaynağının iki sürümünü aşağıda görebilirsiniz:

res/values/bools.xml

<!-- Default boolean values -->
<resources>
    <bool name="large_layout">false</bool>
</resources>

res/values-large/bools.xml

<!-- Large screen boolean values -->
<resources>
    <bool name="large_layout">true</bool>
</resources>

Ardından aşağıdaki örnekte gösterildiği gibi, etkinliğin onCreate() yöntemi sırasında mIsLargeLayout değerini başlatabilirsiniz:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    isLargeLayout = resources.getBoolean(R.bool.large_layout)
}

Java

boolean isLargeLayout;

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

    isLargeLayout = getResources().getBoolean(R.bool.large_layout);
}

Etkinlikleri büyük ekranlarda iletişim kutusu olarak gösterme

Bir iletişim kutusunu küçük ekranlarda tam ekran kullanıcı arayüzü olarak göstermek yerine, Activity işaretini büyük ekranlarda iletişim kutusu olarak göstererek aynı sonucu elde edebilirsiniz. Seçtiğiniz yaklaşım, uygulamanızın tasarımına bağlıdır, ancak uygulamanız küçük ekranlar için tasarlanmışsa ve kısa süreli bir etkinliği diyalog olarak göstererek tabletlerdeki deneyimi iyileştirmek istiyorsanız bir etkinliği iletişim kutusu olarak göstermek genellikle yararlıdır.

Bir etkinliği yalnızca büyük ekranlarda iletişim kutusu olarak göstermek için Theme.Holo.DialogWhenLarge temasını <activity> manifest öğesine uygulayın:

<activity android:theme="@android:style/Theme.Holo.DialogWhenLarge" >

Aktivitelerinizi temalarla şekillendirme hakkında daha fazla bilgi edinmek için Stiller ve temalar bölümüne bakın.

İletişim kutusunu kapatma

Kullanıcı AlertDialog.Builder ile oluşturulmuş bir işlem düğmesine dokunduğunda sistem iletişim kutusunu sizin için kapatır.

Liste, radyo düğmelerinin veya onay kutularının kullanıldığı durumlar hariç, kullanıcı iletişim listesindeki bir öğeye dokunduğunda sistem iletişim kutusunu da kapatır. Aksi takdirde, DialogFragment cihazınızda dismiss() yöntemini çağırarak iletişim kutunuzu manuel olarak kapatabilirsiniz.

İletişim kutusu kapandığında belirli işlemleri gerçekleştirmeniz gerekirse DialogFragment uygulamanızda onDismiss() yöntemini uygulayabilirsiniz.

İletişim kutularını iptal de edebilirsiniz. Bu, kullanıcının görevi tamamlamadan iletişim kutusundan ayrıldığını gösteren özel bir etkinliktir. Bu durum, kullanıcı Geri düğmesine dokunur veya iletişim alanının dışındaki ekrana dokunursa ya da Dialog üzerinde açıkça cancel() çağrısı yaparsanız (örneğin, iletişim kutusundaki bir "İptal" düğmesine yanıt olarak) ortaya çıkar.

Önceki örnekte gösterildiği gibi iptal etkinliğine DialogFragment sınıfınızda onCancel() uygulayarak yanıt verebilirsiniz.