片段和片段(或活动)之间的侦听器

时间:2018-09-21 19:50:52

标签: android android-fragments lambda interface kotlin

是否有更好的干净方法将侦听器放入Fragment中?

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知道实例化它的任何类。此外,我希望它可以是FragmentActivity

1 个答案:

答案 0 :(得分:2)

您可以创建一个实现监听器的baseActivity

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

然后扩展class YouFragmentActivity : BaseFragmentActivity

然后将确保每个片段托管活动都配备了容器,然后您可以将引用获取为BaseFragmentActivity

您可以将AppCompatActivity替换为BaseActivity的{​​{1}}