【问题标题】:Kotlin: Declaring subclasses of an Activity staticKotlin:声明 Activity 静态的子类
【发布时间】:2017-06-30 15:40:14
【问题描述】:

在将包含子类 Fragment 的 Activity 的 Java 代码转换为 Kotlin 后,布局将无法再正确呈现(logcat 错误位于本文底部)。我想是因为声明 Activity 的子类必须声明为 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()
        }
    }
}

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

这是我的片段 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的子类public static

【问题讨论】:

    标签: android android-studio static kotlin subclass


    【解决方案1】:

    用 Java 术语来说,另一个类 nested 在 Kotlin 中默认为 static(所有类默认为 public)。这应该不是问题。

    由于可空性,您会遇到异常:您应该将 onCreatePreferences 中的 savedInstanceState 参数设为可空 Bundle?,因为框架可能会使用 null 值调用此函数,它会如果此处的类型不可为空,则每次都使您的应用崩溃。

    所以你想要的结果是这样的:

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

    【讨论】:

    • 啊!应该知道的。显然我必须使 String 参数 rootKey 也可以为空......谢谢芽!
    【解决方案2】:

    从您的堆栈跟踪来看,这似乎是一个空安全问题。由于您允许在其他每个 Bundle 相关方法上使用空值,您是否尝试过添加:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多