Я пытаюсь создать простое приложение, которое передает объекты между действиями, чтобы позже я мог использовать свойства класса в представлении реселлера. Я создал «Класс данных члена» и расширил его, чтобы он использовал интерфейс, доступный для перестановки.
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)
}
}
Я хотел бы отметить что я вроде новичка, поэтому я прошу прощения, если вопрос действительно прост.