Xamarin表示Android OnAppearing在PopModalAsync之后不触发

时间:2014-07-28 15:02:20

标签: xamarin xamarin.android xamarin.forms

在使用Modal页面的同时调用PopModalAsync后,Android是否有触发不触发的方法。这是一个例子:

using System;
using Xamarin.Forms;

namespace XamarinForms
{
    public class OnAppearingBug : ContentPage
    {
        Label label;
        public OnAppearingBug ()
        {
            label = new Label {
                Text = "Page"
            };
            Button button = new Button {
                Text = "PushModal"
            };
            button.Clicked += (sender, e) => Navigation.PushModalAsync (new PopModalBug ());

            Content = new StackLayout {
                Children = { label, button }
            };
        }
        protected override void OnAppearing(){
            label.Text = "OnAppearing";
        }
    }
}

using System;
using Xamarin.Forms;

namespace XamarinForms
{
    public class PopModalBug : ContentPage
    {
        public PopModalBug ()
        {
            Button button = new Button {
                Text = "Pop Back"
            };
            //Bug: This will not trigger OnAppearing on Android
            button.Clicked += (sender, e) => Navigation.PopModalAsync();

            Content = new StackLayout {
                Children = { button }
            };
        }
    }
}

6 个答案:

答案 0 :(得分:6)

另请参阅http://forums.xamarin.com/discussion/21417/navigationpage-push-pop-event-sequence-different-across-platformshttp://forums.xamarin.com/discussion/18781/ios-and-android-different-behaviors-for-onappearing

但截至目前(Xamarin.Forms 1.2.2)唯一/最佳解决方案是CrisWebb上面提出的解决方案:

在您的主页上 -             MessagingCenter.Subscribe(this," popped",(sender)=>             {                 //要运行的代码             });

在您的模态页面上 -             MessagingCenter.Send(this," popped");

答案 1 :(得分:2)

这是keith_r所指出的问题。

作为MessagingCenter的替代方案,您可以使用在推送或弹出模式页面时触发的Xamarin.Forms.Application事件。

应用事件描述here

在您的Xamarin.Forms.Application MyApp类中,您可以保留OnAppearingBug页面的句柄。在MyApp中,您可以根据需要收听模态页面推送/ poppig和命令OnAppearingBug页面。

答案 2 :(得分:0)

当您调用await方法时,请不要忘记Async,例如,按钮点击应如下所示:

    button.Clicked += async (sender, e) => await Navigation.PopModalAsync();

    button.Clicked += async (sender, e) => await Navigation.PushModalAsync(new PopModalBug ());

答案 3 :(得分:0)

我现在实际上遇到了同样的问题。它非常令人沮丧,因为甚至没有办法用自定义渲染器滚动自己,因为所有表单页面都被认为是android上的一个活动,因此它根本没有获得任何生命周期通知。 / p>

我找到的唯一解决方案是使用MessagingCenter。您需要做的就是在消息弹出消息时从弹出窗口向您的内容页面发送消息。它有点额外的工作和意大利面条,但目前它确实是唯一的方式。

显然有一些额外的功能即将推出可能有助于解决这个问题,但目前还没有其他的事情要做。

答案 4 :(得分:0)

或者您可以使用pushModalAsync方法直接导航到页面。

答案 5 :(得分:0)

有一个简单的工作。例如,我的模态页面是一个日历,用户必须在POP之前选择一个日期。

所以,在Modal Page类中只创建一个Event(在我的例子中是OnDateSelected) 并从其父页面创建一个引用。