Xamarin.Android, как перехватить закрытие активности / существующее событие перед вызовом OnActivityResult - PullRequest
0 голосов
/ 23 октября 2019

Я использую Xamarin.Android. У меня есть действие, скажем activity_main, которое имеет кнопку, которая вызывает новое действие, скажем, activity_list, которое показывает список, из которого пользователи могут переупорядочивать / удалять элементы.

Когда пользователь завершит редактирование списка, кнопка Назад будет нажата с activity_list, и тогда я хочу собрать информацию об измененном списке и передать Намерение с данными обратноactivity_main.

Я попытался переопределить метод OnDestroy или OnStop и оттуда вызвать SetResult. Но OnActivityResult activity_main всегда выполняется до SetResult.

Я знаю, что могу добавить кнопку «Готово» в список Activity_list, с помощью которой я могу собрать свои данные и использовать Finish (), чтобы закрыть список действий. Также я могу переопределить метод OnBackPress () для обработки кнопки Back . Но есть ли способ иметь метод обратного вызова / переопределения для обработки события «закрытие активности», такого как событие Form_Closing в приложениях WinForm, где я могу выполнить все операции до вызова OnActivityResult, не вызывая эти операции из всех без исключениятриггеры выхода?

1 Ответ

0 голосов
/ 23 октября 2019

Да, поскольку вы используете 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();
    }
...