2016-12-31 29 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" />