我正在使用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
之前执行所有操作,而无需从每个调用这些操作退出触发器?
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);
};
}