正在加载由ViewPager管理的Android Google Map片段

NLR*_*ker 9 android google-maps android-fragments fragmentpageradapter

我可以将谷歌地图加载到活动中的Android片段中.这一直很好.

但现在我想使用ViewPager在视图(类android.support.v4.app.Fragment)之间导航.似乎不可能将a加载com.google.android.gms.maps.MapFragment到这样的片段中.

例如,在:

SoleMap.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;

public class SoleMap extends Fragment implements OnMapReadyCallback {

    MapFragment gMapFragment;
    GoogleMap gMap = null;

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

        gMapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.soleViewMap);
        gMapFragment.getMapAsync(this);

        return view;
    }

    @Override
    public void onMapReady(GoogleMap map) {
        gMap = map;
        gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new
                LatLng(49.39,-124.83), 20));
    }

}
Run Code Online (Sandbox Code Playgroud)

该声明

getFragmentManager().findFragmentById(R.id.holeViewMap);
Run Code Online (Sandbox Code Playgroud)

导致编译器错误(不兼容的类型).

我尝试使用SupportMapFragment,这消除了编译器错误,但是当我运行应用程序时,它立即退出并显示消息"I/O错误:连接被拒绝".Google文档似乎表明您需要一个特殊的"For Work"帐户才能使用支持库.那是对的吗?如果是这样,我想我运气不好.

我能看到的另一种方法是使用活动而不是片段来托管我的视图,即摆脱ViewPager.

有什么建议?

Jor*_*dez 14

sole_map.xml你的必须添加一个MapView,让我们说这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.maps.MapView
    android:id="@+id/soleViewMap"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

然后从你的SoleMap片段获取它与id view.findViewById(R.id.soleViewMap);这将返回一个MapView,然后你可以做你现在正在做的事情.它应该看起来像这样:

public class SoleMap extends Fragment implements OnMapReadyCallback {

  MapView gMapView;
  GoogleMap gMap = null;

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

    gMapView = (MapView) view.findViewById(R.id.soleViewMap);
    gMapView.getMapAsync(this);

    return view;
  }

  @Override
  public void onMapReady(GoogleMap map) {
    gMap = map;
    gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new
            LatLng(49.39,-124.83), 20));
  }
}
Run Code Online (Sandbox Code Playgroud)

不要忘了你的MapView与片段生命周期调用事件相关联onCreate,onLowMemory,onPause,onResumeonDestroy(希望不会遗漏任何人),并电话MapsInitializer.initialize(getContext());以及


Mac*_*ora 9

接受的答案是一个很好的起点,但如果我们尝试使用它会失败,它不会描述完整的解决方案.完整的工作片段与地图,可用于ViewPagerTabs(通知使用地图在fragmeny生命周期):

public class AttractionMapTabFragment extends AttractionTab implements OnMapReadyCallback {

private ScrollMapView gMapView;
private GoogleMap gMap;


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

    View view = inflater.inflate(R.layout.fragment_map, null);

    gMapView = (ScrollMapView) view.findViewById(R.id.map);
    gMapView.getMapAsync(this);

    //most important use onCreate;
    gMapView.onCreate(getArguments());
    return view;

}

@Override
public void onMapReady(GoogleMap googleMap) {
    gMap = googleMap;
    gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new
            LatLng(51.3623329,21.7719342), 8));
}

@Override
public void onResume() {
    super.onResume();

    if (gMapView != null)
        gMapView.onResume();
}


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

    if (gMapView != null)
        gMapView.onDestroy();
}

@Override
public void onStart() {
    super.onStart();

    if (gMapView != null)
        gMapView.onStart();
}

@Override
public void onStop() {
    super.onStop();

    if (gMapView != null)
        gMapView.onStop();

}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    if (gMapView != null)
        gMapView.onSaveInstanceState(outState);
}
}
Run Code Online (Sandbox Code Playgroud)

自定义MapView类 - 如果我们使用ScrollView父级,则需要它,它可以移动map.如果您没有ScrollView在此屏幕中使用,则MapView可以使用标准.

public class ScrollMapView extends MapView {

public ScrollMapView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    /**
     * Request all parents to relinquish the touch events
     */
    getParent().requestDisallowInterceptTouchEvent(true);
    return super.dispatchTouchEvent(ev);
}
}
Run Code Online (Sandbox Code Playgroud)

最后一件事是布局 - R.layout.fragment_map:

<?xml version="1.0" encoding="utf-8"?>
<your.app.ScrollMapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android" />
Run Code Online (Sandbox Code Playgroud)