2016-12-31 69 views
0

我想要构建Fragment,其中包含与其他视图重叠的全屏地图(A ViewPager,EditText等)。我想到了两种不同的选择:使用全屏地图创建自定义片段

  1. 创建一个MapView布局的根附近的Fragment并将其设置为match_parent,然后用其他View的正常进行。
  2. 子类MapFragment

我子类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发生:显示java.lang.NullPointerException:试图调用接口

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; 
    } 
} 

所致方法“无效maps.ad.yv()”上的空对象引用

如果我尝试调用返回一个视图之前超类方法,布局被加载,但地图不是:

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是首选,上面的代码有什么问题?

回答

1

除非您实际上修改了MapFragment的任何功能,否则您不应该从中得出结论。只需创建一个带有FrameLayout和MapView的片段作为match_parent并为其添加视图。

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

0

如果我尝试调用返回视图之前的超级计算机的方法,布局被加载,但地图是不是:

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

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" />