7

Mogę załadować mapę google do fragmentu Androida znajdującego się w działaniu. To działa dobrze.Ładowanie fragmentu mapy Google Android zarządzanego przez ViewPager

Ale teraz chcę użyć ViewPager do nawigacji pomiędzy widokami (klasa android.support.v4.app.Fragment). Nie wydaje się możliwe załadowanie takiego fragmentu do postaci.

Na przykład, w:

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)); 
    } 

} 

Oświadczenie

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

powoduje błąd kompilator (niekompatybilne typy).

Próbowałem użyć zamiast tego SupportMapFragment, co eliminuje błędy kompilatora, ale po uruchomieniu aplikacji natychmiast kończy się z komunikatem "Błąd we/wy: Odmowa połączenia." Dokumenty Google wydają się wskazywać, że do korzystania z biblioteki Pomocy potrzebne jest specjalne konto "Do pracy". Czy to jest poprawne? Jeśli tak, myślę, że nie mam szczęścia.

Jedyny inny sposób, w jaki mogę to zrobić, to użyć działań zamiast fragmentów do obsługi moich poglądów, tj. Pozbyć się ViewPager.

Wszelkie sugestie?

+0

spróbuj tego: http://stackoverflow.com/questions/19353255/how-to-put-google-maps-v2-on-a -fragment-using-viewpager – Josef

+1

Połączenie odrzucone: czy w manifeście masz klucz API Map Google? –

+0

Myślę, że mój problem "odmowy połączenia" był niepowiązany - prawdopodobnie z aktualizacją pakietu SDK wymagającego wyłączenia/ponownego uruchomienia. Aby odpowiedzieć na twoje pytanie, tak, miałem swój manifest (z kluczem), który pracował wcześniej. – NLRicker

Odpowiedz

12

w twojej sole_map.xml należy dodać MapView, powiedzmy coś takiego:

<?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"/> 

Następnie dostać go z SoleMap fragmentu z identyfikatorem view.findViewById(R.id.soleViewMap); Będzie to powrót do MapView, to może zrobić to, czego teraz robię. Powinno to wyglądać mniej więcej tak:

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)); 
    } 
} 

Nie zapomnij powiązać MapView z cyklu fragment wywołanie zdarzenia onCreate, onLowMemory, , onResume i onDestroy (mam nadzieję, nie brakuje żadnego z nich), a wezwanie do MapsInitializer.initialize(getContext()); także

+0

Nadal pracuję nad wdrożeniem tego, ale w przypadku, gdy ktoś inny używa powyższych informacji, uważam, że wymaga on jednej korekty. Zamiast findFragmentById() należy użyć findViewByID(). Mogę wtedy skompilować. Wrócę JAK NAJSZYBCIEJ, żeby wskazać, czy mogę zmusić go do działania w ten sposób. – NLRicker

+1

Masz rację, moje złe, zrobię korektę za chwilę. Dzięki! –

+0

Jestem teraz w stanie uzyskać mapę na jednym z moich fragmentów. Powyższe było bardzo pomocne w odniesieniu do ogólnej poprawki. Aby uzyskać pomoc dotyczącą szczegółów implementacji, zobacz https://gist.github.com/joshdholtz/4522551. Także dokumenty systemu Android dla klasy 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

napisać ten kod w swojej 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

przyjął swer to dobry punkt wyjścia, ale jeśli spróbujemy go użyć, to zawiedzie, nie opisuje pełnego rozwiązania. Pełna fragment pracy z mapą, która może być stosowana w ViewPager i Tabs (powiadomienia za pomocą mapy w fragmeny cyklu):

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); 
} 
} 

klienta MapView klasa - to jest potrzebne, jeśli używamy ScrollView jako rodzic, to daje możliwość poruszania się map.Jeśli nie używasz ScrollView na tym ekranie, możesz użyć standardu 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); 
} 
} 

Ostatnią rzeczą jest układ - 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" /> 
Powiązane problemy