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

将Java代码转换为包含子类片段的活动的Kotlin后,布局将不再适当地呈现(本文底部的logcat错误)。我想是因为声明活动的子类必须声明为公开静态的,这就是我在转换为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”,甚至将整个类存储在一个伴生对象中,但应用程序仍因同样的异常而崩溃

以下是我的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)
    }