7

Posso caricare una mappa di google in un frammento Android all'interno di un'attività. Questo ha funzionato bene.Caricamento frammento Android di Google Maps gestito da ViewPager

Ma ora desidero utilizzare ViewPager per navigare tra le visualizzazioni (classe android.support.v4.app.Fragment). Non sembra possibile caricare un com.google.android.gms.maps.MapFragment in un tale frammento.

Per esempio, in:

SoleMap.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.model.LatLng; 

public class SoleMap extends Fragment implements OnMapReadyCallback { 

    MapFragment gMapFragment; 
    GoogleMap gMap = null; 

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

     gMapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.soleViewMap); 
     gMapFragment.getMapAsync(this); 

     return view; 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     gMap = map; 
     gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
       LatLng(49.39,-124.83), 20)); 
    } 

} 

La dichiarazione

getFragmentManager().findFragmentById(R.id.holeViewMap); 

causa un errore di compilazione (tipi incompatibili).

Ho provato a utilizzare SupportMapFragment, che elimina gli errori del compilatore, ma quando eseguo l'app, si chiude immediatamente con il messaggio "Errore I/O: connessione rifiutata". I documenti Google sembrano indicare che è necessario un account speciale "For Work" per utilizzare la libreria di supporto. È corretto? Se è così, immagino di essere sfortunato.

L'unico altro modo che posso vedere per farlo è utilizzare le attività anziché i frammenti per ospitare le mie visualizzazioni, ad esempio, eliminare il ViewPager.

Qualche suggerimento?

+0

provare questo: http://stackoverflow.com/questions/19353255/how-to-put-google-maps-v2-on-a -fragment-using-viewpager – Josef

+1

Connessione rifiutata: hai la chiave dell'API di Google Maps nel manifest? –

+0

Penso che il mio problema di "connessione rifiutata" non fosse correlato - probabilmente con un aggiornamento all'SDK che necessitava di un arresto/riavvio. Per rispondere alla tua domanda, sì, ho avuto il mio manifest (con chiave) che aveva funzionato in precedenza. – NLRicker

risposta

12

Nella tua sole_map.xml è necessario aggiungere un MapView, diciamo qualcosa di simile:

<?xml version="1.0" encoding="utf-8"?> 
<com.google.android.gms.maps.MapView 
    android:id="@+id/soleViewMap" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Poi viene consegnata dal frammento SoleMap con l'id view.findViewById(R.id.soleViewMap); Ciò restituirà un MapView, allora si può fare quello che si stai facendo ora. Esso dovrebbe essere simile a questo:

public class SoleMap extends Fragment implements OnMapReadyCallback { 

    MapView gMapView; 
    GoogleMap gMap = null; 

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

    gMapView = (MapView) view.findViewById(R.id.soleViewMap); 
    gMapView.getMapAsync(this); 

    return view; 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
    gMap = map; 
    gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
      LatLng(49.39,-124.83), 20)); 
    } 
} 

Non dimenticare di associare il vostro mapview con il ciclo di vita frammento chiamando gli eventi onCreate, onLowMemory, , onResume e onDestroy (spero di non perdere nessuna di loro), e chiamare a MapsInitializer.initialize(getContext()); così

+0

Sto ancora lavorando all'implementazione di questo, ma nel caso in cui qualcun altro stia utilizzando quanto sopra, credo che richieda una correzione. Invece di findFragmentById(), è necessario utilizzare findViewByID(). Sono quindi in grado di compilare. Tornerò al più presto per indicare se potrei farlo funzionare in questo modo. – NLRicker

+1

Hai ragione, mia cattiva, farò la correzione tra un momento. Grazie! –

+0

Ora sono in grado di ottenere una mappa su uno dei miei frammenti. Quanto sopra è stato molto utile per quanto riguarda la correzione generale. Per assistenza con i dettagli di implementazione, vedere https://gist.github.com/joshdholtz/4522551. Anche i documenti Android per la classe MapView. – NLRicker

0
public class MapViewFragment extends Fragment implements OnMapReadyCallback{ 

private GoogleMap mMap; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.activity_maps, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    //FragmentManager fragment = getActivity().getSupportFragmentManager(); 
    // Fragment fragment=(Fragment) getChildFragmentManager().findFragmentById(R.id.mapView); 
    final SupportMapFragment myMAPF = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); 
    myMAPF.getMapAsync(this); 

} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    // Add a marker in Sydney and move the camera 
    LatLng sydney = new LatLng(25.412383, 55.508085); 
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 
} 
0

Scrivi questo codice nel tuo activity_maps.xml <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" 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" />

6

accettato un swer è un buon punto di partenza, ma se tenteremo di usarlo fallirà, non descriverà la soluzione completa. frammento completa di lavoro con mappa che può essere utilizzato in ViewPager e Tabs (avviso usando la mappa in fragmeny ciclo di vita):

public class AttractionMapTabFragment extends AttractionTab implements OnMapReadyCallback { 

private ScrollMapView gMapView; 
private GoogleMap gMap; 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_map, null); 

    gMapView = (ScrollMapView) view.findViewById(R.id.map); 
    gMapView.getMapAsync(this); 

    //most important use onCreate; 
    gMapView.onCreate(getArguments()); 
    return view; 

} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    gMap = googleMap; 
    gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
      LatLng(51.3623329,21.7719342), 8)); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    if (gMapView != null) 
     gMapView.onResume(); 
} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 

    if (gMapView != null) 
     gMapView.onDestroy(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    if (gMapView != null) 
     gMapView.onStart(); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    if (gMapView != null) 
     gMapView.onStop(); 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    if (gMapView != null) 
     gMapView.onSaveInstanceState(outState); 
} 
} 

personalizzato MapView classe - è necessaria se si usa ScrollView come genitore, darà la possibilità di muoversi map.If Se non si utilizza ScrollView in questa schermata, è possibile utilizzare lo standard MapView.

public class ScrollMapView extends MapView { 

public ScrollMapView(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    /** 
    * Request all parents to relinquish the touch events 
    */ 
    getParent().requestDisallowInterceptTouchEvent(true); 
    return super.dispatchTouchEvent(ev); 
} 
} 

ultima cosa è il layout - R.layout.fragment_map:

<?xml version="1.0" encoding="utf-8"?> 
<your.app.ScrollMapView 
android:id="@+id/map" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" /> 
Problemi correlati