我想构建一个Fragment
,其中包含一个覆盖有其他视图的全屏地图(A ViewPager
,EditText
等)。我想到了两个不同的选择:
Fragment
MapView
并将其设置为match_parent
,然后照常使用其他View
。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:
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,上面的代码有什么问题?
答案 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" />