Общаясь с фрагментом, когда он становится вершиной бэкстека? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть два фрагмента: FragmentA и FragmentB. Я запускаю FragmentA с моего ActivityMain, затем запускаю FragmentB, не выдвигая FragmentA из backstack (я хочу отобразить FragmentA на фоне FragmentB). В конце концов я закончил с FragmentB и извлек его из backstack, но мне нужно сообщить фрагменту A, что FragmentB больше не используется.

Как мне сообщить FragmentA, что FragmentB был закрыт и что FragmentA теперь является вершиной бэкстека?

Я пытался установить точки останова во многих классах Fragment, таких как OnResume (), OnAttach, OnStart (), но ничего не получилось.

1 Ответ

0 голосов
/ 13 сентября 2018

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

Необязательная цель для этого фрагмента.Это может быть использовано, например, если этот фрагмент запускается другим, и когда он закончится, хочет вернуть результат первому.Установленная здесь цель сохраняется для всех экземпляров через.

Вернемся к вашему случаю, когда старт FragmentB из FragmentA.

class FragmentA : Fragment() {

    companion object {
        val REQUEST_CODE_FRAGMENT_A = 1
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
        val view = inflater?.inflate(R.layout.fragment_a, container, false)!!

        val fragmentB = FragmentB().apply {
            setTargetFragment(this@FragmentA, REQUEST_CODE_FRAGMENT_A)
        }
        fragmentManager.beginTransaction()
                .add(R.id.container, fragmentB, "fragB")
                .addToBackStack(null)
                .commit()

        return view
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE_FRAGMENT_A) {
            if (resultCode == Activity.RESULT_OK) {
                val message = data?.getStringExtra("message")
                Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
            }
        }
    }
}

Когда FragmentB выскочил изbackstack, метод onDestroy будет вызван.

class FragmentB : Fragment() {

    override fun onDestroy() {
        // Notify for FragmentA (as target fragment) that FragmentB destroyed.
        val intent = Intent().apply { putExtra("message", "I'm out.") }
        targetFragment.onActivityResult(targetRequestCode, Activity.RESULT_OK, intent)
        super.onDestroy()
    }
}
...