当调用IntPtr构造函数时,Xamarin Android会执行OnCreateView吗?

时间:2017-01-20 14:31:08

标签: c# android xamarin xamarin.android

我知道Xamarin Android中的构造函数难度,如下所述: No constructor found for ... (System.IntPtr, Android.Runtime.JniHandleOwnership)

和所有碎片&活动&我在应用程序中创建的其他自定义视图导入此构造函数。

但有时会在null reference exception方法中抛出OnCreateView。 例如:

public class TestView: Android.Support.V4.App.Fragment{

    public TestClass _testClass;

    public TestView (TestClass testClass)
    {
        this._testClass = testClass;
    }

    public TestView(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public override Android.Views.View OnCreateView (Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState)
    {
        View view = inflater.Inflate (Resource.Layout.Fragment_TestView, container, false);

        _testClass.ExecuteTestMethod();

        return view;
    }

}

这段代码偶尔会在null reference exception中抛出一个OnCreateView。这很少发生,从来没有直接从代码创建视图然后测试它。

现在很明显,此代码中唯一可以引发异常的点是_testClass变量。 所以现在显然我的问题是,OncreateView方法是否也在调用javaReference构造函数时执行?

1 个答案:

答案 0 :(得分:3)

即使在Java onCreateView中也可以在构造函数不存在的情况下调用,这就是片段生命周期的工作原理:

Fragment Lifecycle Diagram

在添加Fragment之前调用构造函数,但实例变量_testClass并不总是设置,因为Android在恢复时会调用默认构造函数。我猜你在旋转设备(连续三次?)和/或当你去另一个应用程序然后回来时你的崩溃正在发生

您需要通过持久化参数Bundle支持的基本数据类型)来创建TestClass onSaveInstanceState的实例,然后再进行管理使用它们在TestClass

中创建onResume的实例