获取Googe Map Fragment时遇到问题,请调用onMapReady



所以我遇到的问题是我不确定如何访问地图来设置初始位置。片段总是返回 NULL,因此它似乎不会调用 getMapReady 函数。我只是不确定如何在布局中正确引用地图小部件,以便它将正确调用地图的设置。

布局

<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="com.example.user.thisweekintown.CalendarFragment">

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/mySwipe"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/bus_list_recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="horizontal" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<fragment
android:id="@+id/businessslocation"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="15dp"
android:background="@color/cardview_light_background"/>
</FrameLayout>

守则

class BusListFragment : Fragment(),OnMapReadyCallback {
lateinit var mMap: GoogleMap
var mapView: SupportMapFragment? = null
var totaladd:String? = null
.........

然后

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view : View = inflater.inflate(R.layout.fragment_bus_list,container,false)
var social_recycle: RecyclerView = view.findViewById(R.id.bus_list_recycle)
Log.d("should be calling", "onMapReady")
swipey = view.findViewById(R.id.mySwipe)
swipey.setColorSchemeColors(Color.RED, Color.BLUE, Color.GREEN, Color.CYAN);
swipey.setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener { setupRecycle(true) })
calFrPrefs = context?.getSharedPreferences("main_prefs",0)
(activity as MainActivity).getSupportActionBar()?.setTitle(calFrPrefs!!.getString("current_town_name","No Town")+ " Businesses")
setupRecycle(false)
return view
}

然后

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mapView = childFragmentManager.findFragmentById(R.id.businessslocation) as? SupportMapFragment
Log.d("isMapView", mapView.toString())
mapView?.getMapAsync(this)
}

它应该调用以下内容

override fun onMapReady(googleMap: GoogleMap){
mMap = googleMap
Log.d("onMapready", "MapReady")
val cphbusiness = LatLng(42.187, 71.3065)
mMap.addMarker(MarkerOptions().position(cphbusiness).title("Her"))
mMap.moveCamera(CameraUpdateFactory.zoomTo(16.0F))
mMap.moveCamera(CameraUpdateFactory.newLatLng(cphbusiness))
val geocoder = Geocoder(context)
if (geocoder is Geocoder) {
var list: List<Address> = geocoder.getFromLocationName(totaladd, 1)
if(list.size >0) {
var mAddress: Address = list.get(0)
Log.d("latitiude", mAddress.latitude.toString())
Log.d("latitiude", mAddress.longitude.toString())
var address1 = LatLng(mAddress.latitude, mAddress.longitude)
changeMap(address1)
}else
{
Toast.makeText(context, "Unable to find Valid Location...Centering on Random place", Toast.LENGTH_LONG).show()
changeMap(cphbusiness)
}
} else {
}
}

fun changeMap(myLL: LatLng) {
mMap.moveCamera(CameraUpdateFactory.newLatLng(myLL))
mMap.addMarker(MarkerOptions().position(myLL))
}

最后,我通过将片段名称从android:name="com.google.android.gms.maps.MapFragment"更改为android:name="com.google.android.gms.maps.SupportMapFragment"来解决此问题

通过活动片段管理器访问片段:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Fragments added to XML via <fragment> tag get added to the ACTIVITY fragment manager
// so access the fragment through that instead.
mapView = activity.supportFragmentManager.findFragmentById(R.id.businessslocation) as? SupportMapFragment
Log.d("isMapView", mapView.toString())
mapView?.getMapAsync(this)
}

或者根据文档通过代码添加MapFragment。

希望对您有所帮助!

最新更新