调用SupportMapFragment报has not been attached yet错误如何解决
问题原因
- 你手动创建了一个全新的
SupportMapFragment实例,这个实例既没有和布局中声明的地图Fragment绑定,也没有被添加到FragmentManager完成attach流程,直接调用getMapAsync自然会抛出未attach的异常。 - 查找布局中地图Fragment的调用对象错误,你需要通过当前自定义MapFragment的
childFragmentManager来查找布局里的SupportMapFragment,而非你手动创建的空实例的childFragmentManager。
修正后的代码
class MapFragment : Fragment(), OnMapReadyCallback { private lateinit var googleMap: GoogleMap override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val view = inflater.inflate(R.layout.fragment_map, container, false) // 从当前Fragment的childFragmentManager中获取布局声明的SupportMapFragment val supportMapFragment = childFragmentManager.findFragmentById(R.id.google_map) as SupportMapFragment supportMapFragment.getMapAsync(this) return view } override fun onMapReady(map: GoogleMap) { googleMap = map // 此处添加地图初始化后的业务逻辑 } }
注意事项
- 嵌套Fragment场景必须使用父Fragment的
childFragmentManager查找子Fragment,不能使用宿主Activity的supportFragmentManager,否则也会出现找不到Fragment的异常。 - 如果需要避免类型强转风险,可以配合ViewBinding获取
FragmentContainerView实例后再获取关联的Fragment。
内容的提问来源于stack exchange,提问作者tonileipo
相关产品推荐
相关产品推荐

