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,onResume和onDestroy(希望不会遗漏任何人),并电话MapsInitializer.initialize(getContext());以及
接受的答案是一个很好的起点,但如果我们尝试使用它会失败,它不会描述完整的解决方案.完整的工作片段与地图,可用于ViewPager和Tabs(通知使用地图在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)
| 归档时间: |
|
| 查看次数: |
12164 次 |
| 最近记录: |