【问题标题】:Will Xamarin Android execute OnCreateView when the IntPtr constructor is called?调用 IntPtr 构造函数时,Xamarin Android 会执行 OnCreateView 吗?
【发布时间】:2017-06-05 13:56:17
【问题描述】:

我知道 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;
    }

}

这段代码偶尔会在OnCreateView 中抛出一个null reference exception。当我直接从代码创建视图并随后对其进行测试时,这种情况很少发生,也永远不会发生。

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

【问题讨论】:

    标签: c# android xamarin xamarin.android


    【解决方案1】:

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


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

    您需要通过持久化使用onSaveInstanceState 创建TestClass 实例所需的参数Bundle 支持的基本数据类型)来管理它,然后使用它们创建一个实例TestClass 中的 onResume

    【讨论】:

    • 您好,谢谢您的回复!旋转被锁定在我们的应用程序中,因此不会发生恢复,但正如您指出的那样,当应用程序从睡眠状态或来自另一个应用程序时很可能会发生。我将在我们当前的应用程序中调查此潜在客户并回复您!谢谢!
    • @PhilippeCreytens 除了旋转之外,还有多个事件会导致配置更改(例如连接键盘、更改系统语言等),您可以禁用它们,但是您会破坏对以下内容的支持导致这些变化。 (不小心按了 Enter)您可以尝试通过锁定旋转来跳过支持正确的状态恢复,但是当人们在真空之外使用您的应用程序时,这是一个糟糕的解决方法,并且通常是不可持续的。越早记住它,你在路上的悲伤就越少。
    • 我与您完全相关,但我目前正在谈论的应用程序仅是肖像,所以这就是为什么应用程序中不提供旋转。不是因为这些问题。
    • @PhilippeCreytens 抱歉,我误读了“旋转已锁定在我们的应用程序中,因此不会发生还原”,这意味着配置更改不会因为锁定旋转而发生,而不是相反
    • 我实际上正要删除评论,但我认为这可能与许多其他可能阅读此类问题答案的人有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2015-07-09
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多