2016-03-15 62 views
0

在我的應用程序中,我使用的導航抽屜與刷卡選項卡(以下this),並在這些選項卡之一我想要使用谷歌地圖。我得到這個錯誤:谷歌地圖v2裏面的片段返回void

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference 

我已經搜查,發現我只能在主線程中調用getMapAsync()。然而,我面臨的幾乎所有解決方案都是使用不推薦的方法。我如何初始化地圖,以避免null異常,並只在該選項卡上調用它?

我的標籤片段

public class PrimaryFragment extends Fragment implements OnMapReadyCallback { 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.primary_layout,container,false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    SupportMapFragment supportMapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)); 
    supportMapFragment.getMapAsync(this); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    //toDO 
} 

}

的標籤片段XML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<fragment android:id="@+id/map" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    class="com.google.android.gms.maps.SupportMapFragment"/> 

</FrameLayout> 
+0

[Check this SO link](https://stackoverflow.com/a/32004257/2715073)可能適合你。 – Pankaj

回答

0

您可以替換該行 -

SupportMapFragment supportMapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)); 

本 -

SupportMapFragment supportMapFragment = ((SupportMapFragment) view.getChildFragmentManager().findFragmentById(R.id.map)); 

希望這有助於!

+0

如果我替換它,我無法解析getFragmentManager。此外,我試圖使用supportFragmentManager,所以它將在早期版本的Android上工作。 –

+0

@ArturGaldino - 你嘗試添加view.getChildFragmentManager()嗎? –

+0

是的,如果我這樣做,它說它不能解決'getChildFragmentManager()' –

0

地圖片段在Lollipop上起作用,您可能需要這個。

SupportMapFragment supportMapFragment; 
if (Build.VERSION.SDK_INT < 21) { 
    supportMapFragment = (SupportMapFragment) getActivity() 
     .getSupportFragmentManager().findFragmentById(R.id.map); 
} else { 
    supportMapFragment = (SupportMapFragment) getActivity() 
     .getChildFragmentManager().findFragmentById(R.id.map); 
} 
supportMapFragment.getMapAsync(this); 

希望這對你有效。