Kotlin:声明一个Activity静态的子类

在将Java代码转换为包含子类Fragment的Activity后,布局将无法正确渲染(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() } } } 

…我尝试将片段的修饰符更改为“对象”,甚至将整个类存储在同伴对象中,但应用程序与相同的异常崩溃。

这是我的片段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 

…所有这一切说,我如何正确地声明一个活动公共静态的子类?

用Java的说法是, 嵌套在另一个类中的类在Kotlin中默认是static的(并且所有的类都默认是public的)。 这不应该是一个问题。

因为可空性,你会得到一个异常:你应该使onCreatePreferencessavedInstanceState参数成为一个可为空的Bundle? ,因为这个函数可能被一个null值的框架调用,并且每当这里的类型不可为空时,它就会崩溃。

所以你想结束的是这样的:

 override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) { addPreferencesFromResource(R.xml.settings_main) } 

它看起来像你的堆栈跟踪是一个无效的安全问题。 既然你允许在其他Bundle相关的方法中使用null,你试过添加:

  override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) { addPreferencesFromResource(R.xml.settings_main) }