使用全屏幕地图创建自定义片段

时间:2016-12-31 23:49:40

标签: android android-fragments mapfragment

我想构建一个Fragment,其中包含一个覆盖有其他视图的全屏地图(A ViewPagerEditText等)。我想到了两个不同的选择:

  1. 在布局根目录附近创建Fragment MapView并将其设置为match_parent,然后照常使用其他View
  2. 子类MapFragment
  3. 我已经分组MapFragment

    public class ListMapFragment extends MapFragment {
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            return super.onCreateView(inflater, container, savedInstanceState);
        }
    }
    

    显示此片段正常工作,地图占用整个片段。但是,我想在地图上显示如上所述的各种视图。如果我尝试通过返回视图来膨胀并返回视图(就像使用普通Fragment那样),则会发生NPE:

    public class ListMapFragment extends MapFragment {
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            View view = inflater.inflate(R.layout.fragment_list_map, container, false);
            return view; 
        }
    }
    
      

    引起:java.lang.NullPointerException:尝试在空对象引用上调用接口方法'void maps.ad.y.v()'

    如果我在返回视图之前尝试调用supers方法,则会加载布局,但地图不会:

    public class ListMapFragment extends MapFragment {
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            View view = inflater.inflate(R.layout.fragment_list_map, container, false);
    
            super.onCreateView(inflater, container, savedInstanceState);
    
            return view;
        } 
    

    在两个选项中,一个比另一个更受欢迎吗?如果首选#2,上面的代码有什么问题?

2 个答案:

答案 0 :(得分:1)

除非您实际修改MapFragment的任何功能,否则您不应该从中获取。{p>只需创建一个包含FrameLayout和MapView为match_parent的片段,并为其添加视图。

这也是上述代码的错误。当你从MapFragment派生并覆盖其方法时,它的某些初始化不会发生,因此你得到一个NPE。

答案 1 :(得分:0)

  

如果我在返回视图之前尝试调用supers方法,则会加载布局,但地图不会:

这是要走的路。但是你还需要加载地图。

public class MyMapFragment extends SupportMapFragment implements OnMapReadyCallback {
    // extends SupportMapFragment, but MapFragment should work as well

    View rootView;
    private MapView mapView;

    public MyMapFragment() {}

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

        super.onCreateView(inflater, container, savedInstanceState);

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

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

        return rootView;
    }

    @Override
    public void onMapReady(GoogleMap map) {
        mainActivity.googleMap = map;
        // play with your map
    }
}

XML fragment_map.xml

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