【问题标题】:How to add map in tab layout with viewpager?如何使用 viewpager 在选项卡布局中添加地图?
【发布时间】:2018-03-22 11:47:10
【问题描述】:

MapFragment Image

我想用 viewpager 在选项卡布局中显示地图视图。正如您在图片上方看到的那样。我得到了我的纬度和经度,但它没有在我的位置上显示我的地图和标记。 这是我的这个片段类的代码

public class MapFragment extends Fragment implements OnMapReadyCallback,        
GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    com.google.android.gms.location.LocationListener {


private GoogleMap mMap;
private MapView mapView;

private static final int MY_PERMISSION_REQUEST_CODE = 0;
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 1;

private LocationRequest mlocationRequest;
private GoogleApiClient mgoogleApiClient;
private Location mlastlocation;

private static int UPDATE_INTERVAL = 1000;
private static int FASTEST_INTERVAL = 3000;
private static int DISPLACEMENT = 10;

DatabaseReference ref;
GeoFire geofire;
Marker myCurrentMarker;

public MapFragment() {
    // Required empty public constructor
}

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

    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_map, container, false);

    mapView = (MapView) view.findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);
    ref = FirebaseDatabase.getInstance().getReference("MyLocation");
    geofire = new GeoFire(ref);

    setUpLocation();

    return view;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == 
PackageManager.PERMISSION_GRANTED) {
                if (checkPlaySercives()) {
                    buildGoogleApiClient();
                    creatLocationRequest();
                    displayLocation();
                }
            }
            break;
    }
}

private void setUpLocation() {
    if (ActivityCompat.checkSelfPermission(getActivity(), 
android.Manifest.permission.ACCESS_COARSE_LOCATION) != 
PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getActivity(), 
android.Manifest.permission.ACCESS_FINE_LOCATION) != 
PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(), new String[]{
                android.Manifest.permission.ACCESS_COARSE_LOCATION,
                android.Manifest.permission.ACCESS_FINE_LOCATION
        }, MY_PERMISSION_REQUEST_CODE);
    } else {
        if (checkPlaySercives()) {
            buildGoogleApiClient();
            creatLocationRequest();
            displayLocation();
        }
    }
}

private void displayLocation() {
    if (ActivityCompat.checkSelfPermission(getActivity(), 
android.Manifest.permission.ACCESS_COARSE_LOCATION) != 
PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getActivity(), 
android.Manifest.permission.ACCESS_FINE_LOCATION) != 
PackageManager.PERMISSION_GRANTED) {
        return;
    }
    mlastlocation = 
LocationServices.FusedLocationApi.getLastLocation(mgoogleApiClient);
    if (mlastlocation != null) {
        final double latitude = mlastlocation.getLatitude();
        final double longitute = mlastlocation.getLongitude();

        final LatLng latLng = new LatLng(latitude, longitute);
        geofire.setLocation("You", new GeoLocation(latitude, longitute),
                new GeoFire.CompletionListener() {
                    @Override
                    public void onComplete(String key, DatabaseError error) 
{

                        if (myCurrentMarker != null)
                            myCurrentMarker.remove();

//                            mMap.addMarker(new 
MarkerOptions().position(latLng).title("Your location"));
//                            
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

                        getLatitude(latitude);
                        getLongitude(getLongitude(longitute));


                        Toast.makeText(getActivity(), latitude + " " 
+longitute, Toast.LENGTH_SHORT).show();
                    }
                });

    }

}

public static double getLatitude(double lat) {
    return lat;
}

public static double getLongitude(double lng) {
    return lng;
}

private void creatLocationRequest() {
    mlocationRequest = new LocationRequest();
    mlocationRequest.setInterval(UPDATE_INTERVAL);
    mlocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mlocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mlocationRequest.setSmallestDisplacement(DISPLACEMENT);
}

private void buildGoogleApiClient() {
    mgoogleApiClient = new GoogleApiClient.Builder(getActivity())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    mgoogleApiClient.connect();
}

private boolean checkPlaySercives() {
    int resultCode = 
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity());
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode))
            GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(), 
