Xamarin.Android如何在调用OnActivityResult之前拦截活动关闭/现有事件

问题描述 投票:0回答:1

我正在使用Xamarin.Android。我有一个活动说activity_main,它带有一个按钮,该按钮调出新的活动说activity_list,它显示一个列表,用户可以从中重新排序/删除项目。

当用户完成列表编辑后,从activity_list按下Back按钮,这时我想收集修改后的列表的信息,并将包含Intent的数据传递回activity_main

我试图重写OnDestroy或OnStop方法并从那里调用SetResult。但是activity_main的OnActivityResult总是在SetResult之前执行。

[我知道我可以在activity_list中放置一个Finish按钮,通过它我可以收集我的数据并使用Finish()关闭activity_list。另外,我可以重写OnBackPress()方法来处理Back按钮。但是有没有一种方法可以处理WinForm应用程序中的Form_Closing事件之类的“活动关闭”事件,该方法可以在调用OnActivityResult之前执行所有操作,而无需从每个调用这些操作退出触发器?

android android-intent xamarin.android onactivityresult
1个回答
0
投票
根据您的描述,您可以使用resultCode来判断是否调用了函数SetResult。如果使用参数SetResult调用Result.Ok,则可以将值传递给页面activity_main,如果不是Result.Ok,则是其他条件。

此外,您还可以定义一个可变值haveGetData以标识是否需要将数据传递给activity_main

例如:

在[C0页中]

activity_main

在[C0页中]

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if (requestCode == 0x001 ) {
            if (resultCode == Result.Ok)
            {
                string result = data.GetStringExtra("test");
                Log.Debug("123456", "******result = " + result);
            }
            else {
                Log.Debug("123456", "******cancel = null ");
            }
        }
    }

更新:

是,您可以使用多种方法来实现这一目标。一种简单的方法是使用callBack。例如,您可以在activity_list中定义一个//here define a bool value to flag if you need to pass data to page `activity_main` bool haveGetData = false; public override void OnBackPressed() { //base.OnBackPressed(); haveGetData = true; if (haveGetData) { var intent = new Intent(); intent.PutExtra("test", "nicole..123"); SetResult(Result.Ok, intent); Finish(); } else { var intent = new Intent(); SetResult(Result.Canceled, intent); Finish(); } } (我只是将一个简单的字符串定义为参数)

EventHandler

当返回到页面activity_list时当前页面不可见时,可以在方法public static EventHandler<string> mEventHandler; // define a EventHandler 中调用它:

activity_main

同时,在页面OnStop()中将其初始化:

protected override void OnStop()
    {
        base.OnStop();

        EventHandler<string> handler = mEventHandler;
        if (handler != null)
        {
            mEventHandler(this, "1111111");
        }
    }

回调方法activity_main

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

        // Create your application here
         // other code 
         // ActivityList  is the name of page `activity_list`
        ActivityList listActivity = new ActivityList();
        ActivityList .mEventHandler += delegate (object s, string a)
        {
            BackCall(s, a);
        };
    }
© www.soinside.com 2019 - 2024. All rights reserved.