Kotlin:声明 Activity 静态的子类
Kotlin: Declaring subclasses of an Activity static
将 Java 代码转换为 Kotlin 后 Activity 由子 class 片段组成,布局将不再正确呈现(logcat 错误此 post 的底部)。我想是因为声明 Activity 的子 classes 必须声明为 publicly static,这就是我在转换为 Kotlin 后所拥有的:
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
return true
}
return super.onOptionsItemSelected(item)
}
// Apparently the following class must be declared static.
class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListener {
override fun onCreatePreferences(savedInstanceState: Bundle, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
}
}
}
...我尝试将片段的修饰符更改为 "object",甚至将整个 class 存储在伴随对象中,但应用程序崩溃并出现相同的异常。
这是我的片段XML:
<?xml version="1.0" encoding="utf-8"?>
<fragment
android:id="@+id/fragment"
android:name="com.davenotdavid.dndheadlines.SettingsActivity$SettingsFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
抛出异常:
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
... 综上所述,我如何正确声明 Activity publicly static 的子classes?
用 Java 的说法来说,另一个 class nested 在 Kotlin 中默认是 static
(所有 class 都是 public
默认)。这应该不是问题。
尽管如此,由于可空性,您遇到了异常:您应该将 onCreatePreferences
中的 savedInstanceState
参数设置为可为空的 Bundle?
,因为框架可能会使用null
值,如果此处的类型不可为 null,它每次都会使您的应用程序崩溃。
那么你最终想要的是:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
从您的堆栈跟踪来看,这似乎是一个空安全问题。由于您在每个其他 Bundle 相关方法上都允许空值,您是否尝试添加:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
将 Java 代码转换为 Kotlin 后 Activity 由子 class 片段组成,布局将不再正确呈现(logcat 错误此 post 的底部)。我想是因为声明 Activity 的子 classes 必须声明为 publicly static,这就是我在转换为 Kotlin 后所拥有的:
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
return true
}
return super.onOptionsItemSelected(item)
}
// Apparently the following class must be declared static.
class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListener {
override fun onCreatePreferences(savedInstanceState: Bundle, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
}
}
}
...我尝试将片段的修饰符更改为 "object",甚至将整个 class 存储在伴随对象中,但应用程序崩溃并出现相同的异常。
这是我的片段XML:
<?xml version="1.0" encoding="utf-8"?>
<fragment
android:id="@+id/fragment"
android:name="com.davenotdavid.dndheadlines.SettingsActivity$SettingsFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
抛出异常:
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
... 综上所述,我如何正确声明 Activity publicly static 的子classes?
用 Java 的说法来说,另一个 class nested 在 Kotlin 中默认是 static
(所有 class 都是 public
默认)。这应该不是问题。
尽管如此,由于可空性,您遇到了异常:您应该将 onCreatePreferences
中的 savedInstanceState
参数设置为可为空的 Bundle?
,因为框架可能会使用null
值,如果此处的类型不可为 null,它每次都会使您的应用程序崩溃。
那么你最终想要的是:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
从您的堆栈跟踪来看,这似乎是一个空安全问题。由于您在每个其他 Bundle 相关方法上都允许空值,您是否尝试添加:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}