当我尝试将数据从一个 activity 传递到另一个时,我的应用程序崩溃了

My app crashing as I try to pass data from one activity to the other

嗯,这个让我很困惑,我不太确定为什么会发生错误。因此,我试图将从第二个 activity 的两个 EditTextboxes 输入的数据传回调用它的原始数据。

MainActivity.kt:

class 主活动: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)是类型不匹配:预期字符串但收到字符串?老实说,我不确定那是什么。真的,任何帮助将不胜感激,因为这对我来说没有多大意义

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()
    }
}
}

我在下面包含了 activity 日志:

quote 10-11 19:36:22.777 27183-27183/com.example.contactslist E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.contactslist, PID: 27183 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.contactslist/com.example.contactslist.MainActivity}: java.lang.IllegalStateException: System services not available to Activities before onCreate() at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at 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 Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate() at android.app.Activity.getSystemService(Activity.java:5253) at android.view.LayoutInflater.from(LayoutInflater.java:229) at android.widget.ArrayAdapter.(ArrayAdapter.java:178) at android.widget.ArrayAdapter.(ArrayAdapter.java:163) at com.example.contactslist.DSArrayAdapter.(DSArrayAdapter.kt:15) at com.example.contactslist.MainActivity.(MainActivity.kt:22) at java.lang.Class.newInstance(Native Method) at android.app.Instrumentation.newActivity(Instrumentation.java:1067) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at 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 Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

发生此错误是因为您在创建 contactAdapter 时尝试在调用 onCreate 方法之前使用 this 引用,并且在将视图设置为activity.

super.onCreate 调用后在 onCreate 方法内实例化 contactAdapter 并在 setContentView 调用后实例化 listView1 引用将解决您的问题。

警告是因为 Kotlin 内置了 null safety,这意味着 String 类型本身不是空的,但是一些方法可以 return 一个类型为 String? 的空字符串。所以你需要做的是提供一个替代值或默认值,以防你得到一个空字符串。

data.getStringExtra("Name")?:"default value"

这叫做猫王运算符 你应该对 n 和 p 变量都这样做,因为 getStringExtra 可以 return 空字符串

此外,我认为您没有覆盖将数据接收回原始数据的正确方法 Activity。请尝试

override fun onActivityResult(requestCode:Int, resultCode:Int, data:Intent?)

而不是

fun onActivity(requestCode: Int, resultCode: Int, data: Intent) 

值得注意的是

data:Intent?

关于我建议您使用的方法。这也意味着 Intent 可以为 null 但如果你阅读 null safety 它会教你如何处理它同时你可以使用类似

data?.let{ d -> //do stuff here inside }

通过这样做,您可以确保数据不为空,并且已将其重命名为 d,因此在花括号内正常使用但调用

d.getStringExtra("Name")

相反。

最后但重要的是,给您带来麻烦的另一件事是尝试使用 Avtivity 参考

this

在 onCreate 方法完成之前,正如 Md Sufi Khan 已经指出的那样。我建议您对这样的代码使用惰性初始化

val contactAdapter = by lazy{ DSArrayAdapter(this, R.layout.activity_listview, listContacts)}

这意味着 contactAdapter 不会在第一次需要时立即创建,或者您可以根据需要在 onCreate 中进行初始化。

希望对您有所帮助:)