android - Fragment 与 Fragment(或 Activity)之间的监听器

标签 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?)方式。

但我想从其他 Fragment(不是 Activity)创建一个新的 FooFragment 实例。我可以使用这样的东西:

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
}

但是 FooFragmentonAttach(context: Context?) 方法中的这段代码会适得其反,因为我不希望 FooFragment 知道任何事情实例化它的类。此外,我希望它可以是 FragmentActivity

最佳答案

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

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

然后扩展 class YouFragmentActivity : BaseFragmentActivity

然后它将确保每个 fragment 托管 Activity 都配备了容器,然后您可以获得作为 BaseFragmentActivity

的引用

您可以将 AppCompatActivity 替换为 BaseActivity,其中 BaseActivity :AppCompatActivity

关于android - Fragment 与 Fragment(或 Activity)之间的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450281/

相关文章:

android - Xamarin.Auth 收到 disallowed_useragent 错误 [Xamarin.Forms]

android - 如何以编程方式在 fragment 中提供后退按钮?

java - 如何将图像从一个 fragment 发送到另一个 fragment ?

c++ - C++ 循环的编译时评估

c++ - 在非类型模板参数中计算 constexpr lambda

android - FloatingActionButton 展开成一个新的 Activity

android - Hello World Android IntentService - IntentService 的 enqueueWork() 函数不接受参数 MyIntentService.class

android - Kotlin 多平台库接口(interface)的暴露类型未解析

android - Viewpager2 带有 fragment 和 Jetpack 导航 : Restore fragments instead of recreating them

java - Android N Stream API 是否向后移植到较低版本?