android fragment 中调用父级 activity 中定义的方法

更新日期: 2022-10-31 阅读次数: 332 字数: 355 分类: Android

需求场景

一个 list / detail 的小 android app,分为两个 fragment 置于一个 activity 中。

list fragment 底部一个按钮,点击需要调用 activity 中的一个方法。

解决方法

(activity as YourActivityClassName).methodName()

实际上这个问题可以简化为,如何在 fragment 中获取其父级 activity。

由于 fragment 必然寄生于一个宿主 activity,所以可以直接通过 getActivity() 方法来得到宿主 activity,而 Kotlin 中则可以简写为 activity。

更严谨一点

但是如果这个 fragment 会被多个 activity 复用,这个做法就不够严谨。可以通过类型检测的方式规避:

java 示例:

Activity act = getActivity(); 
if (act instanceof YourActivityClassName) (
	(YourActivityClassName) act).yourPublicMethod(); 
} 

参考:

https://stackoverflow.com/questions/12659747/call-an-activity-method-from-a-fragment

至于里面提到的更严谨的 interface 的做法,我觉得太抽象了,意义不大。eventbus 也杀鸡用牛刀了。

getActivity() 可以简写为 activity

例如:Toast.makeText 在 activity 中调用的时候,第一个参数为 this。

在 fragment 中调用的时候,第一个参数可以写为 getActivity(); 但在 kotlin 中还可以简写为 activity。看看 getActivity 的函数声明就明确了。

public final androidx.fragment.app.FragmentActivity getActivity()

示例代码:

val btnScan = view.findViewById<Button>(R.id.btnScan)
btnScan.setOnClickListener {
    Toast.makeText(
        activity, "button clicked",
        Toast.LENGTH_SHORT
    ).show()
}

注意

要调用父级 activity 中的方法,必须声明其类型,否则编译时会报错,提示找不到其方法。

(activity as YourActivityClassName).methodName()

爱评论不评论