将字符串从Activity传递到DialogFragment

时间:2015-04-27 15:29:32

标签: c# android xamarin android-dialogfragment

在我的活动中我有这个:

公共类MainActivity:Activity     {         RelativeLayout mRelativeLayout;         按钮mButton;         私人按钮mBtnSignUp;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        mRelativeLayout = FindViewById<RelativeLayout>(Resource.Id.mainView);
        mButton = FindViewById<Button>(Resource.Id.btnLogin);

        mButton.Click += mButton_Click;
        mRelativeLayout.Click += mRelativeLayout_Click;

        mBtnSignUp = FindViewById<Button> (Resource.Id.button1);
        mBtnSignUp.Click += (object sender, EventArgs e) => 
        {
                //Pull up dialog
                FragmentTransaction transaction = FragmentManager.BeginTransaction();
                dialog_SignUp signUpDialog = new dialog_SignUp();
                signUpDialog.Show(transaction, "dialog fragment");

                signUpDialog.mOnSignUpComplete += signUpDialog_mOnSignUpComplete;
        };
        void signUpDialog_mOnSignUpComplete (object sender, OnSignUpEventArgs e)
        {

            Thread thread = new Thread (ActLikeARequest);
            thread.Start ();


        }
        private void ActLikeARequest()
        {

            Thread.Sleep (3000);
        }

在对话框中我有:

public class OnSignUpEventArgs : EventArgs
    {
        private string mFirstName;
        private string mEmail;
        private string mPassword;

        public string FirstName
        {
            get{ return mFirstName; }
            set{ mFirstName=value;}

        }
        public string Email
        {
            get{ return mEmail; }
            set{ mEmail=value;}

        }
        public string Password
        {
            get{ return mPassword; }
            set{ mPassword=value;}

        }

        public OnSignUpEventArgs (string firstName, string email, string password) : base()
        {
            FirstName = firstName;
            Email = email;
            Password = password;
        }

    }

    class dialog_SignUp:DialogFragment
    {
        private Button mBtnSignUp;
        private EditText mFirstName;
        private EditText mEmail;
        private EditText mPassword;

        public event EventHandler<OnSignUpEventArgs> mOnSignUpComplete;


        public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            base.OnCreateView (inflater, container, savedInstanceState);

            var view = inflater.Inflate (Resource.Layout.dialog_sign_up, container, false);

            mBtnSignUp = view.FindViewById<Button> (Resource.Id.btnDialogEmail);
            mFirstName = view.FindViewById<EditText> (Resource.Id.txtFirstName);
            mEmail = view.FindViewById<EditText> (Resource.Id.txtEmail);
            mPassword = view.FindViewById<EditText> (Resource.Id.txtPassword);

            mBtnSignUp.Click += mBtnSignUp_Click;



            return view;
        }

        void mBtnSignUp_Click (object sender, EventArgs e)
        {

            //User has clicked the sign up button

            mOnSignUpComplete.Invoke (this, new OnSignUpEventArgs(mFirstName.Text, mEmail.Text, mPassword.Text));
            this.Dismiss ();

        }
        public override void OnActivityCreated (Bundle savedInstanceState)
        {
            Dialog.Window.RequestFeature (WindowFeatures.NoTitle); //Sets the title bar to invisible
            base.OnActivityCreated (savedInstanceState);
            Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation; //Set the animation
        }
    }

问题是,如何将数据(字符串)从活动传递到对话框中,以便在调用时,TextViews获取我传递的数据?

是否可以在行动中加入,但是什么?

3 个答案:

答案 0 :(得分:5)

我认为您需要能够在dialog_signup中接受参数。

class dialog_SignUp:DialogFragment
 {
    private Button mBtnSignUp;
    private EditText mFirstName;
    private EditText mEmail;
    private EditText mPassword;
    String parameter="";
    public event EventHandler<OnSignUpEventArgs> mOnSignUpComplete;

    public dialog_SignUp(String parameterIn){
       parameter=parameterIn;
    }

    public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView (inflater, container, savedInstanceState);

        var view = inflater.Inflate (Resource.Layout.dialog_sign_up, container, false);

        mBtnSignUp = view.FindViewById<Button> (Resource.Id.btnDialogEmail);
        mFirstName = view.FindViewById<EditText> (Resource.Id.txtFirstName);
        mFirstName.setText(parameter);
        mEmail = view.FindViewById<EditText> (Resource.Id.txtEmail);
        mPassword = view.FindViewById<EditText> (Resource.Id.txtPassword);

        mBtnSignUp.Click += mBtnSignUp_Click;



        return view;
    }

然后将dialog_SignUp signUpDialog = new dialog_SignUp();替换为dialog_SignUp signUpDialog = new dialog_SignUp(stringToSend);

答案 1 :(得分:1)

请记住,您始终可以使用Application类在那里定义变量。

namespace YourNamespace
{
[Application]
public class App : Application
{
    public ParseObject currentBusiness { get; set;}

    public App (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public override void OnCreate ()
    {
        base.OnCreate ();

        currentBusiness = new ParseObject ("Business");
    }
}
}

然后你可以通过这种方式从evewhere访问它:

App _app = (App)Application.Context;
var curentBusiness = _app.currentBusiness;

答案 2 :(得分:0)

您可以使用Class的Property功能。

对话框片段代码

class Error : DialogFragment
{
    public string getErrorMsg { get; set; } // this gets the message


    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.Inflate(Resource.Layout.Error, container, false);
        TextView text = view.FindViewById<TextView>(Resource.Id.txtError);
        text.Text = getErrorMsg; //here the message is set to the TextView
        return view;
    }
}

呼叫方式

      FragmentTransaction transaction = FragmentManager.BeginTransaction();
      Error obj = new Error();
      obj.Cancelable = false;
      obj.getErrorMsg = passMyString; // in this line you send message to The Class
      obj.Show(transaction, "error");