У меня проблема с синхронизацией фрагментов и надеюсь, что кто-нибудь может помочь.
Моя Основная активность запускает мою Информационную операцию отображения при нажатии кнопки. Второе действие содержит два фрагмента, каждый из которых имеет множество представлений 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);
}
}
Есть ли способ исправить это?