PLAY_SERVICES_RESOLUTION_REQUEST).show();
        else {
            Toast.makeText(getActivity(), "This device is not supported", 
Toast.LENGTH_LONG).show();
        }
        return false;
    }
    return true;
}

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

@Override
public void onLocationChanged(Location location) {
    mlastlocation = location;
    displayLocation();

}

//    @Override
//    public void onStatusChanged(String provider, int status, Bundle 
extras) {
//
//    }
//
//    @Override
//    public void onProviderEnabled(String provider) {
//
//    }
//
//    @Override
//    public void onProviderDisabled(String provider) {
//
//    }

@Override
public void onConnected(@Nullable Bundle bundle) {
    displayLocation();
    startLocationUpdates();
}

private void startLocationUpdates() {
    if (ActivityCompat.checkSelfPermission(getActivity(), 
android.Manifest.permission.ACCESS_COARSE_LOCATION) != 
PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getActivity(), 
android.Manifest.permission.ACCESS_FINE_LOCATION) != 
PackageManager.PERMISSION_GRANTED) {
        return;
    }

LocationServices.FusedLocationApi.requestLocationUpdates(mgoogleApiClient, 
mlocationRequest, this);
}

@Override
public void onConnectionSuspended(int i) {
    mgoogleApiClient.connect();
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

//    @Override
//    public void onResume() {
//        mapView.onResume();
//        super.onResume();
//    }

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}
}

这段代码在活动上运行得很好,但在选项卡布局视图页面中出现问题。

提前谢谢你!

【问题讨论】:

  • 您在 logcat 中是否遇到任何错误?您确定您使用的是正确的 API 密钥吗?
  • 是的。在使用标签布局之前,我在活动上做同样的工作然后它正在工作。
  • 我在我的代码中注释了这两行 mMap.addMarker(new MarkerOptions().position(latLng).title("Your location")); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));因为那时我得到了这个例外。尝试在一个空对象引用
  • @Liya 我已经获得了当前我想要的是标签布局内的当前用户位置。请查看我附在这篇文章顶部的 png 链接。

标签: android google-maps android-viewpager android-mapview android-tablayout


【解决方案1】:

XML 中的地图视图

<com.google.android.gms.maps.MapView
            android:id="@+id/my_test_map"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

Java 代码:

private MapView mMapView;
private GoogleMap mGoogleMap;
...
...

private void setUpMapIfNeeded() {

    if (mGoogleMap == null) {
        mMapView = (MapView) findViewById(R.id.my_test_map);
        mMapView.onCreate(getArguments());
        mMapView.onResume();

        try {
            MapsInitializer.initialize(getActivity());
            final GoogleMap.OnMarkerClickListener markerClickListener = this;
            mMapView.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap gmap) {
                    mGoogleMap = gmap;
                    mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                    //fill markers
                    //add marker listener 

                }
            });



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

    }
}

我的一个项目中的这个示例代码与片段中的 viewpager 配合得很好。

当我查看您的代码时,有一行您忘记调用了。

mMapView.onResume();

在您的 ma​​pView.onCreate(savedInstanceState);

下添加这一行

【讨论】:

  • 但不是现在我收到此错误。 java.lang.NullPointerException:尝试调用虚拟方法 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model .MarkerOptions)' 在 com.example.daniyal.socialmap.MapFragment$1.onComplete(MapFragment.java:141) 处的空对象引用上
  • 您必须在“OnMapReady”方法中添加标记。请查看我的示例代码。我被评论了两行信息。 //填充标记和//添加标记侦听器。为了让有困难的人更容易找到答案,您能否将答案标记为“答案”(绿色厚);)
  • 它只是给我看地图。甚至它没有显示来自 onMapReady() 的吐司。它从 displayLocation() 显示纬度和经度。
  • 当你对 UI 元素做一些事情时,你必须使用主线程。显示、关闭、动画等。您是否在 UI 线程上进行 UI 事务。如果你想在 onMapReady 方法中显示 toast 你将使用这个 runOnUiThread(new Runnable() { @Override public void run() { //SHOW Toast } });
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多