Пользовательский MapFragment API Google Maps v2 + SimpleFragment

Мне нужно создать простое приложение, содержащее 1. Пользовательский MapFragment, который может отображать текущее местоположение (LocationListener?), два маркера и т. д. 2. Простые пустые фрагменты.

Приложение не должно использовать поддержку v4 (sdk 11+)/FragmentActivity.

Пустой фрагмент.

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black" >
</RelativeLayout>

Сорт:

public class FirstFragment extends Fragment{

public FirstFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.first_fragment, container, false);
    return view;
}
}

Фрагмент карты (попробуйте сделать его синглтоном).

XML:

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

Сорт

public class ThirdMapFragment extends MapFragment {
public static MapFragment instance;

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
    View view;
    view = arg0.inflate(R.layout.map_fragment, arg1, false);
    return view;
}

public static MapFragment getInstance() {
    if (instance == null) {
        instance = newInstance();
    }
    // NullPointerException in getMap() ???
    // instance.getMap().addMarker(new MarkerOptions().position(new LatLng(41.1, 39)));
    return instance;
}

@Override
public void onCreate(Bundle arg0) {
    super.onCreate(arg0);
}
}

Основная деятельность:

public class ActivityMain extends Activity implements OnClickListener {
FragmentManager fragmentManager;
FragmentTransaction transaction;
FirstFragment firstFragment;
MapFragment mapFragment;

// Buttons
Button b4;

int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    fragmentManager = getFragmentManager();
    transaction = fragmentManager.beginTransaction();

    b4 = (Button) findViewById(R.id.button4);

    b1.setOnClickListener(this);

    firstFragment = new FirstFragment();
    mapFragment =  ThirdMapFragment.getInstance();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public void onClick(View v) {
    makeTransaction(v.getId());
}



private void makeTransaction(int id) {
    i++;
    transaction = fragmentManager.beginTransaction();
    if (i == 1) {
        transaction.replace(R.id.relativeLayout, firstFragment).commit();
    } else if (i == 2) {
        transaction.replace(R.id.relativeLayout, secondFragment).commit();
    } else {
    transaction.replace(R.id.relativeLayout, mapFragment).commit();
        i = 0;
    }
}
}

R.id.relativeLayout — макет в main.xml

Но карту не вижу (пустой экран с кнопками масштабирования) и как сделать LocationListener? Спасибо.


person Yuriy Aizenberg    schedule 22.01.2013    source источник


Ответы (3)


если вы используете библиотеку поддержки, вы должны использовать класс SupportMapFragment, а не MapFragment для фрагмента карты. ваша активность должна быть FragmentActivity для поддержки библиотеки. а также для менеджера фрагментов. вам нужно получитьSupportFragmentManager().

Взгляните на этот код:

import com.google.android.gms.common.GooglePlayServicesUtil;
import android.os.Bundle;
import com.google.android.gms.maps.*;

public class Map extends android.support.v4.app.FragmentActivity
{
private GoogleMap map;


@Override
protected void onCreate(Bundle savedInstanceState) 
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()) == 0)
        {
            map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        }
}}

Если вы все еще не видите карту после внесения этих изменений. Проверьте свою консоль API, что вы включили Google Map ANDROID API V2, а не только Google Map API V2, который может привести к тому же результату, который вы описываете.

person Emil Adz    schedule 24.01.2013
comment
Не следует ли устанавливать карту асинхронно, добавляя getMapAsync(this) и реализуя onMapReady? - person jul; 15.01.2015
comment
Я никогда не использовал эту опцию, и я использую API Карт уже некоторое время. - person Emil Adz; 15.01.2015

представление еще не создано, поэтому getMap() возвращает null, карта не существует, поместите свой код в onResume

person BeNice    schedule 23.05.2013

Вставить в манифест ключ для андроида? Например:

<application
        android:icon="@drawable/android"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyB2s6isdfsghDfgdfdfgDFGDG-yi4-aAYUma0Owc"/>

https://developers.google.com/maps/documentation/android/start

person jackgris    schedule 22.01.2013
comment
да. И разрешения, и ‹uses-sdk›, и прочее. Как создать пользовательский MapFragment? - person Yuriy Aizenberg; 22.01.2013
comment
Вот еще одно сообщение на эту тему: stackoverflow. com/questions/13719263/ Вы добавили библиотеку google-play-service? developer.android.com/google/play-services/setup.html - person jackgris; 22.01.2013