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

时间:2017-06-30 15:40:15

标签: android android-studio static kotlin subclass

将Java代码转换为Kotlin以获取由子类Fragment组成的Activity之后,布局将不再适当呈现(对于此帖子的底部的logcat错误)。我想因为声明一个Activity的子类必须声明为公开静态,这就是我转换为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>

抛出异常:

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

...所有这些都说,如何正确声明活动的子类公开静态

2 个答案:

答案 0 :(得分:3)

用Java的说法,默认情况下,Kotlin中的static中的一个nested默认为public(默认情况下,所有类都为savedInstanceState)。这不应该是一个问题。

你因为可空性而得到例外:你应该在onCreatePreferences中使Bundle?参数成为可空的null,因为这个函数可能被框架调用{override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String) { addPreferencesFromResource(R.xml.settings_main) } 1}}值,如果此处的类型不可为空,它将在每次崩溃时崩溃。

所以你想要最终得到的是:

import numpy as np
a = [[1,0],[2,3]]
print(np.sum(a,axis=1)) # gives [1,5]

答案 1 :(得分:2)

看起来你的堆栈跟踪是一个空的安全问题。由于您在其他每个与Bundle相关的方法上都允许空值,您是否尝试添加:

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