Диалог подобен любому другому окну, которое выскакивает на фоне текущего, уже открытого. И он используется для показа определенных коротких сообщений, для предложения пользователю ввести какие-либо данные, а также для того, чтобы позволить ему принять некое решение исходя из доступных вариантов. В отличие от Toast, диалог, как правило, используется там, где обязательно требуется внимание пользователя. Система Android поддерживает разные способы для создания диалога, например, такие как AlertDialog и FragmentDialog. В этом примере мы рассмотрим все аспекты AlertDialog и DialogFragment.
1. Использование AlertDialog в Xamarin.Android
AlertDialog является подклассом Dialog, и он может отображать одну, две или три кнопки. Если нужно отобразить строку в этом диалоговом окне, используйте метод SetMessage().
Следующий код может быть использован для создания простого AlertDialog с двумя кнопками «Удалить» и «Отмена».
1 2 3 4 5 6 7 8 9 10 11 12 | //set alert for executing the task AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetTitle("Confirm delete"); alert.SetMessage("Lorem ipsum dolor sit amet, consectetuer adipiscing elit."); alert.SetPositiveButton("Delete", (senderAlert, args) => { Toast.MakeText(this, "Deleted!", ToastLength.Short).Show(); }); alert.SetNegativeButton("Cancel", (senderAlert, args) => { Toast.MakeText(this, "Cancelled!", ToastLength.Short).Show(); }); Dialog dialog = alert.Create(); dialog.Show(); |
Приведенный выше код выведет на экран такое сообщение, как показано на следующем скриншоте.
2. Использование DialogFragment в Xamarin.Android
С момента выхода Android 3.0 (API уровня 11), фрагмент может показываться в виде диалога и называться в этом случае DialogFragment. Если Вы поддерживаете старые версии андроид, то можете использовать соответствующую библиотеку совместимости фрагментов.
С тем чтобы создать фрагмент диалога, мы используем класс DialogFragment. Этот класс наследует от Fragment и ведет себя практически так же, как он самый, то есть со всеми доступными методами его жизненного цикла. Android рекомендует использовать DialogFragment над AlerDialog.
Для того чтобы создать DialogFragment, необходимо выполнить следующие шаги:
- Создать новый класс, который наследует от класса DialogFragment.
- Как и в случае с обычными фрагментами, переопределить обратный вызовOnCreateView() для прикрепления диалогового макета.
- В качестве альтернативного варианта можно переопределить метод OnCreateDialog() и вернуть экземпляр Dialog. Этот метод используется для портирования старого кода AlertDialog без значительных модификаций.
В этом примере мы увидим оба обратных вызова OnCreateView() и OnCreateDialog().
3. Использование диалога фрагмента при помощи OnCreateDialog()
На следующем примере можно увидеть, как создается диалог посредством переопределения метода OnCreateDialog().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Util; using Android.Views; using Android.Widget; namespace DialogExample { public class DialogFragment2: DialogFragment { public static DialogFragment2 NewInstance(Bundle bundle) { DialogFragment2 fragment = new DialogFragment2(); fragment.Arguments = bundle; return fragment; } public override Dialog OnCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder alert = new AlertDialog.Builder(Activity); alert.SetTitle("Confirm delete"); alert.SetMessage("Lorem ipsum dolor sit amet, consectetuer adipiscing elit."); alert.SetPositiveButton("Delete", (senderAlert, args) => { Toast.MakeText(Activity, "Deleted!", ToastLength.Short).Show(); }); alert.SetNegativeButton("Cancel", (senderAlert, args) => { Toast.MakeText(Activity, "Cancelled!", ToastLength.Short).Show(); }); return alert.Create(); } } } |
4. Использование фрагмента диалога при помощи OnCreateView()
DialogFragment схож со всеми прочими фрагментами, и к нему применимы все те же правила жизненного цикла. Теперь мы должны переопределить метод onCreateView, чтобы прикрепить макет к иерархии представлений и создать фрагмент диалога.
Давайте сперва определим макет для фрагмента. В этом примере я использую два TextViews и одну кнопку. Мой макет выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp"> <TextView android:text="Lorem ipsum" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView1" /> <TextView android:text="Lorem ipsum dolor sit amet, consectetuer adipiscing elit...." android:textAppearance="?android:attr/textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView2" android:layout_marginTop="10dp" /> <Button android:text="Close" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/CloseButton" android:layout_marginTop="10dp" /> </LinearLayout> |
Теперь давайте выполним раздувание макета из метода OnCreateView(). У меня класс DialogFragment выглядит вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Util; using Android.Views; using Android.Widget; namespace DialogExample { public class DialogFragment1: DialogFragment { public static DialogFragment1 NewInstance(Bundle bundle) { DialogFragment1 fragment = new DialogFragment1(); fragment.Arguments = bundle; return fragment; } public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Use this to return your custom view for this Fragment View view = inflater.Inflate(Resource.Layout.DialogFragment1Layout, container, false); Button button = view.FindViewById < Button > (Resource.Id.CloseButton); button.Click += delegate { Dismiss(); Toast.MakeText(Activity, "Dialog fragment dismissed!", ToastLength.Short).Show(); }; return view; } } } |
Приведенный выше код выведет на экран такое сообщение, как показано на следующем скриншоте.
5. Добавление DialogFragment
И основная работа сделана! Добавьте следующий фрагмент кода в Activity для реализации и отображения диалогового окна:
1 2 3 4 5 6 7 8 9 10 11 | FragmentTransaction ft = FragmentManager.BeginTransaction(); //Remove fragment else it will crash as it is already added to backstack Fragment prev = FragmentManager.FindFragmentByTag("dialog"); if (prev != null) { ft.Remove(prev); } ft.AddToBackStack(null); // Create and show the dialog. DialogFragment1 newFragment = DialogFragment1.NewInstance(null); //Add fragment newFragment.Show(ft, "dialog"); |
Приведенный выше код выведет на экран такое сообщение, как показано на следующем скриншоте.
Автор: Nilanchala Panigrahy
Источник: Статья в блоге автора
Написать ответ