Android savedInstanceState未正确还原片段
为什么每次使用savedInstanceState时,我的片段都会返回一个空白屏幕?我已经在活动中包含了相关的savedInstanceStatecode,但是关联的片段仍然没有出现Android savedInstanceState未正确还原片段,android,android-fragments,android-activity,kotlin,android-savedstate,Android,Android Fragments,Android Activity,Kotlin,Android Savedstate,为什么每次使用savedInstanceState时,我的片段都会返回一个空白屏幕?我已经在活动中包含了相关的savedInstanceStatecode,但是关联的片段仍然没有出现 class MyActivity : AppCompatActivity() { private var mCurrentValue: Boolean = false private var mTwoPane: Boolean = false private var activityRe
class MyActivity : AppCompatActivity() {
private var mCurrentValue: Boolean = false
private var mTwoPane: Boolean = false
private var activityRecreated: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
mCurrentValue = mSharedPreferences.getBoolean("preference_a", false)
when {
mCurrentValue -> setTheme(R.style.MyDarkTheme)
else -> setTheme(R.style.MyLightTheme)
}
super.onCreate(savedInstanceState)
activityRecreated = savedInstanceState != null
setContentView(R.layout.md)
}
override fun onStart() {
super.onStart()
setContentView(R.layout.md)
mTwoPane = findViewById<View>(R.id.detail_container) != null
val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
val mNewValue = mSharedPreferences.getBoolean("preference_a", false)
when {
mCurrentValue != mNewValue -> recreate()
}
val mToolbar = findViewById<Toolbar>(R.id.my_toolbar)
setSupportActionBar(mToolbar)
if (activityRecreated) {
val newFragment = MyFragment()
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.master_container, newFragment)
transaction.commit()
}
}
}
这里有一些问题 您应该在onCreate而不是onStart中设置内容视图。可以为同一活动实例多次调用onStart。例如,如果你开始活动,按Home按钮,然后继续你的应用程序,你将经历onPause、onStop、onStart、onResume。您只需要在创建活动时初始化视图 只有在重新创建活动时,才会执行显示片段的逻辑。我想你的意思可能正好相反。您可以简单地将其更改为“如果”!activityRecreated,但我建议通过将视图初始化完全移动到onCreate(如所示),并仅检查onStart中的主题状态是否已更改来清理此问题:
class MyActivity : AppCompatActivity() {
private val useDarkTheme: Boolean = false
private var twoPane: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
useDarkTheme = shouldUseDarkTheme()
setTheme(if (useDarkTheme) R.style.MyDarkTheme else R.style.MyLightTheme)
super.onCreate(savedInstanceState)
setContentView(R.layout.md)
// savedInstanceState will be null only the first time the Activity is created
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.master_container, MyFragment())
.commit()
}
twoPane = findViewById<View>(R.id.detail_container) != null
setSupportActionBar(findViewById(R.id.my_toolbar))
}
override fun onStart() {
super.onStart()
if (useDarkTheme != shouldUseDarkTheme()) {
recreate()
}
}
private fun shouldUseDarkTheme(): Boolean =
PreferenceManager.getDefaultSharedPreferences(this).getBoolean("preference_a", false)
}