para - programacion android pdf 2018
IllegalArgumentException: savedInstanceState especificado como no nulo es nulo (5)
Como @mcassiano señaló, parece que el problema no es con su método onCreate
sino en realidad con onActivityCreated
. Dos pensamientos
- Debido al hecho de que las bibliotecas y otras están en transición, por ahora puede que solo tenga que anular manualmente
onActivityCreated
en su fragmento y marcar explícitamente el paquete como anulable:(savedInstanceState: Bundle?)
. No debería tener que hacerlo, pero configurar manualmente la nulabilidad puede ayudar. - Me doy cuenta de que el bloqueo se reduce a BaseFragmentActivityGingerbread. ¿Es este el resultado de usar LifecycleActivity? ¿O tiene otras dependencias más antiguas y desactualizadas en su proyecto?
Recibo un error extraño cuando inicio mi MainActivity
:
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)
Esta es mi clase MainActivity
:
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
}
}
El error indica que el parámetro savedInstanceState
es nulo, cuando se especifica como no nulo; pero es savedInstanceState: Bundle?
( savedInstanceState: Bundle?
) y el método onCreate()
está marcado como @Nullable
en la fuente.
No he encontrado este error en ninguno de mis otros proyectos de Kotlin. Estoy usando la versión 1.1.2-5 de Kotlin; y tuvo el mismo error con 1.1.2-3.
El problema está en el AppInjector. Utilicé la muestra de GitHubBrowser de Google como lo hiciste y encontré este mismo error. Copié el código a mi proyecto y dejé que Android Studio lo convirtiera a Kotlin. Cuando hizo esto, no especificó correctamente la nulabilidad del parámetro savedInstanceState
, que es lo que está causando el bloqueo. Solo hazlo opcional como en el siguiente código y funcionará.
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)
}
}
Parece que el problema no está en el método onCreate
. Intente buscar en com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt)
. No puedo decir si es una clase generada, pero debería darle una idea de qué hacer a continuación.
Puede utilizar un operador de fusión nula ?:
. El savedInstanceState
pasará al método super.onCreate
solo si es @NonNull
; de lo contrario, si es null
, se pasará un Bundle()
vacío.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState?: Bundle())
}
Tuve exactamente el mismo problema, tienes que hacer tipos anulables aquí:
override fun onCreatePreferences(bundle: Bundle?, s: String?) {}