当前位置: 首页 > 知识库问答 >
问题:

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

蒋英博
2023-03-14

我可以将谷歌地图加载到活动中的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。

有什么建议吗?


共有3个答案

胡桐
2023-03-14
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));
}
}
严阳秋
2023-03-14

公认的答案是一个很好的起点,但如果我们尝试使用它,它将失败,它不能描述完整的解决方案。带有地图的完整工作片段,可在查看页面和选项卡中使用(请注意在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" />

周子平
2023-03-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"/>

然后使用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