6

Tôi đang cố gắng để có được một bản đồ từ một SupportMapFragment nhưng nó trả về null. Từ những gì tôi đọc điều này có thể là do mảnh vỡ chưa được hiển thị đầy đủ và do đó không có bản đồ nào tồn tại ?! Tôi đã thử sửa nó bằng cách sử dụng executePendingTransactions() nhưng không thành công cho đến nay.mapFragment.getMap() trả về null

Bất kỳ ý tưởng nào về cách khắc phục sự cố?

Đây là mã

private GoogleMap map; 
private SupportMapFragment mapFragment; 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    //... 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen_mission2); 
    GoogleMapOptions mapOptions = new GoogleMapOptions(); 

    mapOptions.mapType(GoogleMap.MAP_TYPE_NORMAL) 
     .compassEnabled(true) 
     .rotateGesturesEnabled(false) 
     .tiltGesturesEnabled(false); 

    android.support.v4.app.FragmentManager myFragmentManager = getSupportFragmentManager(); 
    android.support.v4.app.FragmentManager.enableDebugLogging(true); 
    mapFragment = SupportMapFragment.newInstance(mapOptions); 
    FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.mapFragment, mapFragment); 
    fragmentTransaction.commit(); 
    myFragmentManager.executePendingTransactions(); 

    if(mapFragment == null) Base.log("mapFragment==null"); 
    if(map==null){ 
     map = mapFragment.getMap(); 
     Base.log("map should have been initialized"); 
     if(map==null) Base.log("map still null"); 
    } 
} 

Và file layout:

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

Nó trả về các bản ghi sau

V/FragmentManager(24224): add: SupportMapFragment{4078c4b8 id=0x7f06003d} 
V/FragmentManager(24224): Allocated fragment index SupportMapFragment{4078c4b8 #1 id=0x7f06003d} 
V/FragmentManager(24224): moveto CREATED: SupportMapFragment{4078c4b8 #1 id=0x7f06003d} 
D/EMR  (24224): map should have been initialized 
D/EMR  (24224): map still null 
+0

đây đã tuyên bố bạn biến 'mapFragment'? – yugidroid

+0

Có phải tôi đã khai báo (chỉnh sửa phần mã, xem ở trên) – cos4

+0

Có phải nó đã được khởi tạo không? Nếu không, nó sẽ giống như không có gì, tức là, 'null'. – yugidroid

Trả lời

1

Từ những gì tôi đọc điều này có thể là do đoạn chưa được hiển thị đầy đủ và do đó không có bản đồ nào tồn tại?

Đúng.

Mọi ý tưởng khắc phục sự cố?

Thực sự sử dụng tệp bố cục, bằng cách gọi setContentView() và loại bỏ tất cả các công cụ FragmentTransaction. Sau đó bạn có thể lấy lại đã tạo SupportMapFragment và sử dụng nó:

setContentView(R.layout.activity_main); 

SupportMapFragment mapFrag=(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment); 
+0

Cảm ơn, tôi đã nghĩ về điều đó nhưng tôi có thể đặt các tùy chọn được chỉ định trong GoogleMapOptions trong mã của tôi sau đó trong tệp xml hoặc đặt chúng sau này không? – cos4

+0

@ cos4: Có tương đương trong XML, mặc dù một số người đã báo cáo các vấn đề khi sử dụng chúng trong Eclipse do một số lỗi Eclipse/ADT. Nếu điều đó không có tác dụng, hãy loại bỏ 'SupportMapFragment' trong XML, thay thế nó bằng' FrameLayout', gắn bó với 'FragmentTransaction' hiện có của bạn (đổ mảnh vào' FrameLayout'), nhưng sau đó bạn cần phải trì hoãn làm việc với 'GoogleMap' một chút (ví dụ, phân lớp' SupportMapFragment' và đặt mã của bạn trong 'onActivityCreated()'). – CommonsWare

+0

Có tài liệu nào về cài đặt các tùy chọn cho bản đồ trong XML không? Không thể tìm thấy bất kỳ ... Nếu không, nếu tôi phải phân lớp SupportMapFragment dù sao tôi cũng có thể gửi một ý định từ onActivityCreated() và bắt nó từ hoạt động hiện tại của tôi ?! – cos4

14

Hãy thử di chuyển tất cả các mã tham chiếu của bạn GoogleMap-onStart() hoặc onResume(). Bản đồ trong một mảnh bản đồ không được khởi tạo cho đến khi đoạn đã trải qua onCreateView (link), điều này xảy ra sau khi hoạt động gốc đã trải qua onCreate(). Ngoài ra, bạn cần phải kiểm tra GoogleMap cho null bất kể, vì nếu dịch vụ google play chưa được cài đặt hoặc bản đồ không có sẵn vì một số lý do khác, nó sẽ là null.

+0

Điều này dường như là giải pháp đơn giản nhất, cảm ơn bạn! –

+0

+1 để giải thích "tại sao?" cũng như "cái gì?" –

1

Bạn phải thực hiện OnMapReadyCallback, xác định public void onMapReady(GoogleMap map) của nó và sử dụng nó để hoạt động trên đoạn như đã nêu trong Google API