Android savedInstanceState未正确还原片段

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

为什么每次使用savedInstanceState时,我的片段都会返回一个空白屏幕?我已经在活动中包含了相关的savedInstanceStatecode,但是关联的片段仍然没有出现

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)
}