Приложение падает, когда я передаю объект, который расширяет интерфейс - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь создать простое приложение, которое передает объекты между действиями, чтобы позже я мог использовать свойства класса в представлении реселлера. Я создал «Класс данных члена» и расширил его, чтобы он использовал интерфейс, доступный для перестановки.

data class Member(val name : String, val image : ByteArray) : Parcelable {
constructor(parcel: Parcel) : this(
    parcel.readString(),
    parcel.createByteArray()
) {
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(name)
    parcel.writeByteArray(image)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<Member> {
    override fun createFromParcel(parcel: Parcel): Member {
        return Member(parcel)
    }

    override fun newArray(size: Int): Array<Member?> {
        return arrayOfNulls(size)
    }
}

}

После этого я создал действие memberCreation для ввода некоторых данных в класс и передать класс обратно в основное действие с помощью намерения.

class MemberCreation : AppCompatActivity() {

private lateinit var profilePic : ImageView
private lateinit var nameEditText: EditText
private lateinit var saveButton: Button
private lateinit var profilePictureByteArray: ByteArray
private lateinit var member: Member

companion object{
    const val REQUES_CODE_GALLERY = 999
    const val EXTRA_REPLY = "robybp.coolkids.reply.extra"
}

@RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_member_creation)

    profilePic = findViewById(R.id.profile_picture)
    nameEditText = findViewById(R.id.name_edit_text)
    saveButton = findViewById(R.id.button_save)

    profilePic.setOnClickListener {
        ActivityCompat.requestPermissions(this,
            arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
            REQUES_CODE_GALLERY)
    }

    saveButton.setOnClickListener {
        if (nameEditText.text.isNotEmpty()){
            val activityIntet = Intent()
            val name : String = nameEditText.text.toString()
            member = Member(name, profilePictureByteArray)
            activityIntet.putExtra(EXTRA_REPLY, member)
            setResult(Activity.RESULT_OK, activityIntet)
            finish()
        }
    }
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    if (requestCode == REQUES_CODE_GALLERY){
        if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/*"
            startActivityForResult(intent, REQUES_CODE_GALLERY)
        }else{
            Toast.makeText(this, "You don't have the permission to access gallery", Toast.LENGTH_LONG).show()
        }
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUES_CODE_GALLERY && resultCode == Activity.RESULT_OK && data!= null) run {
        val uri: Uri = data.data
        try {
            val inputStream: InputStream = contentResolver.openInputStream(uri)
            val bitmap : Bitmap = BitmapFactory.decodeStream(inputStream)
            profilePic.setImageBitmap(bitmap)
            profilePictureByteArray = imageToArray(profilePic)

        }catch (e : FileNotFoundException){
            e.printStackTrace()
        }

    }
    super.onActivityResult(requestCode, resultCode, data)
}

private fun imageToArray(image : ImageView) : ByteArray{
    val bitmap = (image.drawable as BitmapDrawable).bitmap
    val stream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream)
    val image = stream.toByteArray()
    return image
}

}

Но когда я go вернулся, чтобы получить данные в моем основном действии, приложение просто вылетает без каких-либо предупреждения logcat. Также я знаю, что мне нужно выбрать изображение профиля из галереи, или приложение будет иметь sh. Я планирую добавить значение по умолчанию в profilePictureByteArray позже.

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

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == MEMBER_CREATION_REQUEST_CODE && resultCode == Activity.RESULT_OK){
        val member : Member = data!!.getParcelableExtra(MemberCreation.EXTRA_REPLY)
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...