it-swarm.com.ru

Как добавить наложение в Google Maps API v2 | Android |

Недавно я начал работать с Google Maps API v2 на Android и наткнулся на еще одно препятствие. Я не могу понять, как добавить наложение, такое как в API v1, для отображения маркера в определенных местах, используя lat и long. Я также хочу, чтобы это началось в том же городе, используя long и lat. До сих пор я добавил некоторый код для начальной позиции карты, НО это не сработало. Я думаю, что я должен написать все это на Java вместо XML-макета, но я не знаю, как обратиться к SupportMapFragment, чтобы что-то сделать.

Это основное занятие, я использую SUPPORTMAPFRAGMENT вместо MapFragment и предпочитаю не переключаться.

package com.example.maps;

import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;
import com.google.Android.gms.maps.SupportMapFragment;

public class Main extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SupportMapFragment fragment = new SupportMapFragment();
    getSupportFragmentManager().beginTransaction()
            .add(Android.R.id.content, fragment).commit();
    }
}

Это XML

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:map="http://schemas.Android.com/apk/res-auto"
  Android:id="@+id/map"
   Android:name="com.google.Android.gms.maps.SupportMapFragment"
   Android:layout_width="wrap_content"
   Android:layout_height="match_parent"
   map:cameraBearing="112.5"
   map:cameraTargetLat="-33.796923"
   map:cameraTargetLng="150.922433"
   map:cameraTilt="30"
   map:cameraZoom="13"
   map:mapType="normal"
   map:uiCompass="false"
   map:uiRotateGestures="true"
   map:uiScrollGestures="false"
   map:uiTiltGestures="true"
   map:uiZoomControls="false"
   map:uiZoomGestures="true" />

Правка

Новый Java-код (я исключил импорт и пакет, но все они есть.)

public class Main extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SupportMapFragment fragment = new SupportMapFragment();
    getSupportFragmentManager().beginTransaction()
            .add(Android.R.id.content, fragment).commit();

    GoogleMap googleMap;
    googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
    LatLng latLng = new LatLng(-33.796923, 150.922433);
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.addMarker(new MarkerOptions()
            .position(latLng)
            .title("My Spot")
            .snippet("This is my spot!")
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
    googleMap.getUiSettings().setCompassEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));
}

}

Новые ошибки 

01-02 01:16:53.333: D/AndroidRuntime(916): Shutting down VM
01-02 01:16:53.333: W/dalvikvm(916): threadid=1: thread exiting with uncaught    exception (group=0x40a70930)
01-02 01:16:53.363: E/AndroidRuntime(916): FATAL EXCEPTION: main
01-02 01:16:53.363: E/AndroidRuntime(916): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maps/com.example.maps.Main}: Java.lang.NullPointerException
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2180)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2230)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1234)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.os.Handler.dispatchMessage(Handler.Java:99)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.os.Looper.loop(Looper.Java:137)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.ActivityThread.main(ActivityThread.Java:5039)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Java.lang.reflect.Method.invokeNative(Native Method)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Java.lang.reflect.Method.invoke(Method.Java:511)
01-02 01:16:53.363: E/AndroidRuntime(916):  at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
01-02 01:16:53.363: E/AndroidRuntime(916):  at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
01-02 01:16:53.363: E/AndroidRuntime(916):  at dalvik.system.NativeStart.main(Native Method)
01-02 01:16:53.363: E/AndroidRuntime(916): Caused by: Java.lang.NullPointerException
01-02 01:16:53.363: E/AndroidRuntime(916):  at com.example.maps.Main.onCreate(Main.Java:19)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.Activity.performCreate(Activity.Java:5104)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1080)
01-02 01:16:53.363: E/AndroidRuntime(916):  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2144)
01-02 01:16:53.363: E/AndroidRuntime(916):  ... 11 more
9
Malaka

Вы можете добавить маркер в onCreate вашего FragmentActivity.

        GoogleMap googleMap;
        googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
        LatLng latLng = new LatLng(-33.796923, 150.922433);
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.addMarker(new MarkerOptions()
                .position(latLng)
                .title("My Spot")
                .snippet("This is my spot!")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
        googleMap.getUiSettings().setCompassEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));

Комплексное решение будет выглядеть так для макета ...

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:id="@+id/map"
          Android:name="com.google.Android.gms.maps.SupportMapFragment"
          Android:layout_width="match_parent"
          Android:layout_height="match_parent" />

... Деятельность, как это ...

public class NameOfYourActivity extends FragmentActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.nameOfYourLayout);

    GoogleMap googleMap;
    googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
    LatLng latLng = new LatLng(-33.796923, 150.922433);
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.addMarker(new MarkerOptions()
            .position(latLng)
            .title("My Spot")
            .snippet("This is my spot!")
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
    googleMap.getUiSettings().setCompassEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));
}
8
Aaron McIver

https://developers.google.com/maps/documentation/Android-api/groundoverlay

LatLng NEWARK = new LatLng(40.714086, -74.228697);

GroundOverlayOptions newarkMap = new GroundOverlayOptions()
        .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
        .position(NEWARK, 8600f, 6500f);
map.addGroundOverlay(newarkMap);
1
DoruChidean

Не уверен, что вам все еще нужна помощь, но вот что сработало для меня. 

Поскольку вы загружаете фрагмент в контейнер, для загрузки компонентов фрагмента в память требуется время, и, следовательно, карта имеет нулевое значение. Чтобы исправить это, я беру и заполняю карту в методе onAttachedToWindow () своей деятельности, в то же время создавая и добавляя фрагмент в контейнер в методе onCreate. Это дает время загрузки фрагмента, так как это событие срабатывает, когда окно загружено.

SupportMapFragment mMapFragment;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    // Try to obtain the map from the SupportMapFragment.
    mMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentByTag(MAP_FRAG_NAME);

    // Not found so make a new instance and add it to the transaction for swapping
    if (mMapFragment == null) {
        mMapFragment = SupportMapFragment.newInstance();
        ft.add(R.id.fragment_container, mMapFragment, MAP_FRAG_NAME);
    }

    ft.commit();
}

@Override
    public void onAttachedToWindow() {
        // Load the map here such that the fragment has a chance to completely load or else the GoogleMap value may be null
        GoogleMap googleMap;
googleMap = (mMapFragment).getMap();
LatLng latLng = new LatLng(-33.796923, 150.922433);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title("My Spot")
        .snippet("This is my spot!")
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
googleMap.getUiSettings().setCompassEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));

        super.onAttachedToWindow();
    }

надеюсь это поможет.

С уважением, DMan

1
DMCApps