Android IllegalArgumentException:指定为非Null的savedInstanceState为Null
启动Android IllegalArgumentException:指定为非Null的savedInstanceState为Null,android,android-activity,kotlin,Android,Android Activity,Kotlin,启动main活动时,我遇到一个奇怪的错误: 06-16 16:01:05.193 2083-2083/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.android.example.github, PID: 2083 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.example.github/
main活动时,我遇到一个奇怪的错误:
06-16 16:01:05.193 2083-2083/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.example.github, PID: 2083
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.example.github/com.android.example.github.ui.MainActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
at com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt)
at android.app.Application.dispatchActivityCreated(Application.java:197)
at android.app.Activity.onCreate(Activity.java:961)
at android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(BaseFragmentActivityGingerbread.java:54)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:319)
at com.android.example.github.ui.MainActivity.onCreate(MainActivity.kt:20)
at android.app.Activity.performCreate(Activity.java:6682)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
这是我的main活动
课程:
class MainActivity : LifecycleActivity(), HasSupportFragmentInjector {
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
@Inject set
lateinit var navigationController: NavigationController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
if (savedInstanceState == null) {
navigationController.navigateToSearch()
}
}
override fun supportFragmentInjector(): AndroidInjector<Fragment> {
return dispatchingAndroidInjector
}
}
class MainActivity:LifecycleActivity(),HasSupportFragmentInjector{
lateinit var分派AndroidInjector:分派AndroidInjector
@注入装置
lateinit变量navigationController:navigationController
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.main_活动)
如果(savedInstanceState==null){
navigationController.navigateToSearch()
}
}
重写fun supportFragmentInjector():AndroidInjector{
回程调度和回程调度
}
}
当参数savedInstanceState
指定为非空时,该错误表示该参数为空;但是它是可空的(savedInstanceState:Bundle?
),并且onCreate()
方法在源代码中被标记为@nullable
我在我的其他Kotlin项目中没有遇到过这个错误。我使用的是Kotlin版本1.1.2-5;并且在1.1.2-3中出现了相同的错误。问题似乎不在onCreate
方法中。尝试查看com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt)
。我不知道它是否是一个生成的类,但它应该让您知道下一步要做什么。正如@mcassiano所指出的,问题似乎不在于您的onCreate
方法,而在于实际创建的onActivityCreated
。两个想法:
- 由于库等正在转换中,现在您可能需要在片段中手动覆盖
onActivityCreated
,并显式地将Bundle标记为可空:(savedInstanceState:Bundle?
)。您不必这样做,但是手动设置可空性可能会有所帮助
- 我注意到崩溃一直到BaseFragmentActivityGingerbread——这是使用LifecycleActivity的结果吗?或者您的项目中是否存在其他旧的过时依赖项
我遇到了完全相同的问题,您必须在此处创建可为空的类型:
override fun onCreatePreferences(bundle: Bundle?, s: String?) {}
问题出在AppInjector中。我像您一样使用了google GitHubBrowser示例,并遇到了相同的错误。我将代码复制到我的项目中,并让Android Studio将其转换为Kotlin。执行此操作时,它没有正确指定导致崩溃的savedInstanceState
参数的可空性。只要像下面的代码中那样将其设置为可选,它就会工作
object AppInjector {
fun init(app: App) {
DaggerAppComponent.builder().application(app)
.build().inject(app)
app
.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
handleActivity(activity)
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
}
})
}
private fun handleActivity(activity: Activity) {
if (activity is HasSupportFragmentInjector) {
AndroidInjection.inject(activity)
}
(activity as? FragmentActivity)?.supportFragmentManager?.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentCreated(fm: FragmentManager?, f: Fragment?,
savedInstanceState: Bundle?) {
if (f is Injectable) {
AndroidSupportInjection.inject(f)
}
}
}, true)
}
}
您可以使用空合并运算符?:
。savedInstanceState
将被传递给super.onCreate
方法,仅当它是@NonNull
时,否则,如果它是null
,将传递一个空的Bundle()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState?: Bundle())
}
您知道,内部函数super.onCreate
看起来像public void onCreate(Bundle savedInstanceState)
此saveInstanceState不能为Null,可能正在调用函数,但可以连接到其他函数。在我的例子中,super.onCreate
连接到onCreatePreferences
,然后我修复了这个问题,下面的代码是:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.preferences_pomodoro)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState?:Bundle.EMPTY)
if (context != null) {
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context!!)
}
}
如果其他方法无效,您可以通过以下方式传递空包:
if (savedInstanceState == null)
savedInstanceState = new Bundle();
super.onCreate(savedInstanceState);
或者,如果您总是想要一个空包,那么只需:
super.onCreate(new Bundle());
梅恩不太漂亮,但很管用。我也有同样的问题。AppInjector有什么问题,你能提出建议吗?如果我无法更改此定义怎么办?对于示例SDK库函数!谢谢我的DialogFragments(从Android Studio从java转换成Kotlin)崩溃了,只是一个简单的问题?在onCreateDialog(savedInstanceState:Bundle?):对话框中的Bundle上
修复了它!这似乎改变了继承函数的签名。我确认它可以工作,但是没有编译器错误。我们还可以通过什么方式更改重写的函数的签名?@LucasP。非常感谢。你救了我几个小时!谢谢你添加了一个答案!请您解释一下您在解决方案中所做的工作好吗?