首页 > 解决方案 > 当我尝试将数据从一个活动传递到另一个活动时,我的应用程序崩溃了

问题描述

好吧,这让我很困惑,我不太确定为什么会发生错误。所以我试图将从第二个活动的两个 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) ) 

标签: androidclasskotlinonactivityresult

解决方案


警告是因为 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 内部初始化。

我希望这会有所帮助:)


推荐阅读