Как отправить намерение обратно с помощью 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это то, что вы хотите.