我可以将谷歌地图加载到活动中的Android片段中。这一直运行良好。
但现在我想使用ViewPager在视图之间导航(classandroid.support.v4.app.Fragment)。似乎无法加载com.google.Androidgms。地图。将片段映射到这样一个片段中。
例如,在:
太阳地图。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));
}
}
声明
getFragmentManager().findFragmentById(R.id.holeViewMap);
导致编译器错误(不兼容的类型)。
我尝试改用SupportMapFragment,这样可以消除编译器错误,但当我运行应用程序时,它会立即退出,并显示消息“I/O错误:连接被拒绝”Google文档似乎表明您需要一个特殊的“For Work”帐户来使用支持库。对吗?如果是这样,我想我运气不好。
我能看到的唯一其他方法是使用活动而不是片段来承载我的视图,即去掉ViewPager。
有什么建议吗?
public class MapViewFragment extends Fragment implements OnMapReadyCallback{
private GoogleMap mMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.activity_maps, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//FragmentManager fragment = getActivity().getSupportFragmentManager();
// Fragment fragment=(Fragment) getChildFragmentManager().findFragmentById(R.id.mapView);
final SupportMapFragment myMAPF = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
myMAPF.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(25.412383, 55.508085);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}
公认的答案是一个很好的起点,但如果我们尝试使用它,它将失败,它不能描述完整的解决方案。带有地图的完整工作片段,可在查看页面和选项卡中使用(请注意在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);
}
}
自定义MapView
类-如果我们使用ScrollView
作为父类,则需要它,它提供了移动地图的可能性。如果您在此屏幕中未使用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);
}
}
最后一件事是布局-R.layout。fragment\u映射:
<?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" />
在您的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"/>
然后使用id视图从SoleMap片段中获取它。findViewById(R.id.soleViewMap)
这将返回一个地图视图,然后您可以执行现在正在执行的操作。应该是这样的:
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));
}
}
不要忘记将地图视图与片段生命周期相关联,该生命周期调用事件onCreate、onLowMemory、onPause、onResume和onDestroy,并调用MapsInitializer。初始化(getContext())
以及
我使用了和。 但它一次加载两个页面。 有什么方法可以在viewpager中只加载一个页面吗?
在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。我使用方法检测何时出现在屏幕上。当用户在选项卡之间滑动时,这非常有效,但它在第一次加载时不起作用。要运行该方法中的代码,我必须向左滑动,然后返回到第一个,因为方法是在方法之前调用的。 你有任何想法,我如何运行这段代码后,第一个片段是可见的吗?中有方法吗?
这是我的适配器类。 当添加片段并将它们添加到适配器中的不同arraylist时,我传递了不同的arraylist,当调用get item时,我从arraylist中获取条目并将其作为参数传递给该片段,但当我运行此操作时,我最初只获得所有参数,当我更改选项卡时不会发生任何事情。我试着调试,发现getitem最初只被调用了8次,当我改变viewpager选项卡时,什么也不会发生。我也尝试了fragme
我怎么能那么做?我也不知道。我在等你的帮助。谢谢。 我的代码:
问题内容: 我在内使用3 ,问题是我在和加载器中加载大数据。在这类设备上,它可以正常工作,但是在低端设备上,则需要很多时间。这主要是因为当我实现时,我将Fragments放在an中,这迫使片段在加载主活动时实例化。我需要的是它只是“加载”第一个片段(主要),而当用户使用时,加载另一个片段。它有什么办法做到这一点?这是我的页面 问题答案: Sun的上述方法对我不起作用(也许对您有用),但是我想我也将
我有一个基于SherlockFragment的片段,其中包括一个ViewPager,通过FragmentStatePagerAdapter与Fractions一起操作。我实现了“无限”滚动,所以适配器返回getCount() 1000。它的工作原理。当我用另一个数据替换()主活动中的主要片段时,就会出现问题,onCreateView这个主片段在第一次初始化期间调用:我重新创建适配器并将其设置为Vi