android - fragment 中的空指针异常,使用谷歌地图

标签 android google-maps android-fragments google-maps-android-api-2

我在 fragment 中获取 android google maps 时收到空指针异常。错误出现在 findFragmentById 行。我尝试使用 if (mMap != null) 表示 map 仍然为空。我该怎么做才能解决这个问题?

在MapActivity.java中,

//Relevant imports
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
enter code here
public class MapView extends Fragment {

GoogleMap mMap;
LatLng mLocation = new LatLng(1.379348, 103.849876);

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

        View rootView = inflater.inflate(R.layout.map_view, container, false);

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

        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        //Zoom
        mMap.getUiSettings().setZoomControlsEnabled(true);

        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLocation, 17));
        Marker mMarker = mMap.addMarker(new MarkerOptions()
        .position(mLocation)
        .title("School")
        .snippet("NTU")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));

        mMap.setOnMarkerClickListener(new OnMarkerClickListener()
        {
            public boolean onMarkerClick(Marker marker){
                Toast.makeText(getActivity().getApplicationContext(), "Welcome to " + marker.getTitle(), Toast.LENGTH_LONG);

                return false;
            }
        });

        mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener(){

            @Override
            public void onInfoWindowClick(Marker arg0) {
                // TODO Auto-generated method stub

            }
        });

        return rootView;
    }

在 map_view.xml 中,

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.MapFragment" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</RelativeLayout>

最佳答案

为了将 SupportMapFragment 嵌套在 Fragment 中,您需要使用 getChildFragmentManager() 而不是 getFragmentManager()

所以,你会改变这个:

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

为此,还将所有引用 mMap 的代码移动到 onResume():

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

如果你走这条路,你还需要修复你的布局 xml 以使用 SupportMapFragment:

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

但是,如果不需要,最好不要嵌套 Fragment,因为它会导致 other problems .

更好的方法是让 Fragment 扩展 SupportMapFragment。这样做,您甚至不需要布局 xml 文件。

例子:

public class MapView extends SupportMapFragment 
                                    implements OnMapReadyCallback {

    private GoogleMap mMap;
    private Marker marker;


    public MapView() {
    }

    @Override
    public void onResume() {
        super.onResume();

        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {

        if (mMap == null) {

            getMapAsync(this);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        setUpMap();
    }

    private void setUpMap() {

        mMap.setMyLocationEnabled(true);
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        mMap.getUiSettings().setMapToolbarEnabled(false);

    }


}

关于android - fragment 中的空指针异常,使用谷歌地图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31497800/

相关文章:

android - 如何将位图图像从 Activity 传输到 Fragment

Android - 如何动态更改 fragment 布局

android - 从 DialogFragment 子类调用 findViewById() 给出 NullPointerException

javascript - 出现错误 -> 意外的 token }

javascript - 如何从 Google map url 获取准确的 lat lng

Android DrawerLayout - 让 child 获得焦点

android - SoundPool 不播放?

android - 已连接设备列表中的闪烁选项不允许我调试任何应用程序

javascript - 单击信息窗口内的按钮后更改谷歌地图标记属性

c# - 如何使用 Xamarin Forms Maps 更改自定义 map 上的标记/图钉图标?