Android - Activity 和片段初始化

Android - Activity and Fragment initialization

我有一个应用程序由一个 activity 和几个片段组成,正如 Google 所推荐的那样。其他细节 。我想保持菜单静止并在中心的容器中切换我的片段。

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:someProperties="propertiesValues">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:someProperties="propertiesValues" />

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/navigation_map"
        />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:someProperties="propertiesValues" />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

主要活动

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        println("Activity creation")
        val binding = ActivityMainBinding.inflate(layoutInflater)
        println("Activity creation part 2")
        setContentView(binding.root)
        setSupportActionBar(binding.toolbar)

        User.initSharedPref(this)
    }

片段

private lateinit var mylist: MutableList<String>>
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    println("Fragment creation")

    mylist = User.loadScenarioList()
}

用户

object User
{
  private lateinit var sharedPref : SharedPreferences

  fun initSharedPref(context: Context){
    sharedPref = context.getSharedPreferences("JeuDePisteKtPreferenceFileKey",Context.MODE_PRIVATE)
  }

  fun loadList(): MutableList<String>> {
      val json = sharedPref.getString(KEY_LIST, "") ?: ""
      if (json == "") return mutableListOf()
      return Json.decodeFromString(json)
  }

}

遇到问题

当我启动 activity 时,它会初始化一个变量 sharedPref ,如代码所示。

但是当我在片段 onCreate 中使用此变量 (mylist = User.loadScenarioList()) 时,activity 中的绑定行失败并显示 Binary XML file line #31: Error inflating class androidx.fragment.app.FragmentContainerView,如下面的 logcat 所示[=22] =]

Logcat & 错误

这是完整的 logcat,我们可以看到第二个 sout 丢失了,但此时没有抛出任何错误。

这里的问题来自创建调用的顺序

我们可以在更正后的代码中看到它logcat

先调用activity onCreate,但在恢复activity OnCreate之前先调用fragment OnCreate。

所以片段 onCreate 中使用的每个变量都应该在 inflate 调用之前初始化