Kotlin 中的意图
Posted
技术标签:
【中文标题】Kotlin 中的意图【英文标题】:Intents in Kotlin 【发布时间】:2017-01-20 14:30:33 【问题描述】:所以,我知道在 Java 中我们使用它来启动新的Activity
Intent intent = new Intent(this, SomeActivity.class);
startActivity(intent);
但我正在使用 Kotlin 编写一个项目,所以在 Kotlin 中就像
val intent = Intent(this,SomeActivity::class.java)
startActivity(intent)
但它会因问题而崩溃
FATAL EXCEPTION: main
Process: com.pashabred.passlin, PID: 15243
java.lang.RuntimeException: Unable to start activity ComponentInfocom.pashabred.passlin/com.pashabred.passlin.Enterring: kotlin.KotlinNullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: kotlin.KotlinNullPointerException
at com.pashabred.passlin.Enterring.onCreate(Enterring.kt:17)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
【问题讨论】:
异常发生在 com.pashabred.passlin.Enterring.onCreate(Enterring.kt:17)。那条线上是什么? 【参考方案1】:在 Android 上使用 Kotlin 的意图几乎相同,我们只需要在语法上稍作更改,如下所示。
val intent = Intent(this,HelloActivity::class.java) startActivity(intent)
您得到的异常是活动上的onCreate
方法中的空指针异常,请检查相同..
【讨论】:
这似乎没有回答问题 为什么最后还要加上.java
? HelloActivity 不是 .kt 文件吗?
这是因为您从 Kotlin 调用 Java 代码,因为 Intent 是 Android 中的一个 Java 类,它接受 .class 引用,如下所述。 Intent(Context packageContext, Class cls) Kotlin 类引用与 Java 类引用不同。要获取 Java 类引用,请使用 KClass 实例上的 .java 属性,因为 SampleActivity::class 返回 KClass,它是 Kotlin 类而不是 java 类。因此,您不能将 Kotlin 类引用传递给 Java(在您的情况下为 Intent),因此您必须传递 Java 类引用。【参考方案2】:
确保您有(问号):
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
改为:
override fun onCreate(savedInstanceState: Bundle)
super.onCreate(savedInstanceState)
【讨论】:
是的,我有一个问号,任何其他想法可能是什么问题? 哦,没必要,我不知道为什么,但是当我重写代码时它开始工作)非常感谢您的帮助 然后接受答案 ;) 一切都一样,但我还是有意图的错误【参考方案3】:我用来打开新活动的最短和最简单的方法
startActivity(Intent(this@MainActivity, NextActivity::class.java))
P.S:这里要注意的一个要点是 Intent() 期望 packageContext 作为第一个参数,因此仅使用 this 仍然会引发错误。
因此,您需要明确定义类名。如上一行所示(this@MainActivity)
【讨论】:
【参考方案4】:正如this page 中所解释的,Anko 还提供了一些不错的函数来导航到其他活动,而无需创建意图、添加额外内容或调用函数。
一切都可以在一行中完成:
startActivity<DetailActivity>("id" to 2, "name" to "Kotlin")
这将为意图创建一组附加值,其值由函数作为参数接收的对列表指定。
【讨论】:
如果您复制并粘贴文章的一部分,请参考它。 antonioleiva.com/kotlin-awesome-tricks-for-android【参考方案5】:你可以这样调用
val intent = Intent(this, ListActivity::class.java)
startActivity(intent)
【讨论】:
【参考方案6】:kotlin 中的意图
//In Activity
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
//for fragment change "this" to "activity"
val intent = Intent(activity, MainActivity::class.java)
startActivity(intent)
kotlin 单行中的意图
startActivity(Intent(this, MainActivity::class.java))
【讨论】:
【参考方案7】:android kotlin 中的 Intents 可以如下使用。
val intent = Intent(this,YourActivity::class.java)
startActivity(intent)
此外,您遇到的异常存在于您的 onCreate
方法中。
【讨论】:
【参考方案8】:例如为应用实例创建单例类:
class MyApp: Application()
override fun onCreate()
super.onCreate()
instance = this
companion object
lateinit var instance: MyApp
private set
然后在您需要应用程序对象实例的地方调用它。例如:
val intent: Intent = Intent(MyApp.instance, DestinationActivity::class.java);
MyApp.instance.startActivity(intent)
【讨论】:
工作就像一个魅力!【参考方案9】:新活动的onCreate
方法出现空指针异常。请检查onCreate
方法。
【讨论】:
你能解释一下 的功能吗?在 onCreate【参考方案10】:你可以试试“context?.applicationContext”而不是“this”
val intent = Intent(context?.applicationContext,TimerActivity::class.java)
startActivity(intent)
【讨论】:
【参考方案11】:对于Adapter Class
指定您的context
val mContext: Context
然后
val intent = Intent(mContext, ActivityNext::class.java)
mContext.startActivity(intent)
【讨论】:
【参考方案12】:如果问题仍然存在或其他“Stack Overflowers”遇到类似情况,请确保您的 Activity 文件名(即 SomeActivity)在“AndroidManifest.xml”文件中相应命名或相同
【讨论】:
以上是关于Kotlin 中的意图的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 kotlin 中的意图传递对象的 MutableList