getMapAsync() in Fragment

后端 未结 4 1647
旧时难觅i
旧时难觅i 2020-12-05 05:19

I having trouble implementing Google Map in Fragment.

This is my the part of my fragment class:

public class FragmentStoreFinderMap extends Fragment          


        
相关标签:
4条回答
  • 2020-12-05 06:00

    In your XML layout you should do like this

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <com.google.android.gms.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
    </FrameLayout>
    

    inside your fragment implement this

    private MapView mapView;
    private GoogleMap googleMap;
    

    override onCreateView if there is no onCreateView just like the code below

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.your_layout, container, false);
    }
    

    override onViewCreated() inside that onViewCreated() put this

    mapView = (MapView) view.findViewById(R.id.map);
    mapView.onCreate(savedInstanceState);
    mapView.onResume();
    mapView.getMapAsync(this);//when you already implement OnMapReadyCallback in your fragment
    

    when you already implement OnMapReadyCallback in your fragment put this/code like this

    @Override
    public void onMapReady(GoogleMap map) {
        googleMap = map;
    }
    

    hope this helps you.

    0 讨论(0)
  • 2020-12-05 06:15
     SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
     FragmentTransaction fragmentTransaction =
     getChildFragmentManager().beginTransaction();
     fragmentTransaction.add(R.id.flMap, mMapFragment);
     fragmentTransaction.commit();
     mMapFragment.getMapAsync(this);
    
    0 讨论(0)
  • 2020-12-05 06:16

    After a few overheats in my head, thanks to this post and https://stackoverflow.com/a/34732804/3925554, I would say that currently there are two ways of adding a MapFragment to your app:

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

    By this way, you have to use a standard fragment and implement this inside. Actually you are inserting a fragment into another:

        @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
        SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        supportMapFragment.getMapAsync(this);
    }
    

    The other way would be using the real SupportMapFragment and implement it in this manner:

        @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
        getMapAsync(this);
    }
    

    And they work without having to set a layout in onCreateView neither call mapView.onCreate(savedInstanceState); and mapView.onResume(); manually inside onViewCreated(), what is not recommended anyway.

    Hope it helps!

    0 讨论(0)
  • 2020-12-05 06:16

    Your code is returning this error because getMapAsync() does not return anything. If you look at the documentation for this function:

    public void getMapAsync (OnMapReadyCallback callback)

    Sets a callback object which will be triggered when the GoogleMap instance is ready to be used.

    Note that:

    This method must be called from the main thread. The callback will be executed in the main thread. In the case where Google Play services is not installed on the user's device, the callback will not be triggered until the user installs it. In the rare case where the GoogleMap is destroyed immediately after creation, the callback is not triggered. The GoogleMap object provided by the callback is non-null.

    OnMapReadyCallback is an interface that needs implemented and passed to through this function. Nothing is currently assigned to your googleMap variable you should instead set its value in this block of code which implements OnMapReadyCallback

    @Override
        public void onMapReady(GoogleMap googleMap) {
            this.googleMap = googleMap;
    
    
        }
    

    This code should be in your Fragment somewhere. Since your Fragment already implements this interface you do pass it in as this.

    0 讨论(0)
提交回复
热议问题