savedInstanceState无法正确还原Fragment

时间:2018-12-20 20:27:16

标签: android android-fragments android-activity kotlin android-savedstate

为什么每当我使用savedInstanceState时,我的片段都会返回黑屏?我已经在活动中加入了相关的savedInstanceState代码,但是相关的片段仍然没有出现。

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

1 个答案:

答案 0 :(得分:1)

这里有一些问题。

  1. 您应该在onCreate()中而不是onStart()中设置内容视图。可以为同一onStart()实例多次调用Activity。例如,如果您启动Activity,按“主页”按钮,然后继续运行应用程序,则您将依次经过onPause()onStop()onStart(),{{ 1}}。您只需在创建onResume()时初始化视图。

  2. 仅当正在{strong>重新创建Activity 时,才显示Fragment的逻辑。我认为您可能是相​​反的意思。您可以简单地将其更改为Activity,但我建议通过像这样将视图初始化完全移到if (!activityRecreated)中,并仅检查主题状态在onCreate()中是否已更改来清理此问题:


onStart()