как передать данные между диалоговым фрагментом и активностью

Я хочу отправить данные из диалогового фрагмента в активность одной командой внутри кнопки.

//code in dialogfragment
 ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(context);
                    ISharedPreferencesEditor editor = prefs.Edit();
                    editor.PutString("my_data", "some_data");
                    editor.Apply();

                    second = new SecondActivity();

                    String myData = prefs.GetString("my_data", "");
                    second.txtView.Text = myData; // textview in secondactivity

                    Dismiss();

person ALIE    schedule 17.05.2020    source источник
comment
каково ваше мнение от одной команды ??   -  person vahab-balouchzahi    schedule 18.05.2020
comment
Процесс передачи данных осуществляется одним нажатием кнопки   -  person ALIE    schedule 18.05.2020


Ответы (1)


Согласно вашему описанию, вам нужно сначала создать Dialogfragment в своем проекте и загрузить макет в свой DialogmentFragment.

public class DialogFragment1: DialogFragment
{
    private TextView tv1;
    private TextView tv2;
    private Button btn1;

    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.Signuplayout, container, false);
        tv1 = view.FindViewById<TextView>(Resource.Id.textView1);
        tv2= view.FindViewById<TextView>(Resource.Id.textView2);
        btn1 = view.FindViewById<Button>(Resource.Id.button1);

        btn1.Click += Btn1_Click;
        return view;
    }

    private void Btn1_Click(object sender, EventArgs e)
    {
        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(Context);
        ISharedPreferencesEditor editor = prefs.Edit();
        editor.PutString("my_data", tv1.Text);
        editor.Apply();

        DialogFragment1 _exportFragment = (DialogFragment1)FragmentManager.FindFragmentByTag("Dialog Fragment");
        if (_exportFragment != null)
        {
            _exportFragment.Dismiss();
        }

    }
}

Signupplayout.xml:

<?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">

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:id="@+id/textView1" 
    android:hint="first name"/>

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:id="@+id/textView2" 
    android:hint="Pasword"/>

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:text="Sign up" 
    android:id="@+id/button1"/>
</LinearLayout>

Основная активность.cs:

 private Button btn1;
    private Button btn2;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        btn1 = FindViewById<Button>(Resource.Id.button1);
        btn2 = FindViewById<Button>(Resource.Id.button2);

        btn1.Click += Btn1_Click;
        btn2.Click += Btn2_Click;
    }

    private void Btn2_Click(object sender, System.EventArgs e)
    {
        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(Application.Context);
        string myData = prefs.GetString("my_data", "");
    }

    private void Btn1_Click(object sender, System.EventArgs e)
    {
        FragmentTransaction transcation = FragmentManager.BeginTransaction();
        DialogFragment1 signup = new DialogFragment1();
        signup.Show(transcation, "Dialog Fragment");

    }

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">

   <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:id="@+id/button1" android:text="Sign up"/>

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:text="get data" 
    android:id="@+id/button2"/>
</LinearLayout>

Нажав первую кнопку в MainLayout, чтобы отобразить DialogFragment, затем щелкнув кнопку в DialogFragment, чтобы передать данные в действие, наконец, щелкнув вторую кнопку в MainLayout, чтобы получить данные.

Это один образец, который вы можете посмотреть:

https://github.com/CherryBu/dialogapp

Обновление:

Добавление одного общедоступного метода в Mainactivity.cs для отображения данных:

 public void getdata()
    {
        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(Application.Context);
        string myData = prefs.GetString("my_data", "");
        Toast.MakeText(Application.Context,myData,ToastLength.Long).Show();
    }

Затем создайте экземпляр одной основной активности, вызовите метод getdata в DialogFragment.cs:

static  MainActivity mactivity;
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.Signuplayout, container, false);
        tv1 = view.FindViewById<TextView>(Resource.Id.textView1);
        tv2= view.FindViewById<TextView>(Resource.Id.textView2);
        btn1 = view.FindViewById<Button>(Resource.Id.button1);

        btn1.Click += Btn1_Click;
        mactivity = new MainActivity();
        return view;
    }

    private void Btn1_Click(object sender, EventArgs e)
    {
        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(Context);
        ISharedPreferencesEditor editor = prefs.Edit();
        editor.PutString("my_data", tv1.Text);
        editor.Apply();

        DialogFragment1 _exportFragment = (DialogFragment1)FragmentManager.FindFragmentByTag("Dialog Fragment");
        if (_exportFragment != null)
        {
            _exportFragment.Dismiss();
        }

        mactivity.getdata();


    }
person Cherry Bu - MSFT    schedule 18.05.2020
comment
спасибо Черри Бу. Проблема, которую я хочу решить, заключается в том, что я хочу, чтобы при выходе из диалогового окна переменная add и get отображалась в основной активности без кнопки, получающей сохраненное значение. - person ALIE; 18.05.2020
comment
@ALIEA Вы имеете в виду, что хотите отображать данные при отклонении DislogFragment, не нужно нажимать кнопку, чтобы получить их? Если да, пожалуйста, посмотрите мое обновление. - person Cherry Bu - MSFT; 18.05.2020