Слушатель между фрагментом и фрагментом (или действием) - PullRequest
0 голосов
/ 21 сентября 2018

Есть ли лучший чистый способ поместить слушателя во фрагмент?

class FooFragment : Fragment() {

    companion object {
        private lateinit var listener: (Int) -> Unit

        fun newInstance(listener: (Int) -> Unit): FooFragment {
            Companion.listener = listener
            return FooFragment()
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_foo, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        btn.setOnClickListener {
            listener(1234)
        }
    }
}

Звонок такой аккуратный ...

FooFragment.newInstance {
    // Do something
}

Я знаю, у этого кода проблемы из-завозможно, я потеряю слушателя при воссоздании Fragment и использовании стандартного способа onAttach(context: Context?).

Но я хочу создать новый экземпляр FooFragment из других Fragment(не Activity).Я мог бы использовать что-то вроде этого:

private var listener: Listener? = null

interface Listener {
    fun onFooClicked()
}

override fun onAttach(context: Context?) {
    super.onAttach(context)
    // listener = context as Listener
    fragmentManager?.findFragmentById(R.id.fFooParent) as Listener
}

Но этот кусок кода внутри onAttach(context: Context?) метода внутри FooFragment будет контрпродуктивным, потому что я не хочу, чтобы FooFragment знал что-либо о классекто его провоцируетБолее того, мне бы хотелось, чтобы это был Fragment или Activity.

1 Ответ

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

Вы можете создать baseActivity, который реализует прослушиватель

class BaseFragmentActivity:AppCompatActivity(), FooFragment.Listener{}

, затем расширить class YouFragmentActivity : BaseFragmentActivity

, тогда он удостоверится, что каждый фрагмент хостинга снабжен контейнером, после чего вы можете получитьссылка как BaseFragmentActivity

Вы можете заменить AppCompatActivity на BaseActivity, где BaseActivity :AppCompatActivity

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...