Возврат данных из DialogFragment в вызывающую деятельность - PullRequest
0 голосов
/ 19 мая 2019

У меня есть DialogFragment, который работает, и мне нужно вернуть выбранный элемент из счетчика. Я перепробовал много методов, которые я нашел в Stack Overflow и других местах, но все они используют java, которая (по-видимому) не очень хорошо переводит в C # в Xamarin для Visual Studio 2017. На сегодняшний день ничего не работает My DialogFragment макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"  
    android:minWidth="300dp" 
    android:minHeight="75dp">
    <TextView
        android:text="Select the department you are registering for."
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center" 
        android:textStyle="bold"
        android:id="@+id/textView2" />
    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:id="@+id/department_spinner" />
    <Button
        android:text="Ok"
        android:layout_width="200px"
        android:layout_gravity="center"
        android:layout_height="34.5dp"
        android:id="@+id/button_ok" />
</LinearLayout>

Код класса:

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.Views;
using Android.Widget;

namespace MyProject
{
    class selectDepartment : DialogFragment
    {
        static Spinner department;
        public string selection = "";

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            base.OnCreateView(inflater, container, savedInstanceState);
            View view = inflater.Inflate(Resource.Layout.selectDepartment, container, false);

            Button ok = view.FindViewById<Button>(Resource.Id.button_ok);
            department = view.FindViewById<Spinner>(Resource.Id.department_spinner);

            List<string> list = new List<string>();
            list.Add("Select Department");
            list.Add("Dept. A");
            list.Add("Dept. B");

            var adapter = new ArrayAdapter<string>(this.Activity, Android.Resource.Layout.SimpleSpinnerItem, list.ToArray());
            department.Adapter = adapter;

            ok.Click += (sender, args) =>
            {
                selection = string.Format("{0}", department.GetItemAtPosition(department.SelectedItemPosition));
            };
            return view;
        }

    }
}

Это код, который показывает диалоговое окно:

            FragmentTransaction getdepartment = FragmentManager.BeginTransaction();
            selectDepartment getDept = new selectDepartment();
            getDept.Show(getdepartment , "Select Department");

            // Here I attempt to read a property which contains the selection
            string selection = getDept.selection;

В моей последней попытке я назначил выбор счетчика свойству и пытаюсь прочитать это свойство, чтобы получить выбранное значение, но диалоговое окно (по-видимому) отображается в другом потоке, и выбор при этом не выбирается. строка кода выполнена. Я попытался сделать мой метод async и await диалоговым, но это только ухудшило положение. Чего мне не хватает?

1 Ответ

0 голосов
/ 19 мая 2019

использовать пользовательское событие

public class DialogEventArgs : EventArgs
{
    public string Selection { get; set; }
}

и затем в selectDepartment добавить:

public delegate void DialogEventHandler(object sender, DialogEventArgs args);

public event DialogEventHandler Dismissed;

Наконец, в обработчик нажатия кнопки добавьте:

if (null != Dismissed)
    Dismissed(this, new DialogEventArgs { Selection = selection });

при создании диалога прикрепите обработчик события

selectDepartment getDept = new selectDepartment();
getDept.Dismissed += (s, e) => { /* do something with e.Selection here */ };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...