如何在 Fragment 中获取 Google Maps 对象

Posted

技术标签:

【中文标题】如何在 Fragment 中获取 Google Maps 对象【英文标题】:How to get Google Maps object inside a Fragment 【发布时间】:2014-03-28 18:36:04 【问题描述】:

我在我的应用程序中使用片段,我对此并不陌生。有一个片段,我想在其中显示谷歌地图并想要获取它的对象,为此我在我的 XML 中有一个片段,我想在片段本身中膨胀它。当我尝试为地图视图充气时,它向我显示 getSupportFragmentManager() 的错误。

如何获取地图对象是主要问题。我的 XML 是这样的:-

 <fragment
                android:id="@+id/map"
                android:layout_
                android:layout_
                class="com.google.android.gms.maps.SupportMapFragment" />

我想在其中获取 Google Map 对象的片段是这样的:-

public class FindMyCar extends Fragment 

    private TextView mTvFind;
    private TextView mTvPark;
    private EditText mEtParkHint;

    private GoogleMap map;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
    


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

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

        initViews(view);

        Typeface type = Typeface.createFromAsset(getActivity().getResources().getAssets(),"Multicolore.otf"); 
        mTvFind.setTypeface(type);
        mTvPark.setTypeface(type);
        mEtParkHint.setTypeface(type);

        SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);


        return view;
    


    @Override
    public void onDestroyView() 
        super.onDestroyView();
    


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


    private void initViews(View view)


        mTvPark = (TextView) view.findViewById(R.id.tvFindCarPark);
        mTvFind = (TextView) view.findViewById(R.id.tvFindCar);
        mEtParkHint = (EditText) view.findViewById(R.id.etParkHint);
    

谁能帮我获取地图的对象,以便我可以显示当前位置并在那里绘制标记。

任何帮助都将不胜感激。 提前致谢。

【问题讨论】:

【参考方案1】:

getMap() 方法已弃用

getMap() 方法已被弃用,但在 play-services 9.2它被删除之后,所以最好使用 getMapAsync()。仅当您不愿意为您的应用更新 play-services 9.2 时,您仍然可以使用 getMap()。

要使用getMapAsync(),请在您的活动或片段上实现OnMapReadyCallback 接口:

对于片段:

public class MapFragment extends android.support.v4.app.Fragment
      implements OnMapReadyCallback  /* ... */ 

然后,在初始化地图时,使用getMapAsync() 而不是getMap()

//call this method in your onCreateMethod
 private void initializeMap() 
  if (mMap == null) 
    SupportMapFragment mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map);
    mapFrag.getMapAsync(this);
  


@Override
public void onMapReady(GoogleMap googleMap) 
    mMap = googleMap;
    setUpMap();// do your map stuff here

对于活动:

public class MapActivity extends FragmentActivity
      implements OnMapReadyCallback  
Then, while initializing the map, use getMapAsync() instead of getMap():


//call this method in your onCreateMethod
 private void initializeMap() 
  if (mMap == null) 
    SupportMapFragment mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_map);
    mapFrag.getMapAsync(this);
  


@Override
public void onMapReady(GoogleMap googleMap) 
    mMap = googleMap;
    setUpMap();// do your map stuff here

XML 中的片段:

   <fragment  xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_
        android:layout_/>

【讨论】:

你能贴一下xml代码吗?我的片段代码出现此错误: com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' 在空对象引用上 这个答案是正确,但你应该知道,在Activity中,你必须从FragmentActivity扩展,否则会出问题【参考方案2】:

试试这个

 GoogleMap map = ((SupportMapFragment) getFragmentManager()
                .findFragmentById(R.id.map)).getMap();

在你的 xml 中

<fragment
    android:id="@+id/map"
    android:layout_
    android:layout_
    class="com.google.android.gms.maps.SupportMapFragment" />

【讨论】:

getMap() 已弃用。任何可能的解决方案? getMapAsync() 是 getMap() 的替代品:***.com/questions/31371865/…【参考方案3】:

试试这个对我有用 How to put Google Maps V2 on a Fragment Using ViewPager

<Fragment
            android:id="@+id/map"
            android:layout_
            android:layout_
            class="com.google.android.gms.maps.SupportMapFragment" />

GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();

【讨论】:

【参考方案4】:

试试这个,我根据您的需要制作了这个作为样品

