android - 当我尝试将数据从一个活动传递到另一个活动时,我的应用程序崩溃了
问题描述
好吧,这让我很困惑,我不太确定为什么会发生错误。所以我试图将从第二个活动的两个 EditTextboxes 输入的数据传回给调用它的原始活动。
MainActivity.kt:
类 MainActivity : AppCompatActivity() {
var CONTACT_DETAIL_ACTIVITY_REQUEST = 0
var listContacts = ArrayList<Contacts>()
val contactAdapter = DSArrayAdapter(this, R.layout.activity_listview, listContacts)
val listView1 = findViewById<ListView>(R.id.contact_list)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setTitle("Contacts")
listView1.setAdapter(contactAdapter)
listContacts.add(Contacts("Faisal is spoiled", 732, false))
listContacts.add(Contacts("Dawg", 666, false))
var sortedList = listContacts.sortedWith(compareBy({it.cname}))
listContacts.clear()
listContacts.addAll(sortedList)
contactAdapter.notifyDataSetChanged()
val delete_contacts = findViewById<Button>(R.id.delete_contacts)
delete_contacts.setOnClickListener({
var newlistContacts = ArrayList<Contacts>()
for (x in listContacts) {
if (x.cchecked == false) {
newlistContacts.add(x)
}
}
listContacts.clear()
listContacts.addAll(newlistContacts)
contactAdapter.notifyDataSetChanged()
})
val add_new_contact = findViewById<Button>(R.id.add_contacts)
add_new_contact.setOnClickListener {
val intent1 = Intent(this,ContactDetails::class.java)
startActivityForResult(intent1, CONTACT_DETAIL_ACTIVITY_REQUEST)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == CONTACT_DETAIL_ACTIVITY_REQUEST) {
if (resultCode == RESULT_OK) {
if (data != null) {
val n = data.getStringExtra("Name")?:"default value"
val p = Integer.parseInt(data.getStringExtra("Phone")?:"default value")
listContacts.add(Contacts(n, p, false))
val sortedList = listContacts.sortedWith(compareBy({it.cname}))
listContacts.clear()
listContacts.addAll(sortedList)
contactAdapter.notifyDataSetChanged()
}
}
}
}
}
现在,我收到的警告之一(针对 n 和 p)是 Type Mismatch: Expected String but received String? 老实说,我不确定那是什么。真的,任何帮助都将不胜感激,因为这对我来说没有多大意义
ContactDetails.kt:
class ContactDetails : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_contact_details)
setTitle("Contact Details")
val name = findViewById<EditText>(R.id.name)
val phone = findViewById<EditText>(R.id.phone_number)
val add_btn = findViewById<Button>(R.id.add_person)
add_btn.setOnClickListener {
val n = name.getText().toString()
val p = phone.getText().toString()
val intent = Intent()
intent.putExtra("Name", n)
intent.putExtra("Phone", p)
setResult(RESULT_OK, intent)
finish()
}
}
}
我在下面包含了活动日志:
引用 10-11 19:36:22.777 27183-27183/com.example.contactslist E/AndroidRuntime:致命异常:主进程:com.example.contactslist,PID:27183 java.lang.RuntimeException:无法实例化活动 ComponentInfo{com .example.contactslist/com.example.contactslist.MainActivity}:java.lang.IllegalStateException:系统服务在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 的 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 上的 onCreate() 之前不可用于活动。 ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage( Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android。app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com. android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang.IllegalStateException:系统服务在 android.app.Activity.getSystemService(Activity.java:5253) 的 onCreate() 之前对活动不可用在 android.view.LayoutInflater.from(LayoutInflater.java:229) 在 android.widget.ArrayAdapter.(ArrayAdapter.java:178) 在 android.widget.ArrayAdapter.(ArrayAdapter.java:163) 在 com.example.contactslist。 DSArrayAdapter.(DSArrayAdapter.kt:15) 在 com.example.contactslist.MainActivity.(MainActivity.kt:22) 在 java.lang.Class。在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1067) 的 newInstance(Native Method)在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os .Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)616)616)616)616)Instrumentation.newActivity(Instrumentation.java:1067) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11( ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148 ) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726 ) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)Instrumentation.newActivity(Instrumentation.java:1067) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11( ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148 ) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726 ) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)1067) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app .ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.app.ActivityThread 的 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148)。 main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:616)1067) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app .ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.app.ActivityThread 的 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148)。 main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:616)app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler。 dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native方法)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler。 dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native方法)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 的 lang.reflect.Method.invoke(Native Method) )1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 的 lang.reflect.Method.invoke(Native Method) )
解决方案
警告是因为 Kotlin 内置了null 安全性 ,这意味着 String 类型本身不是 null 但是某些方法可以返回一个 null 字符串,它是 String? 类型。所以你需要做的是提供一个替代值或默认值,以防你得到一个空字符串。
data.getStringExtra("Name")?:"default value"
这称为 elvis 运算符,您应该对 n 和 p 变量都这样做,因为 getStringExtra 可以返回空字符串
此外,我认为您没有覆盖将数据接收回原始活动的正确方法。请试试
override fun onActivityResult(requestCode:Int, resultCode:Int, data:Intent?)
代替
fun onActivity(requestCode: Int, resultCode: Int, data: Intent)
值得注意的是
数据:意图?
关于我建议您使用的方法。这也意味着 Intent 可以为空,但是如果您阅读null 安全性,它将教您如何处理它,同时您可以使用类似的东西
data?.let{ d -> //do stuff here inside }
通过这样做,您可以确保 data 不为空,并且它已被重命名为 d 因此在大括号内正常使用但调用
d.getStringExtra("Name")
反而。
最后但不是让另一件事给你带来麻烦是尝试使用 Avtivity 参考
这个
正如 Md Sufi Khan 指出的那样,在 onCreate 方法完成之前。我建议您对这样的代码使用延迟初始化
val contactAdapter = by lazy{ DSArrayAdapter(this, R.layout.activity_listview, listContacts)}
这意味着 contactAdapter 不会在第一次需要时立即创建,或者如果您愿意,您可以在 onCreate 内部初始化。
我希望这会有所帮助:)
推荐阅读
- css - 如何制作圆形照片的裁剪?
- kotlin - Kotlin 函数作为 val 表达式
- python - distplot 折旧。尝试使用函数使用 displot 或 histplot 创建多个图
- javascript - 使元素在角度 2 中可调整大小
- c++ - C++ 中的惰性概念(或如何在概念中保存类型)
- if-statement - 使用 rand MethodError: 没有方法匹配 isless(::Array{Float64,1}, ::Float64)
- javascript - 解析 HTML 代码并保留原始大小写
- python - 在python绘图动画中更改点颜色
- javascript - 仅当名称和位置不匹配时才插入
- python - 如何获取for循环的计数并将其存储到for循环内部的字典中