Как передать данные из одного Activity в другое, а затем получить их изменёнными обратно?
Нужно передать текст из MainActivity в EditPostActivity, где можно при желании отредактировать текст, затем вернуть этот отредактированный текст. Не могу придумать как передавать данные(post.content - одно из полей класса post) из viewModel.edited.observe(this).
Создаю контракт
val editPostLauncher = registerForActivityResult(EditPostResultContract()) { result ->
result ?: return@registerForActivityResult
viewModel.changeContent(result)
viewModel.save()
}
Кнопка при которой должен измениться текст
viewModel.edited.observe(this) { post ->
if (post.id == 0L) {
return@observe
}
editPostLauncher.launch()
}
}
Сам контракт
class EditPostResultContract(private val postContent: String) : ActivityResultContract<Unit, String?>() {
override fun createIntent(context: Context, input: Unit): Intent =
Intent(context, EditPostActivity()::class.java)
override fun parseResult(resultCode: Int, intent: Intent?): String? =
if (resultCode == Activity.RESULT_OK) {
intent?.getStringExtra(Intent.EXTRA_TEXT)
} else {
null
}
}
Активити где должен поменяться текст
class EditPostActivity() : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityEditPostBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.edit.requestFocus()
binding.ok.setOnClickListener {
val intent = Intent()
if (binding.edit.text.isNullOrBlank()) {
setResult(Activity.RESULT_CANCELED, intent)
} else {
val content = binding.edit.text.toString()
intent.putExtra(Intent.EXTRA_TEXT, content)
setResult(Activity.RESULT_OK, intent)
}
finish()
}
}
}
Ответы (1 шт):
Ваш контракт не принимает никаких входных параметров, ну почти. В текущей реализации вы прокидываете лишь параметр в конструктор и никак его в дальнейшем не используете.
Как выйти из этого положения? Модифицировать контракт следующим образом:
class EditPostResultContract() : ActivityResultContract<String, String?>() { // Допускаем, что входным значением будет тип `String`
override fun createIntent(
context: Context,
input: String
) = Intent(context, EditPostActivity::class.java).apply {
putExtra(LauncherActivity.SOME_KEY, input) // Пихаем значение
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
if (resultCode != Activity.RESULT_OK) return null
return intent?.getStringExtra(LauncherActivity.SOME_KEY) // Достаем значение
}
}
contract.launch("Your content goes here") // Запускаем передав нужное значение
И не забудьте поменять ключ при отправке результата из другой активити.
З.Ы. Не совсем понимаю каким образом обсервинг чего-то должен запускать активити, может все же на кнопку какую забиндите?