android - 如何在android Kotlin中将对象从一个活动传递到另一个活动?
问题描述
我是 android Kotlin 的新手。我正在尝试将对象从一项活动传递到我卡住的另一项活动,
我的课 :
data class MyPojo(val name: String, val age: String) : Serializable
第一活动:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val editTextName = findViewById<EditText>(R.id.EditName)
val editTextAge = findViewById<EditText>(R.id.EditAge)
val button = findViewById<Button>(R.id.ButtonSend)
button.setOnClickListener {
val object1 = MyPojo(editTextName.text.toString(),editTextAge.text.toString())
val intent = Intent(this,Main2Activity::class.java)
intent.putExtra("Obj",object1)
startActivity(intent)
}
}
}
第二活动:
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val obj :MyPojo = intent.getSerializableExtra("obj") as MyPojo
val textView : TextView = findViewById(R.id.textViewName)
val textViewAge : TextView = findViewById(R.id.textViewAge)
textView.setText(obj.name)
textViewAge.setText(obj.age)
}
}
错误 :
6-28 19:35:58.625 22192-22192/com.example.evalai.passingobjecttoactivity E/AndroidRuntime:致命异常:主进程:com.example.evalai.passingobjecttoactivity,PID:22192 java.lang.RuntimeException:无法启动活动ComponentInfo{com.example.evalai.passingobjecttoactivity/com.example.evalai.passingobjecttoactivity.Main2Activity}:kotlin.TypeCastException:null 不能在 android.app.ActivityThread 中转换为非空类型 com.example.evalai.passingobjecttoactivity.MyPojo。 performLaunchActivity(ActivityThread.java:2379) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 在 android.app.ActivityThread.access$800(ActivityThread.java:156) 在 android.app.ActivityThread$H.handleMessage( ActivityThread.java:1351) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:211) 在 android.app.ActivityThread.main(ActivityThread.java:5371) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com .android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:945) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:740) 原因:kotlin.TypeCastException: null 不能被转换为非空类型 com.example.evalai.passingobjecttoactivity.MyPojo 在 com.example.evalai.passingobjecttoactivity.Main2Activity.onCreate(Main2Activity.kt:14) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android。 app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:945) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 740) 原因:kotlin.TypeCastException: null 不能在 com.example.evalai.passingobjecttoactivity.Main2Activity.onCreate(Main2Activity.kt:14) 在 android.app 中转换为非 null 类型 com.example.evalai.passingobjecttoactivity.MyPojo .Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:945) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 740) 原因:kotlin.TypeCastException: null 不能在 com.example.evalai.passingobjecttoactivity.Main2Activity.onCreate(Main2Activity.kt:14) 在 android.app 中转换为非 null 类型 com.example.evalai.passingobjecttoactivity.MyPojo .Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)null 不能在 com.example.evalai.passingobjecttoactivity.Main2Activity.onCreate(Main2Activity.kt:14) 在 android.app.Activity.performCreate(Activity.java: 5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)null 不能在 com.example.evalai.passingobjecttoactivity.Main2Activity.onCreate(Main2Activity.kt:14) 在 android.app.Activity.performCreate(Activity.java: 5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
解决方案
您提供的用于将 pojo 存储到 Intent 中的密钥与您用于读取它的密钥不同(您使用“Obj”存储并使用“obj”读取)。
当您在 Main2Activity 中读取意图时,该键没有存储任何内容,因此您返回 null。而且,显然,您不能将 null 强制转换为 MyPojo。
为了避免这些问题,您应该始终为您的意图的键声明一个常量:
const val ARG_POJO = "argPojo"
并使用它来存储和读取它们:
店铺:
intent.putExtra(ARG_POJO, object1)
读:
val obj: MyPojo = intent.getSerializableExtra(ARG_POJO) as MyPojo
推荐阅读
- c++ - 为什么输出总是负数?
- python - 在具有矢量效果的 pyqt5 中调整 svg 图像大小的问题
- google-drive-api - fpdf 输出,是否可以将我的输出保存到特定帐户的谷歌驱动器?
- reactjs - React - 使用带有 useState Hook 的回调函数
- php - 将一组 URL 限制为最大值。每个子域+域 3 个项目
- django - Django 教程,如何发送多个参数?
- python - 在python中使用类方法设置类属性
- sql - INNER JOIN - 选择多于一行错误的结果
- r - 在编织 R 降价时尝试使用 tidyselect 函数创建新变量时 mutate_at 出错
- node.js - 使用 PM2 时如何仅在一个实例中运行代码?