如何引用在Android Fragment中创建的map



我遵循以下指南:https://developers.google.com/codelabs/maps platform/maps android平台- 101 # 9

和我试图得到一个片段的地图。我的地图已经成功运行了,但现在当地图打开时,它默认显示的是非洲的高级视图。我想让地图默认打开我的城市在一个更本地的水平。

这个片段的xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ViewNearbyFragment">
<androidx.fragment.app.FragmentContainerView
xmlns:map="http://schemas.android.com/apk/res-auto"
class="com.google.android.gms.maps.SupportMapFragment"
map:mapId="{my_map_id}"
android:id="@+id/map_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>

与相同片段对应的Kotlin文件看起来像:

class ViewNearbyFragment : Fragment() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(fragmentManager?.findFragmentById(
R.id.map_fragment
) as? SupportMapFragment)?.getMapAsync { googleMap ->

// Ensure all places are visible in the map.
googleMap.setOnMapLoadedCallback {
val bounds = LatLngBounds.builder()
bounds.include(LatLng(0.0, 0.0))
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), 20))
}
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_view_nearby, container, false)
}
}

我从来没有进入过getMapAsync调用之后的块,我不知道为什么。如何访问在xml文件中创建的映射?或者更好的是,如何更改与此映射关联的默认值?

你的代码有两个问题:

根据片段生命周期指南,
  1. onCreate()onCreateView之前运行。这意味着当您的onCreate代码运行时,您的FragmentContainerView尚未膨胀(并且您的SupportFragmentFragment尚未创建)。您想要在onCreateView之后运行的代码应该移动到onViewCreated()

  2. 你正在使用错误的FragmentManager -已弃用的fragmentManagerFragmentManager,片段被附加到(这就是为什么它被弃用为更具描述性的parentFragmentManager名称)。你创建的片段是一个"子片段"(根据FragmentManager指南),所以你需要使用childFragmentManager

你的固定代码看起来像:

class ViewNearbyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_view_nearby, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
(childFragmentManager.findFragmentById(
R.id.map_fragment
) as? SupportMapFragment)?.getMapAsync { googleMap ->

// Ensure all places are visible in the map.
googleMap.setOnMapLoadedCallback {
val bounds = LatLngBounds.builder()
bounds.include(LatLng(0.0, 0.0))
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), 20))
}
}
}
}

最新更新