Да, поскольку вы используете StartActivityForResult
со страницы activity_main
, то OnActivityResult
из activity_main
всегда будет выполняться, когда вы вернетесь из activity_list
.
Согласно вашему описанию, вы можете использовать resultCode
, чтобы определить, вызвали ли вы функцию SetResult
или нет. Если вы вызываете SetResult
с параметром Result.Ok
, то мы можем передать значение на страницу activity_main
, если не значение Result.Ok
, это другие условия.
Кроме того, вы также можете определить допустимое значениеhaveGetData
для определения необходимости передачи данных в activity_main
.
Например:
на странице activity_main
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 ");
}
}
}
на странице 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();
}
}
Обновление:
Да, вы можете использовать множество способов для достижения этой цели. Один из простых способов - использовать callBack. Например, вы можете определить 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);
};
}
метод обратного вызова BackCall
void BackCall(object send, string s)
{
if (s == null)
{
throw new ArgumentNullException(nameof(s));
}
Toast.MakeText(this, "call bakc value is: " + s, ToastLength.Short).Show();
}