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 调用之前初始化
我有一个应用程序由一个 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 调用之前初始化