Мое приложение падает, когда я пытаюсь передать данные из одного действия в другое - PullRequest
0 голосов
/ 12 октября 2019

Ну, это меня смущает, и я не совсем уверен, почему происходит ошибка. Поэтому я пытаюсь передать данные, введенные из двух окон EditTextbox из второго действия, обратно в исходное, которое его вызвало.

MainActivity.kt:

class 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: Несоответствие типов: ожидаемая строка, но полученная строка? Я честно не уверен, о чем это. На самом деле, любая помощь будет оценена по этому вопросу, поскольку это не имеет большого смысла для меня

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: Невозможно выполнитьсоздание экземпляра Activity ComponentInfo {com.example.contactslist / com.example.contactslist.MainActivity}: java.lang.IllegalStateException: системные службы недоступны для операций до onCreate () в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2327)на 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) на android.app.ActivityThread.main (ActivityThread.java:5417) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) на com.android.internal.os. ZygoteInit.main (ZygoteInit.java:616) Причина: java.lang.IllegalStateException: системные службы недоступны для операций перед onCreate () в android.app.Activity.getSystemService (Activity.java:5253) в 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.newInstance (собственный метод) на android.app.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)) в android.app.ActivityThread.main (ActivityThread.java:5417) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726)) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Предупреждения вызваны тем, что Kotlin имеет встроенную нулевую безопасность , что означает, что тип String сам по себе не является нулевым, однако некоторые метонды могут возвращать пустую строку типа 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) 

Стоит обратить внимание на данные

: Намерение?

вкл. метод, который я советую вам использовать. Это также означает, что Намерение может быть нулевым, но если вы прочитаете нулевую безопасность Это научит, как справиться с этим, тем временем вы можете использовать что-то вроде

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

, выполнив этоубедитесь, что данные не равны NULL и что они были переименованы в d, поэтому в фигурных скобках используются как обычно, но вместо этого вызовите

d.getStringExtra("Name")

.

И последнее, но не выводитДругая вещь, которая доставляет вам неприятности, - это попытаться использовать справочник по Avtivity

this

до того, как метод onCreate будет завершен, как уже указала Су-Хан Хан. Я бы посоветовал вам использовать ленивую инициализацию в вашем коде, как этот

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

, что означает, что contactAdapter не будет создан сразу же, когда потребуется время, или вы можете инициализировать внутри onCreate, если захотите.

Надеюсь, это поможет:)

0 голосов
/ 12 октября 2019

Эта ошибка возникает, когда вы пытаетесь использовать this ссылку перед тем, как onCreate вызывается при создании contactAdapter, а также с использованием findViewById перед установкой представления для действия.

Instantiate contactAdapter внутри onCreate метод после super.onCreate вызова и listView1 ссылка после setContentView вызова решит вашу проблему.

...