代码之家  ›  专栏  ›  技术社区  ›  wbk727

savedinstancestate未正确还原片段

  •  0
  • wbk727  · 技术社区  · 6 年前

    为什么我的片段每次使用都返回一个空白屏幕 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 回复  |  直到 6 年前
        1
  •  1
  •   Kevin Coppock    6 年前

    这里有一些问题。

    1. 您应该在中设置内容视图 onCreate() 不是 onStart() . OnStand() 可以为同一个调用多次 Activity 实例。例如,如果启动 活动 ,按Home键,然后继续你的应用程序,你将完成 onPause() ,请 onStop() 然后 OnStand() ,请 onResume() . 只有当 活动 创建。

    2. 显示的逻辑 Fragment 只有在 活动 正在被 再创造 . 我想你的意思可能是相反的。你可以简单地把它改成 if (!activityRecreated) 但是我建议通过将视图初始化完全移动到 OnCuto() 就像这样,只检查主题状态是否在 OnStand() :


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