Как отправить намерение обратно с помощью API ActivityLauncher?
Я использовал этот метод, чтобы попытаться отправить данные между действиями , но Google не показывает вам, как отправлять данные обратно из другого действия. Поэтому я начал искать другие методы, которые могли бы работать, и единственное, что я смог найти, этоActivity.setResult()
, но каждый раз, когда я пытаюсь запустить его, намерение ничего не возвращает или что оно делает , но не успевает использовать его. Я думаю, что мне нужен асинхронный метод, но опять же, Google не говорит вам.
Итак, у меня есть два действия, MainActivity и Second Activity, а в Main у меня есть
registerForActivityResult()
при этом я использую общую версию контракта Intent для регистрации (объяснено здесь ). Затем, во-вторых, у меня есть метод, который при щелчке TextView создает новый объект Intent и отправляет данные обратно.
Основная деятельность:
class MainActivity : AppCompatActivity() {
private var data: String = ""
private val activityLauncher: ActivityResultLauncher<Intent> =
registerForActivityResult<Intent, ActivityResult>(
StartActivityForResult()
) { result: ActivityResult ->
onActivityResult(result)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
/**
* Switches to a different Activity
* @return Nothing: do you see :Unit anywhere?
* @param view: The view to Use
*/
fun onClickSwitchActivity(view: View) {
val editText: EditText = findViewById<EditText>(R.id.etText)
val text: String = editText.text.toString()
val intent: Intent = Intent(this, SecondActivity::class.java)
intent.putExtra(REQUEST_RESULT, text)
activityLauncher.launch(intent)
}
fun onActivityResult(result: ActivityResult) {
if (result.resultCode == Activity.RESULT_OK) {
var intent:Intent?=null
if (result.data == null)
Toast.makeText(this, "Intent was null: nothing returned", Toast.LENGTH_LONG).show()
else{
intent = result.data
}
val tvReturn: TextView = findViewById<TextView>(R.id.tvReturn)
tvReturn.text = intent?.getStringExtra(REQUEST_RESULT) ?: "-1"
Toast.makeText(
this, "Greetings from event result handler! This was returned: ${tvReturn.text}",
Toast.LENGTH_LONG
).show()
}
}
companion object {
const val REQUEST_RESULT: String = "REQUEST_RESULT"
}
}
Вторая активность:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
fun closeActivity(view: View) {
injectIntent(42, true)
finish()
}
fun injectIntent(value: Int, send: Boolean = false): Intent {
val intent = Intent(this, MainActivity::class.java)
intent.apply {
putExtra(MainActivity.REQUEST_RESULT, value)
}
if (send) setResult(RESULT_OK, intent)
return intent
}
}
Теперь я хочу уточнить, что я не могу использовать
startActivityForResult
версия этого, так как это сейчас устарело.
Что я должен сделать, чтобы это сработало? Я что-то упустил в документах, потому что я смотрю на них уже неделю, пытаясь понять их смысл.
ОБНОВЛЕНИЕ: я обновил файлы kotlin для действий, чтобы лучше показать, что я делаю или сделал. Кроме того, согласно запросу, вот TextView из второго действия, которое контролирует возврат:
<TextView
android:id="@+id/tvFinish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="closeActivity"
android:text="Close"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/llInput" />
а вот для
MainActivity
:
<TextView
android:id="@+id/tvSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickSwitchActivity"
android:text="To Second Activity"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/llReturn" />
1 ответ
После воссоздания вашего приложения, его отладки и полного замешательства у меня есть ответ. Для чего это стоит, вот полный, минимальный, рабочий пример того, что вы ищете.
Вот ошибка:
-
SecondActivity
ставитint
в намерение -
MainActivity
звонитgetStringExtra
Это всегда будет возвращать ноль, так как с этим ключом
нет дополнительной строки.getIntExtra
это то, что вы хотите.