5

Nella mia app ho mostrato google map versione2 in un frammento. ma ottengo Eccezione puntatore nullo aAndroid GoogleMap o SupportMapFragment - eccezione puntatore null

mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

Questo è il mio codice completo:

public class SearchResultMap extends Fragment{ 

    private GoogleMap mMap; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View fragmentView = inflater.inflate(R.layout.map, container, false); 

     mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); // line no : 28 

     mMap.addMarker(new MarkerOptions() .position(new LatLng(xxxxxx,xxxxxx)) .title("Current Location") 
     .icon(BitmapDescriptorFactory.fromResource(R.drawable.ball_pointer)) 
     .snippet("xxxxx")); 

     return fragmentView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

} 

xml:

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

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

</LinearLayout> 

manifesto xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.fssd.spot" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <permission 
     android:name="com.fssd.spot.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 

    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <uses-permission android:name="com.fssd.spot.permission.MAPS_RECEIVE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.fssd.spot.SplashScreen" 
      android:theme="@android:style/Theme.Light.NoTitleBar" 
      android:noHistory="true" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.fssd.spot.MainActivity" 
      android:screenOrientation="portrait" 
      android:theme="@style/tabTheme" > 
     </activity> 

     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="xxxxxxxxxxxxxxxxxxxxxxxx" /> 

    </application> 

</manifest> 
.210

intero registro gatto:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.fssd.spot.search.SearchResultMap.onCreateView(SearchResultMap.java:28) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
at android.support.v4.app.Fragment.performStart(Fragment.java:1499) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3683) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633) 
at dalvik.system.NativeStart.main(Native Method) 
+0

Hai scaricato Google Play Service Library nel tuo sdk? –

risposta

10

prova a cambiare:

FragmentManager myFM = getActivity().getSupportFragmentManager(); 

final SupportMapFragment myMAPF = (SupportMapFragment) myFM 
       .findFragmentById(R.id.map); 
+0

grazie ora la mappa funziona. –

+3

Perché funziona? – portfoliobuilder

0

provare a cambiare per

mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

Stai usando getFragmentManager(), ma il cast di SupportMapFragment

È inoltre necessario estendere FragmentActivity: http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html

+0

ottengo eccezione: il metodo getSupportFragmentManager() non è definito per il tipo SearchResultMap. –

+0

@murali_ma La tua attività che utilizza questo frammento estende FragmentActivity e non solo attività? – pfairbairn

+0

grazie. la mia attività principale estende l'attività dei frammenti e l'altra classe estende i frammenti. –

0
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

if(map != null) { 
     mMap.addMarker(new MarkerOptions() .position(new LatLng(xxxxxx,xxxxxx)) .title("Current Location") 
     .icon(BitmapDescriptorFactory.fromResource(R.drawable.ball_pointer)) 
     .snippet("xxxxx")); 
} 

<meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="xxxxxxxxxxxxxxxxxxxxxxxx" /> 

inserisci qui la tua chiave API di Google. Ottieni da google Leggi lo documentation.

0

Dopo ore di ricerca, ho fatto in questo modo:

public class MapFragment extends Fragment { 
    private GoogleMap map; 
    SupportMapFragment mapFrag; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     setHasOptionsMenu(true); 
     View rootView = inflater.inflate(R.layout.fragment_map, container, 
       false); 

     fm = getActivity().getSupportFragmentManager(); 
     map = ((SupportMapFragment) fm.findFragmentById(R.id.map)).getMap(); 

     return rootView; 

    } 
} 
14

Nessuna di queste soluzioni fissato per me -, ma questa risposta da Mark Murphy (https://code.google.com/p/android/issues/detail?id=77714) ha fatto:

Usa getChildFragmentManager () per accedere a un frammento annidato, non a getFragmentManager(). http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager%28%29

cioè:

public class MapFragment extends Fragment { 
private GoogleMap map; 
private SupportMapFragment mapFragment; 
... 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup vg, Bundle data) { 
    View view = inflater.inflate(R.layout.map_view, vg, false); 
    FragmentManager fm = getChildFragmentManager(); 
    mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map); 
    mapFragment.getMapAsync(new OnMapReadyCallback() { 
     public void onMapReady(GoogleMap googleMap) { 
      map = googleMap; 
      initMap(); 
     } 
    }); 

} 

}

+0

Questo ha funzionato per me. –

+0

+1 per mostrarlo all'interno di 'onCreateView' Ho avuto problemi a farlo funzionare perché lo stavo facendo all'interno di' onCreate' –

0

provo ad aggiungere tools:context=".YourActivity" al xml frammento:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".YourActivity" /> 
0

possono essere risposte di cui sopra funzionano, ma che lavoro per me è questo.

{ 
    SupportPlaceAutocompleteFragment supportPlaceAutocompleteFragmentSearch; 
    FragmentManager fragmentManagerSearch = getChildFragmentManager(); 
    supportPlaceAutocompleteFragmentSearch = 
              (SupportPlaceAutocompleteFragment) 
              fragmentManagerSearch.findFragmentById(R.id.place_autocomplete_fragment_search); 
    } 
Problemi correlati