片段OnFocusChange事件处理为时已晚

时间:2019-01-14 13:14:25

标签: android android-fragments eventhandler

我遇到片段事件的计时问题,希望有人能提供帮助。

按下按钮时,

我的主要活动启动我的信息显示活动。第二个活动包含两个片段,两个片段都有大量EditText视图,用户可以在其中输入信息。

片段中,我为每个视图使用FocusChange()事件处理程序。当视图失去焦点时,我知道文本编辑已完成,可以“抓取”新文本,我打算将其返回到“主活动”。

信息显示活动关闭时,它将意图返回到SetResult()中的Main活动。这是在OnBackPressed()和OnOptionsItemSelected()中完成的。

这一切都有效,但有一个例外:如果我单步浏览EditViews并更改文本,但是在从上一个EditView移出焦点之前,我先按下后退按钮,我发现该菜单中的OnActivityResult() Main Activity在片段中最后的FocusChange()事件被处理之前称为。尽管按下后退按钮确实会触发当前活动的EditText的FocusChange事件,但在调用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);
    }
}

是否有解决此问题的方法?

0 个答案:

没有答案