Передача объекта, подлежащего передаче, из дочерней активности в первичную с использованием putextra - PullRequest
0 голосов
/ 13 сентября 2018

В учебных целях я пытаюсь сделать следующее:

Я хотел бы узнать, как обновить список объектов из вторичного класса.

Я знаю, что посылаемый объект более производительный, чем сериализованный, и я хотел бы пойти по этому пути

В моей основной деятельности у меня есть изменяемый список класса <entry>. Что я пытаюсь сделать, это обновить этот список, добавив новый объект, который я получаю, используя метод putextra

    //from here I gather my fields
    val i = Intent(this, NewEntry::class.java)

    //I try to get my new object
    val entry: Entry = i.getParcelableExtra("new")

    entryList.add(entry)                     //update list

Вторичное действие, которое создает объект, запускается слушателем onclick из основного действия

Затем другой слушатель, работающий по клику, возвращает меня к основной деятельности

val i = Intent(this, MainActivity::class.java)

    btnAdd.setOnClickListener {
        //intent.putExtra("name", etName.text.toString())
        //intent.putExtra("description", etDescription.text.toString())
        //intent.putExtra("id", etId.text.toString().toInt())
        val name: String = etName.text.toString()
        val description: String = etDescription.text.toString()
        val id: Int = etId.text.toString().toInt()
        val entry = Entry(name, description, id)
        i.putExtra("new", entry)
    }

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

Приложение мгновенно падает, и я получаю ошибку

java.lang.IllegalStateException: intent.getParcelableExtra("new") must not be null

Я думаю, что в onCreate putExtra ничего не дает или я пытаюсь неверно изменить процесс. Поэтому возникает вопрос: как я могу создать этот объект из вторичного действия, вернуться к первичному и увидеть обновленный список?

1 Ответ

0 голосов
/ 13 сентября 2018

Чтобы запустить и получить данные из другого действия, вы должны использовать метод startActivityForResult в Android.

MainActivity.kt

class MainActivity : AppCompatActivity() {

    companion object {
        val REQUEST_CODE_NEW_ENTRY = 1
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Start EntryActivity
        val i = Intent(this, NewEntry::class.java)
        startActivityForResult(i, REQUEST_CODE_NEW_ENTRY)
    }

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

        // Receive data from EntryActivity
        if (requestCode == REQUEST_CODE_NEW_ENTRY) {
            if (resultCode == Activity.RESULT_OK) {
                val entry: Entry? = data?.getParcelableExtra("new")
                entryList.add(entry!!)
            }
        }
    }
}

NewEntry.kt

btnAdd.setOnClickListener {
      //intent.putExtra("name", etName.text.toString())
      //intent.putExtra("description", etDescription.text.toString())
      //intent.putExtra("id", etId.text.toString().toInt())
      val name: String = etName.text.toString()
      val description: String = etDescription.text.toString()
      val id: Int = etId.text.toString().toInt()
      val entry = Entry(name, description, id)

      // Send entry back to MainActivity
      val intent = Intent().apply { putExtra("new", entry) }
      setResult(Activity.RESULT_OK, intent)

      // Finish current activity
      finish()
}
...