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