2017-02-16 75 views
0

我想获取用户在地图中的当前位置我无法在mapAsync函数中将“this”作为参数传递 我在getMapAsync(this)中收到错误。它告诉不兼容的类型。无法解析片段中的getMapAsync

需要com.google.android.gms.map.GoogleMap

发现void how can I solve this issue ?

我也试过getActivity.getApplicationContext(),但它也没有工作! 我在这里提供的代码,请检查一下

public class MapsActivity extends Fragment implements 
    OnMapReadyCallback, 
    View.OnClickListener , 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    LocationListener { 

private GoogleMap map; 
private MapView mapView; 
private boolean mapsSupported = true; 
private GoogleApiClient mGoogleApiClient; 
MapFragment mapFragment; 
@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    MapsInitializer.initialize(getActivity()); 

    if (mapView != null) { 
     mapView.onCreate(savedInstanceState); 
    } 
    initializeMap(); 
} 
private void initializeMap() { 
    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    //mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); 
    if (map == null) { 
     **map = mapFragment.getMapAsync(this);** 
    } 
    // Enable Zoom 
    map.getUiSettings().setZoomGesturesEnabled(true); 
    //set Map TYPE 
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    //enable Current location Button 
    map.setMyLocationEnabled(true); 
    LocationManager locationManager = (LocationManager)getActivity().getSystemService(getActivity().LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String bestProvider = locationManager.getBestProvider(criteria, true); 
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    Location location = locationManager.getLastKnownLocation(bestProvider); 
    if (location != null) { 
     onLocationChanged(location); 
    } 
    locationManager.requestLocationUpdates(bestProvider, 2000, 0, this); 
} 

Maps.xml

<fragment 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" 
android:id="@+id/map" 
tools:context=".MapsActivity" 
android:name="com.google.android.gms.maps.SupportMapFragment" 
tools:layout="@layout/abc_action_menu_layout"/> 

<Button 

    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Nearby Resturants" 
    android:id="@+id/btn_rest" 
    android:layout_gravity="bottom" /> 


    </RelativeLayout> 
+0

你可以使用** getMapAsync(getActivity()); ** – pulkit

+0

@pulkit不起作用 – SFAH

+0

为使'getMapAsync()'工作,'R.id.map'必须是'MapFragment'元素。但它是一个正常的片段 – ShahiM

回答

0

试试这个代码

try { 
     if (map == null) { 
      ((MapView) getView().findViewById(R.id.map)).getMapAsync(this); 

     } 
    }catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 

希望这有助于!

+0

谢谢它的工作! :D @泰米德拉赫曼 – SFAH

+0

很高兴知道!请将其标记为已接受(答案左侧的勾号标记),以便将来可以帮助其他开发人员。 –

2

调用内部FragmentonCreateView()

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View viewOBJ= inflater.inflate(R.layout.xxx, null, false); 

    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
    return viewOBJ; 
} 

代码欲了解更多信息,请阅读getMapAsync() in Fragment

+0

我试过但不工作:/ – SFAH

0

你缺少的是getMapAsync是一个异步功能。这意味着它不会立即返回地图对象。所以你不能只写map = mapFragment.getMapAsync();

相反,你必须这样做:

private void initializeMap() { 
    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager() 
     .findFragmentById(R.id.map); 
    if (map == null) { 
    mapFragment.getMapAsync(this); 
    } 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    map = googleMap; 

    // Enable Zoom 
    map.getUiSettings().setZoomGesturesEnabled(true); 
    //set Map TYPE 
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    //enable Current location Button 
    map.setMyLocationEnabled(true); 

    //... rest of your map related code. 
} 

这里,onMapReady时调用地图对象的可用的,所以你的初始化代码的其余部分将去那里。您还必须实施OnMapReadyCallback,但我知道您已经完成了这项工作。