Android 谷歌地图片段不显示当前位置按钮
我有一个片段类,它包含一个Android 谷歌地图片段不显示当前位置按钮,android,google-maps,android-fragments,google-maps-android-api-2,Android,Google Maps,Android Fragments,Google Maps Android Api 2,我有一个片段类,它包含一个MapView 它工作正常,唯一的问题是它没有显示当前位置按钮,我将其设置为真: nMap = mapView.getMap(); nMap.setMyLocationEnabled(true); nMap.getUiSettings().setZoomControlsEnabled(true); 我在清单xml文件中添加权限: 但这并没有解决问题 mapView = (MapView) rootView.findViewById(R.id.map); mapV
MapView
它工作正常,唯一的问题是它没有显示当前位置按钮,我将其设置为真:
nMap = mapView.getMap();
nMap.setMyLocationEnabled(true);
nMap.getUiSettings().setZoomControlsEnabled(true);
我在清单xml文件中添加权限:
但这并没有解决问题
mapView = (MapView) rootView.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
if (mapView != null) {
nMap = mapView.getMap();
nMap.setMyLocationEnabled(true);
nMap.getUiSettings().setZoomControlsEnabled(true);
mClusterManager = new ClusterManager<>(this.getActivity(), nMap);
nMap.setOnCameraChangeListener(mClusterManager);
nMap.setOnMarkerClickListener(mClusterManager);
}
mapView=(mapView)rootView.findviewbyd(R.id.map);
onCreate(savedInstanceState);
如果(mapView!=null){
nMap=mapView.getMap();
nMap.setMyLocationEnabled(true);
nMap.getUiSettings().setZoomControlsEnabled(true);
mClusterManager=newclustermanager(this.getActivity(),nMap);
nMap.SetonCamerachenglistener(McClusterManager);
nMap.setOnMarkerClickListener(mClusterManager);
}
更新1:
这很奇怪,我实现了以下代码:
public class MainFragment extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener {
//Define Variables that necessary for app
CameraUpdate update;
JSONArray array;
ClusterManager<ItemCluster> mClusterManager;
View rootView;
ItemCluster offsetItem;
MapView mapView;
GoogleMap nMap;
GoogleApiClient mLocationClient;
/*
the Constructor of Main Fragment that get the JSON array as input from AsyncTask
which download the JSON file from Meteoapps website
*/
@SuppressLint("ValidFragment")
public MainFragment(JSONArray input) {
array = input;
}
//----Default constructor
public MainFragment() {
}
// Create the view when the fragment initialized
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
mapView = (MapView) rootView.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
return rootView;
}
@Override
public void onMapReady(GoogleMap googleMap) {
if (mapView != null) {
nMap = googleMap;
nMap.setMyLocationEnabled(true);
nMap.getUiSettings().setZoomControlsEnabled(true);
mClusterManager = new ClusterManager<>(this.getActivity(), nMap);
mClusterManager.setRenderer(new OwnIconRendered(getActivity().getApplicationContext(), nMap, mClusterManager));
nMap.setOnCameraChangeListener(mClusterManager);
nMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());
nMap.setOnMarkerClickListener(mClusterManager);
mLocationClient = new GoogleApiClient.Builder(getActivity())
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mLocationClient.connect();
Location currentlocation = LocationServices.FusedLocationApi
.getLastLocation(mLocationClient);
}
public类MainFragment扩展了mapreadycallback、GoogleAppClient.ConnectionCallbacks、GoogleAppClient.OnConnectionFailedListener上的片段实现{
//定义应用程序所需的变量
相机更新;
JSONArray阵列;
ClusterManager McClusterManager;
视图根视图;
项目集群offsetItem;
地图视图;
谷歌地图;
GoogleAppClient mLocationClient;
/*
从AsyncTask获取JSON数组作为输入的主片段的构造函数
从Meteoapps网站下载JSON文件
*/
@SuppressLint(“有效碎片”)
公共MainFragment(JSONArray输入){
数组=输入;
}
//----默认构造函数
公共MainFragment(){
}
//在片段初始化时创建视图
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
mapView=(mapView)rootView.findViewById(R.id.map);
onCreate(savedInstanceState);
getMapAsync(这个);
返回rootView;
}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
如果(地图视图!=null){
nMap=谷歌地图;
nMap.setMyLocationEnabled(true);
nMap.getUiSettings().setZoomControlsEnabled(true);
mClusterManager=newclustermanager(this.getActivity(),nMap);
setRenderer(新的OwnIconRendered(getActivity().getApplicationContext(),nMap,mClusterManager));
nMap.SetonCamerachenglistener(McClusterManager);
nMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());
nMap.setOnMarkerClickListener(mClusterManager);
mLocationClient=新的GoogleAppClient.Builder(getActivity())
.addApi(LocationServices.API)
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.build();
mLocationClient.connect();
Location currentlocation=LocationServices.FusedLocationApi
.getLastLocation(mLocationClient);
}
我知道getLastLocation可能会导致问题,但在这种情况下,这并不是因为我在另一个代码上尝试了该代码,并且它可以工作,然后当我尝试注销currentlocation.getLatitude()
时,我会遇到以下错误:
System.err:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“double android.location.location.getLatitude()”
,改用getMapAsync(this)
。另外,实现OnMapReadyCallback
,在onMapReady()
快乐编码!,改用getmapsync(this)
。另外,在onMapReady()方法上实现一个OnMapReadyCallback
,在那里设置映射配置。除此之外,我看不到如何配置映射的问题。希望这将有助于解决问题
愉快的编码!您能详细说明您所做的更改吗?@Sufian i是这样使用的:mapView=(mapView)rootView.findViewById(R.id.map);mapView.onCreate(savedInstanceState);if(mapView!=null){nMap=mapView.getMap();nMap.setMyLocationEnabled(true);nMap.getUiSettings().setZoomControlsEnabled(true);mClusterManager=new ClusterManager(this.getActivity(),nMap);nMap.setOnCameraChangeListener(mClusterManager);nMap.setOnMarkerClickListener(mClusterManager);}
如果OnMapReadyCallback
仅存在于API 24上,那么它将永远不会在API 23上调用。您测试的设备/模拟器上的Android版本是什么?@Sufian i更新了这个问题。您可以详细说明您所做的更改吗?@Sufian i使用的是这样的:mapView=(mapView)rootView.findViewById(R.id.map);mapView.onCreate(savedInstanceState);if(mapView!=null){nMap=mapView.getMap();nMap.setMyLocationEnabled(true);nMap.getUiSettings().setZoomControlsEnabled(true);McClusterManager=new ClusterManager(this.getActivity(),nMap);nMap.SetOnCamerachengeListener(mClusterManager);nMap.setOnMarkerClickListener(mClusterManager);}
如果apreReadyCallback上的OnMapReadyCallback
仅存在于API 24上,那么它将永远不会在API 23上调用。您测试的设备/仿真器上的Android版本是什么?@Sufian i更新了问题。嗨,我试过了,也没有发生任何事情。真的很奇怪,我尝试了另一个演示应用程序,它成功了,但不同的是,他什么都做了MainActivity不在一个片段中,所以我无法知道我的代码出了什么问题。我尝试过,也没有发生什么事情。真奇怪,我尝试了另一个演示应用程序,它成功了,但不同的是,他在MainActivity中做的一切都不在片段中,所以我无法知道我的代码出了什么问题
public class MainFragment extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener {
//Define Variables that necessary for app
CameraUpdate update;
JSONArray array;
ClusterManager<ItemCluster> mClusterManager;
View rootView;
ItemCluster offsetItem;
MapView mapView;
GoogleMap nMap;
GoogleApiClient mLocationClient;
/*
the Constructor of Main Fragment that get the JSON array as input from AsyncTask
which download the JSON file from Meteoapps website
*/
@SuppressLint("ValidFragment")
public MainFragment(JSONArray input) {
array = input;
}
//----Default constructor
public MainFragment() {
}
// Create the view when the fragment initialized
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
mapView = (MapView) rootView.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
return rootView;
}
@Override
public void onMapReady(GoogleMap googleMap) {
if (mapView != null) {
nMap = googleMap;
nMap.setMyLocationEnabled(true);
nMap.getUiSettings().setZoomControlsEnabled(true);
mClusterManager = new ClusterManager<>(this.getActivity(), nMap);
mClusterManager.setRenderer(new OwnIconRendered(getActivity().getApplicationContext(), nMap, mClusterManager));
nMap.setOnCameraChangeListener(mClusterManager);
nMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());
nMap.setOnMarkerClickListener(mClusterManager);
mLocationClient = new GoogleApiClient.Builder(getActivity())
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mLocationClient.connect();
Location currentlocation = LocationServices.FusedLocationApi
.getLastLocation(mLocationClient);
}