【问题标题】:savedInstanceState not restoring Fragment properlysavedInstanceState 没有正确恢复 Fragment
【发布时间】:2018-12-20 20:27:15
【问题描述】:

为什么我的片段在我使用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()
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    这里有一些问题。

    1. 您应该将内容视图设置为 onCreate(),而不是 onStart()onStart() 可以为同一个 Activity 实例多次调用。例如,如果您启动Activity,按下主页按钮,然后恢复您的应用程序,您将经历onPause()onStop(),然后是onStart()onResume()。您只需要在创建 Activity 时初始化您的视图。

    2. 仅当Activity 正在重新创建 时,才会执行显示Fragment 的逻辑。我想你的意思可能是相反的。您可以简单地将其更改为if (!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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多