События фрагмента OnFocusChange обработаны слишком поздно - PullRequest
0 голосов
/ 14 января 2019

У меня проблема с синхронизацией фрагментов и надеюсь, что кто-нибудь может помочь.

Моя Основная активность запускает мою Информационную операцию отображения при нажатии кнопки. Второе действие содержит два фрагмента, каждый из которых имеет множество представлений EditText, в которые пользователь может вводить информацию.

В пределах фрагментов я использую обработчик событий FocusChange () для каждого представления. Когда представление теряет фокус, я знаю, что редактирование текста завершено, и я могу «захватить» новый текст, который я намеревался вернуть в Основное действие.

Когда действие отображения информации закрывается, оно возвращает намерение главной операции в SetResult (). Это делается в OnBackPressed () и OnOptionsItemSelected ().

Это все работает, за одним исключением: если я перехожу через EditViews и изменяю текст, но нажимаю кнопку возврата перед удалением фокуса с последнего EditView, я обнаруживаю, что OnActivityResult () в Main Активность вызывается до последнего обработанного события FocusChange () во фрагменте. Хотя нажатие кнопки «Назад» вызывает событие FocusChange для активного в данный момент EditText, это событие обрабатывается после вызова OnActivityResult (). В результате к моменту вызова OnActivityResult () текст окончательного EditText не входит в намерение.

Основная деятельность

// Assemble information in intent
intent.PutExtra(InformationDisplayConstants.SUPPLIER_NAME, this.SupplierName);
....

// Assembled all the information needed, now start the Information Display activity.
displayActivity.StartActivityForResult(intent, resultCode);

Показать активность начинается фрагменты.

Фрагмент 1: инициализировать текст и настроить обработчик событий ....

EditText supplierName = view.FindViewById<EditText>(Resource.Id.supplierTextView);
            supplierName.Text = Activity.Intent.GetStringExtra(InformationDisplayConstants.SUPPLIER_NAME);
            // Create an event handler which runs when the user finishes changing the supplier name. 
            supplierName.FocusChange += new EventHandler<View.FocusChangeEventArgs>((sender, e) =>
            {
                if (!e.HasFocus)
                {
                    informationDisplayActivity.IntentSetSupplierName(supplierName.Text);
                }
            });
...

Активность отображения информации

Когда пользователь нажмет «назад», вернитесь к основному действию с собранным намерением

Кнопка «Назад» вызовет событие FocusChange во фрагменте, но это происходит ПОСЛЕ OnBackPressed () и OnOptionsItemSelected (), поэтому последний элемент не находится в намерении, которое получает Main Activity.

public override void OnBackPressed()
{
    SetResult(Result.Ok, modifiedDataIntent);
    Finish();

    base.OnBackPressed();
}

public override bool OnOptionsItemSelected(IMenuItem item)
{
    switch (item.ItemId)
    {
        case Android.Resource.Id.Home:
            // Use Result.Canceled if we don't want to save modified data.
            SetResult(Result.Ok, modifiedDataIntent);
            Finish();
            return true;

        default:
            return base.OnOptionsItemSelected(item);
    }
}

Есть ли способ исправить это?

...