Android 自定义视图,不调用onSaveInstanceState
我创建了一个自定义视图,并尝试在屏幕旋转时自动恢复状态(就像Android 自定义视图,不调用onSaveInstanceState,android,kotlin,android-view,android-custom-view,Android,Kotlin,Android View,Android Custom View,我创建了一个自定义视图,并尝试在屏幕旋转时自动恢复状态(就像EditText自动恢复当前输入文本一样),但当我看到日志时,不会调用onSaveInstanceState,只调用onRestoreInstanceState。怎么了 class MyView:LinearLayout { constructor(context: Context?) : super(context) constructor(context: Context?, attrs: AttributeSet?
EditText
自动恢复当前输入文本一样),但当我看到日志时,不会调用onSaveInstanceState
,只调用onRestoreInstanceState
。怎么了
class MyView:LinearLayout
{
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context, attrs, defStyleAttr)
init
{
isSaveEnabled=true
}
override fun onSaveInstanceState(): Parcelable
{
return super.onSaveInstanceState()
Log.d("ss", "save")
}
override fun onRestoreInstanceState(state: Parcelable?)
{
super.onRestoreInstanceState(state)
Log.d("ss", "restore")
}
}
活动布局:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.loser.mylayouttest.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</AbsoluteLayout>
无法看到调用的
Log.d(“ss”、“save”)
的原因很简单,代码行是在return
语句之后调用的。实际上调用了onSaveInstanceState()
。要查看日志,请在上面移动log.d(“ss”,“save”)
返回super.onSaveInstanceState()调用onSaveInstanceState()
的场景是什么?屏幕旋转。AbsoluteLayout
不是自API 3以来就被弃用了吗?尝试FrameLayout
——并将Log语句放在return语句的上方。我没有注意到自动插入的“return”超级调用。我知道AbsoluteLayout不受欢迎,但我只想在这个例子中使用最简单的东西(这不是实际的项目)。所以OP应该在返回superWell之前调用日志,这很尴尬。超级调用是由IDE自动插入的,所以我没有注意到它是一个return语句。
class MainActivity : AppCompatActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}