【问题标题】:How to Pass a List of Objects from activity A to activity B in Kotlin?如何在 Kotlin 中将对象列表从活动 A 传递到活动 B?
【发布时间】:2020-02-06 09:15:10
【问题描述】:

我有 2 个活动,我想传递一个对象的数组列表并在 ListView 上显示它

活动 A:

     btnGuardar.setOnClickListener{

                if(edtNombre.text.toString().equals("") || 
                     edtApellido.text.toString().equals("") || 
                     edtFecha.text.toString().equals("")){

                    Toast.makeText(this@Main2Activity, "Debes llenar todos los campos!", Toast.LENGTH_SHORT).show()
                }else{
                    var estadoSel : String
                    estadoSel = estado.onItemSelectedListener.toString()
                   var per = Persona(edtNombre.text.toString(),edtApellido.text.toString(),estadoSel,edtFecha.text.toString())
                    personas.add(per)
                    val intent = Intent(this@Main2Activity,Main3Activity::class.java)
                    //intent.putExtra("Personas",  personas as Serializable)
                    intent.putParcelableArrayListExtra("Personas", ArrayList(personas))
                    edtFecha.text = null
                    edtApellido.text = null
                    edtNombre.text = null
                    estado.setSelection(0)
                    Toast.makeText(this@Main2Activity, "Registro Guardado", Toast.LENGTH_SHORT).show()
                }
            }

活动 B:

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main3)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        //val intent = Intent()
        val bundle = getIntent().extras
        var arr  = bundle?.getParcelableArrayList<Persona>("Personas")!!
        //var arr : ArrayList<Persona> = (ArrayList<Persona>())intent.getSerializableExtra("Personas")
        //intent.getSerializableExtra("Personas")
        //arr = intent.extras!!.get("Personas")
        val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, arr)
        listaPersonas.adapter = adapter
    }

但是我得到一个空指针异常

【问题讨论】:

  • 请发布您的logcat
  • startActivity 调用在哪里?
  • 哪一行你得到空指针异常?你在Persona上实现了Parcelable接口吗?

标签: android kotlin android-intent android-activity


【解决方案1】:

在你应用的 android 范围下的 build.gradle 中添加这个并同步 gradle -

androidExtensions {
        experimental = true
    }

然后让你的对象类parceble如下 -

@Parcelize
data class Persona() : Parcelable {

}

现在您可以按意图发送和接收 Parcelable 列表。

注意* - Parcelize 是实验性功能。

【讨论】:

    【解决方案2】:

    通过 Intent 传递数据列表在 Model 类上实现 Parcelable 接口。

    人物模型类:

    import android.os.Parcel
    import android.os.Parcelable
    
    
    data class Person(val name: String?, val age: Int) : Parcelable {
        constructor(source: Parcel) : this(
            source.readString(),
            source.readInt()
        )
    
        override fun describeContents() = 0
    
        override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
            writeString(name)
            writeInt(age)
        }
    
        companion object {
            @JvmField
            val CREATOR: Parcelable.Creator<Person> = object : Parcelable.Creator<Person> {
                override fun createFromParcel(source: Parcel): Person = Person(source)
                override fun newArray(size: Int): Array<Person?> = arrayOfNulls(size)
            }
        }
    }
    

    MainActivity:

    class MainActivity : AppCompatActivity() {
    
    
        var personList = arrayListOf<Person>()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
    
            personList.add(Person("Person1", 31))
            personList.add(Person("Person2", 32))
            personList.add(Person("Person3", 33))
    
            var intent = Intent(this, BActivity::class.java)
            intent.putParcelableArrayListExtra("personList", personList)
            Handler().postDelayed( {startActivity(intent)}, 2000)
        }
    }
    

    BActivity:

    class BActivity : AppCompatActivity() {
    
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_b)
    
            val extras = intent.extras
            val personList = extras?.getParcelableArrayList<Person>("personList")
    
    
            if (personList != null) {
    
                personList.forEach { Log.i("BActivity", "Name: ${it.name} Age: ${it.age}" ) }
    
            }else{
                Log.i("BActivity", "PersonList in null");
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      在您的活动 B 中获取您的列表尝试如下

      var arr = this.getIntent().getParcelableArrayListExtra<Parcelable>("Personas")
      

      并确保您的Personaextend Parcelable,如下所示。

      class Persona() : Parcelable {
         // ....
         @Override
         public void writeToParcel(Parcel dest, int flags) {
             //....
         }
      
         private void readFromParcel(Parcel in) {
            //....
         }
         override fun describeContents(): Int {
            return 0
         }
      
         companion object CREATOR : Creator<Persona> {
          override fun createFromParcel(parcel: Parcel): Persona{
            return Persona(parcel)
          }
      
          override fun newArray(size: Int): Array<Persona?> {
            return arrayOfNulls(size)
          }
        }
      
      }
      

      【讨论】:

        【解决方案4】:

        在您的 Activity A 发送数组列表中

        intent.putParcelableArrayListExtra("Personas", personas)
        

        在您的 Activity B 中获取数组列表

        intent.getParcelableArrayListExtra("Personas")
        

        在你应用的 build.gradle 里面的 android 标签中添加这个并与 gradle 同步 -

        androidExtensions {
                experimental = true
            }
        

        数据类

        @Parcelize data class Persona(
            val name: String,
            ) : Parcelable
        

        【讨论】:

        • 像魅力一样工作,而且它不再是实验性的;)
        【解决方案5】:

        第 1 步。将此添加到您的应用程序 build.gradle 内的 android 范围内。

         androidExtensions {
                experimental = true
            }
        

        第二步:让对象类实现 Parcelable

        @Parcelize
         class Persona():Parcelable {
        }
        

        第 3 步。在 Activity A 中通过 Intent 发送数据:

          val intent = Intent(this, B::class.java)
                    intent.putParcelableArrayListExtra("list", personaArrayList)
                    startActivity(intent)
        

        第 4 步:在活动 B 中接收数据:

         val list = intent.getParcelableArrayListExtra<Persona>("list")
        

        【讨论】:

          猜你喜欢
          • 2018-07-10
          • 1970-01-01
          • 2021-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-09
          相关资源
          最近更新 更多