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);

    }