public class LocationMapActivity extends FragmentActivity 
    private GoogleMap mMap;
    static boolean Iscamera = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.locatio_map);

        setUpMapIfNeeded();
    

    @Override
    protected void onResume() 
        super.onResume();
        setUpMapIfNeeded();

    

    private void setUpMapIfNeeded() 

        if (mMap == null) 

            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map)).getMap();
            mMap.setMyLocationEnabled(true);

            if (mMap != null) 

                mMap.setMyLocationEnabled(true);
                mMap.getUiSettings().setCompassEnabled(true);
                mMap.getUiSettings().setZoomControlsEnabled(true);
                mMap.getMaxZoomLevel();
                mMap.getMinZoomLevel();
                mMap.getUiSettings();
                mMap.animateCamera(CameraUpdateFactory.zoomIn());
                mMap.animateCamera(CameraUpdateFactory.zoomOut());
                mMap.animateCamera(CameraUpdateFactory.zoomTo(20));

                mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() 
                    @Override
                    public void onMyLocationChange(Location arg0) 
                        // TODO Auto-generated method stub

                        mMap.clear();
                        mMap.addMarker(new MarkerOptions()
                        .position(
                                new LatLng(arg0.getLatitude(), arg0
                                        .getLongitude()))
                        .title("I am Here!!")
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.map_icon)));
                        if (!Iscamera) 
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                    new LatLng(arg0.getLatitude(), arg0
                                            .getLongitude()), 14));


                            Iscamera = true;
                        
                        try 

                            if (Constant.FORTNAME.equals("Arad Fort")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(new LatLng(26.2525, 50.6269))
                                        .title(Constant.FORTNAME)
                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                             else if (Constant.FORTNAME.equals("Bahrain Fort")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(26.2333598,
                                                        50.52035139))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));
                             else if (Constant.FORTNAME
                                    .equals("International Circuit")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(26.0303251,
                                                        50.51121409))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                             else if (Constant.FORTNAME
                                    .equals("Khamis Mousque")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(26.158719, 50.516426))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                             else if (Constant.FORTNAME
                                    .equals("king fahad causeway")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(26.1723987,
                                                        50.4579942))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                             else if (Constant.FORTNAME.equals("Riffa Fort")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(26.11771965026855,
                                                        50.56298065185547))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                             else if (Constant.FORTNAME
                                    .equals("Royal Golf Club")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(26.13000, 50.55500))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                             else if (Constant.FORTNAME.equals("Tree of life")) 
                                mMap.addMarker(new MarkerOptions()
                                        .position(
                                                new LatLng(25.9940396,
                                                        50.583135500000026))
                                        .title(Constant.FORTNAME)

                                        .icon(BitmapDescriptorFactory
                                                .fromResource(R.drawable.greenicon)));

                            

                         catch (Exception e) 
                            Toast.makeText(getApplicationContext(),
                                    e.getMessage(), Toast.LENGTH_LONG).show();
                            Log.e(e.getClass().getName(), e.getMessage(), e);
                        

                    
                );

            
        

    

    // ********************************************************************************************
    @SuppressWarnings("unused")
    private void setUpMap() 

        mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title(
                "Marker"));
    

【讨论】:

希望对您有所帮助!! 但这是针对 FragmentActivity 而不是 Fragment【参考方案5】:
public class MapActivity extends FragmentActivity
      implements OnMapReadyCallback  
Then, while initializing the map, use getMapAsync() instead of getMap():


//call this method in your onCreateMethod
 private void initializeMap() 
  if (mMap == null) 
    SupportMapFragment mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_map);
    mapFrag.getMapAsync(this);
  


@Override
public void onMapReady(GoogleMap googleMap) 
    mMap = googleMap;


您可以使用它来制作地图,但它会返回地图对象为空,因为您找不到使用 getMapAsync 来创建新对象 mMap 的解决方案。它只是返回 null 的后台任务

【讨论】:

【参考方案6】:
<fragment
    android:layout_
    android:layout_
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/location_map"
    android:layout_above="@id/atmLocation_recyclerView"
    />

View root= inflater.inflate(R.layout.fragment_a_t_m_locations, container, false);
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.location_map);
    mapFragment.getMapAsync(googleMap -> 
        mMap=googleMap;
        if(mMap!=null)
            mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        
    );

【讨论】:

【参考方案7】:

修改后的代码:

您的 xml 文件-

 <fragment 
      android:name="com.google.android.gms.maps.SupportMapFragment"
      android:id="@+id/map"
      android:layout_
      android:layout_/>

您的 java 文件(仅相关代码)-

View  view = null, mapView = null;
private GoogleMap mMap;

view = inflater.inflate(R.layout.findmycar, container,false);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager
                .findFragmentById(R.id.map);

mMap = supportMapFragment.getMap();
mapView = (View) view.findViewById(R.id.map);

【讨论】:

以上是关于如何在 Fragment 中获取 Google Maps 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Fragment 中实现 Google Maps 并使用 GoogleMap 对象?

Fragment使用具体解释

android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象

如何在activity中获取fragment的控件,然后修改控件的内容,

如何在 Fragment 中获取对 LocationManager 的引用

Android:无法使用 Google Maps Fragment 进行共享元素转换