当我尝试将数据从一个 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 中进行初始化。
希望对您有所帮助:)
嗯,这个让我很困惑,我不太确定为什么会发生错误。因此,我试图将从第二个 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 中进行初始化。
希望对您有所帮助:)