Android с Kotlin - передать данные назад к предыдущему действию - PullRequest
0 голосов
/ 23 января 2020

Я хочу передать данные из упражнения 2 обратно в упражнение 1, но оно не работает. Я пытался решить с onActivityResult, но он никогда не вызывается.

Это мой Acitvity 1 - ProductsActivity

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        Log.v("onActivityResult", "onActivityResult")
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) {
            // 2
            if (resultCode == Activity.RESULT_OK) {
                // 3
                Log.v("onActivityResult", "onActivityResult")
            }
        }
    }

А вот мой второй Acitvity - DetailsProductAcctivity

override fun onBackPressed() {
        super.onBackPressed()
        Log.v("onActivityResult", "on back pressed")
        val intent = Intent(this, ProductsActivity::class.java)
        startActivityForResult(intent, 1)
    }

Ответы [ 5 ]

2 голосов
/ 23 января 2020

Не вызывается, потому что:

  1. Вы не устанавливаете результат
  2. Похоже, вы создаете новое действие вместо того, чтобы завершить текущее (?)

В вашем первом занятии:

private fun launchNewActivity() {
    val requestCode = [yourCodeHere]
    val intent = Intent(this, ProductDetailsActivity::class.java)
    startActivityForResult(intent, requestCode)
}

В вашем втором занятии

private fun passProductAsResult(product: Product) {
    val data = Intent()
    data.putExtra("product", product.toString());

    setResult(Activity.RESULT_OK, data);
    finish()
}

Возвращение в ваше первое занятие override метод onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
     if(resultCode != Activity.RESULT_OK) return
     when(requestCode) {
         [yourRequestCode] -> { yourTextView.text = data.getStringExtra("product"); }
         // Other result codes
         else -> {}
     }
}

Убедитесь, что тип данных Serializable или Parcelable, если вы используете сложные типы данных.

1 голос
/ 23 января 2020

В вашей Деятельности 2 вы должны сделать, как показано ниже

override fun onBackPressed() {
        Log.v("onActivityResult", "on back pressed")
        val data = new Intent()
        data.putExtra(INTENT_PRODUCT_CHANGED, productChanged)
        //startActivityForResult(intent, 1)
        setResult(Activity.RESULT_OK, data)
        finish()    
    }

Вы должны просто удалить super.onBackPressed()

1 голос
/ 23 января 2020

Активность 1

startActivityForResult(intent, 1)

Активность 2

override fun onBackPressed() {
        super.onBackPressed()        
        val intent = Intent()
        intent.putExtra("Key",data)
        setResult(RESULT_OK, intent);
        finish()
}

Активность 1 снова

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        Log.v("onActivityResult", "onActivityResult")
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) {
            if (resultCode == Activity.RESULT_OK) {
                //get extra data from data intent here
            }
        }
}
0 голосов
/ 23 января 2020

У меня другая проблема.

Будет вызван onActivityResult, но данные будут нулевыми. И resultCode равен 0.

Активность 1:

startActivityForResult(intent, 1)

И это

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            val resultString = data!!.getStringExtra(DetailsProductActivity.INTENT_PRODUCT_CHANGED)
        }
    }
}

Активность 2:

override fun onBackPressed() {
        super.onBackPressed()
        Log.v("onActivityResult", "on back pressed")
        val data = Intent()
        data.putExtra(INTENT_PRODUCT_CHANGED, productChanged)
        //startActivityForResult(intent, 1)
        setResult(Activity.RESULT_OK, data)
        finish()    
    }
0 голосов
/ 23 января 2020

Вы должны использовать не

startActivityForResult(intent, 1)

, а

setResult(RESULT_OK, intent);
finish();
...