Как правильно вызвать startActivityForResult из дочернего фрагмента - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над приложением для Android с kotlin, так что ...

Контекст: у меня есть активность (A), чем у viewPager, viewPager содержит 2 фрагмента (F1, F2), один из этих фрагментов (F1) имеет еще 2 фрагмента (CF1, CF2)

Проблема в том, что когда я вызываю действие (B) для результата из фрагмента (CF1), действие (A) получает результат от действия (B), затем передается во фрагмент (F1), но никогда не получать по фрагменту (CF1)

val intent = Intent(activity, B::class.java)//how i call activity(B) so good
            intent.putExtra("select",1)
            //parentFragment!!.startActivityForResult(intent, REQ_CODE)//
            startActivityForResult(intent, REQ_CODE)

//how i receive on Activity(A) so good
    public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
            for(i in 0..adapterNormal.COUNT){
                var f = adapterNormal.getItem(i)
                f?.onActivityResult(requestCode,resultCode,data)
            }
    }

    //how i receive on fragment(F1) so good
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
                if(resultCode == RESULT_OK){
                    cli_name = data!!.getStringExtra("clie_name")
                    cli_id = data.getStringExtra("clie_id")
                }
        }
//how i tried to receive on fragment(CF1)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Log.d("onActivityResult", "requestCode = $requestCode")
    }

Я пытался упростить проблему, надеюсь, кто-нибудь сможет мне помочь. Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Проблема в том, что когда я вызываю активность (B) для результата из фрагмента (CF1), активность (A) получает результат от активности (B), затем передается фрагменту (F1), но никогда не получает фрагмент (CF1). )

В вашем фрагменте (CF1) используйте startActivityForResult

        val intent = Intent(context, B::class.java)
        intent.putExtra("select",1)
        startActivityForResult(intent, REQ_CODE)

Не включайте onActivityResult в свою деятельность, также включайте ее только в свой фрагмент (CF1)

        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        when (requestCode) {
            REQ_CODE -> when (resultCode) {
                RESULT_OK -> {
                    //do your work here
                }
              }
            }
        }

Это отлично работает в моем проекте.

И не забудьте позвонить setResult(Activity.RESULT_OK) в вашей Активности (B)

0 голосов
/ 29 июня 2018

Вы не вызываете функцию onActivityResult CF1.

Вызова super.onActivityResult достаточно для маршрутизации вызова от Действия к Фрагменту, но не для маршрутизации его во вложенный Фрагмент (как в этом случае).

Итак, вы должны сделать этот вызов явно:

Фрагмент F1:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(resultCode == RESULT_OK){
        cli_name = data!!.getStringExtra("clie_name")
        cli_id = data.getStringExtra("clie_id")
    }
    cf1?.onActivityResult(requestCode, resultCode, data)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...