Android:是否未使用自定义视图;“来自xml”;需要有默认构造函数吗?

Android:是否未使用自定义视图;“来自xml”;需要有默认构造函数吗?,android,serialization,view,lifecycle,Android,Serialization,View,Lifecycle,我有一个自定义视图,我总是在代码中创建,并在代码中添加到视图层次结构中,因此它从不包含在xml中(我知道以后维护我的代码的下一个人可能希望从xml使用它,但为了简单起见,让我们假设这永远不会发生) 我的视图没有标准的构造函数((Contex),(Context,AttributeSet)),我的构造函数有一些额外的参数。这样行吗?我知道当视图包含在XML中时会调用标准构造函数,但是如上所述,我不使用XML中的视图。但是,我怀疑如果内存不足,我的活动被终止,但视图层次结构被保留,会发生什么情况?这

我有一个自定义视图,我总是在代码中创建,并在代码中添加到视图层次结构中,因此它从不包含在xml中(我知道以后维护我的代码的下一个人可能希望从xml使用它,但为了简单起见,让我们假设这永远不会发生)

我的视图没有标准的构造函数((Contex),(Context,AttributeSet)),我的构造函数有一些额外的参数。这样行吗?我知道当视图包含在XML中时会调用标准构造函数,但是如上所述,我不使用XML中的视图。但是,我怀疑如果内存不足,我的活动被终止,但视图层次结构被保留,会发生什么情况?这些构造函数不需要吗?因为Android在重新创建视图实例时调用它们?我通过在模拟器中设置为在我离开时终止活动来测试这一点——尽管缺少默认构造函数,但我的应用程序不会崩溃,自定义视图看起来正常。我的怀疑仍然存在,因为我不知道它到底是如何工作的

换言之,我的问题是: 1.在上述情况下,视图层次以何种形式保留?它只是序列化的吗?写入XML?还有别的办法吗? 2.当视图层次结构恢复时,如何重新创建视图对象(默认构造函数称为?构造函数,上下文参数称为?其他方式?)

谢谢

在上述情况下,视图层次以何种形式保留

它没有保存下来

恢复视图层次时,视图对象将如何重新创建

不管你的代码如何创建它们

未使用“来自xml”的自定义视图是否需要默认构造函数


您需要使用任何构造函数。布局膨胀需要双参数构造函数(
Context
AttributeSet
),这是我最后一次检查的。但是,如果您不使用它,就不需要实现它。

我从来没有听说过
“查看对象重新创建”
:当再次调用
活动#onCreate
时,您必须构建视图树。如果您选中此处,您将看到这一点“此方法的默认实现保存有关活动视图层次结构状态的信息,例如EditText小部件中的文本或ListView的滚动位置。“因此,似乎保留了一些有关视图层次结构的信息,我的问题基本上是如何根据这些保留的信息重新创建实际的视图实例,在这个过程中调用了什么构造函数等等。请检查我上面的评论,我在这里引用了有关视图状态保存的Android文档-这就是我的意思。@LukaszIndyk:view state!=视图层次结构。视图状态以一系列
Parcelable
对象的形式保留在另一个进程中。在配置更改或进程终止后,Android不会重新创建视图层次结构。但是,在您重新创建视图层次结构后,Android将尝试恢复您引用的文档中提到的各种内容的视图状态(例如,
EditText
)中的文本。好的,谢谢。你能描述一下Android是如何恢复视图状态的吗?我的意思是,在某个时候,我的活动和视图由于内存不足而被销毁,在销毁过程中,EditText中的文本由Android保存。然后我返回到我的活动,一旦调用create,我就以与最初相同的方式创建视图,并拥有它们——但它们是空的。EditText中以前的文本(现在是一个新实例)是如何从保存状态初始化的?@LukaszIndyk:重要的是ID值必须匹配。如果您正在动态创建小部件,并且希望Android在默认的
onSavedInstanceState()
处理过程中保持它们的状态,则需要为它们分配唯一的ID。@LukaszIndyk:请参见
onSaveInstanceState()
onRestoreInstanceState()。通过查看源代码,您可以在大多数有状态小部件中看到实现。下面是几年前我编写的一个简单的
ColorMixer
小部件,它演示了这一点: