Android Kotlin:声明静态活动的子类
将Java代码转换为包含子类片段的活动的Kotlin后,布局将不再适当地呈现(本文底部的logcat错误)。我想是因为声明活动的子类必须声明为公开静态的,这就是我在转换为Kotlin后所做的:Android Kotlin:声明静态活动的子类,android,android-studio,static,kotlin,subclass,Android,Android Studio,Static,Kotlin,Subclass,将Java代码转换为包含子类片段的活动的Kotlin后,布局将不再适当地呈现(本文底部的logcat错误)。我想是因为声明活动的子类必须声明为公开静态的,这就是我在转换为Kotlin后所做的: class SettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
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”,甚至将整个类存储在一个伴生对象中,但应用程序仍因同样的异常而崩溃
以下是我的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>
。。。综上所述,我如何正确地声明一个活动的子类公共静态?用Java术语来说,另一个活动中的类在Kotlin中默认为
静态
(默认情况下,所有类都是公共
)。这应该不是问题
但是,由于可空性,您得到了一个异常:您应该将onCreatePreferences
中的savedInstanceState
参数设置为可空的Bundle?
,因为框架可以使用null
值调用此函数,如果此处的类型不可为null,则每次应用程序崩溃时,它都会崩溃
所以你想要的结果是:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
从堆栈跟踪来看,这似乎是一个空安全问题。由于您允许在其他与捆绑包相关的每个方法上使用空值,您是否尝试添加:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}
啊!我早该知道的。显然,我必须使字符串param rootKey也可以为null。。。谢谢你,巴德!
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) {
addPreferencesFromResource(R.xml.settings_main)
}