SORU
5 Aralık 2012, ÇARŞAMBA


Program aracılığıyla Haritalar ile başlatmak MapFragment API v2

Benim şu anki Parça için bir MapFragment eklemek için çalışıyorum. İç içe geçmiş parçaları kullanın FragmentTransactions sınırlıdır, düzeni xml etiketi kullanamazsınız. Ayrıca, Kullanıcı bir düğmeye bastığında ana Bölümü eklenmesini istiyorum. Böylece, Program aracılığıyla kullanıcı bu düğmeye bastığında getInstance() ile MapFragment oluşturma ve uygun yere ekliyorum. Doğru, şimdiye kadar çok iyi gösterilir.

Sorun MapFragment taktıktan sonra GoogleMap için bir başvuru almak için ihtiyacım varbir İşaretçi yerleştirmek içinama getMap() yöntem döndürür null parçası onCreateView() henüz adlı olmamıştır.

Baktım demo örnek kod ve bulduğum çözüm kullanıyorlardı başlatma MapFragment onCreate() almak ve başvuru için GoogleMap onResume(), sonra onCreateView() çağrıldıktan.

Kullanıcılar ya da bir düğme ile göster göstermek veya gizlemek için mümkün olmak istiyorum, çünkü MapFragment başlatma hemen sonra GoogleMap için referans almak istiyorum. Biliyorum olası bir çözüm olurdu oluşturmak için Haritaya başlangıç olarak yukarıda söylediğim ve sadece set görünürlük gitti, ama harita için varsayılan olarak kapalı bu yüzden bazen işe yaramaz kullanıcının bant genişliği etmezlerse açıkça sordu.

MapsInitializer ile denedim ama o da işe yaramıyor. Biraz sıkıştım. Herhangi bir fikir? İşte benim şu ana kadar test kodu:

public class ParadaInfoFragment extends BaseDBFragment {
// BaseDBFragment is just a SherlockFragment with custom utility methods.

private static final String MAP_FRAGMENT_TAG = "map";
private GoogleMap mMap;
private SupportMapFragment mMapFragment;
private TextView mToggleMapa;
private boolean isMapVisible = false;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_parada_info, container, false);
    mToggleMapa = (TextView) v.findViewById(R.id.parada_info_map_button);
    return v;
}

@Override
public void onStart() {
    super.onStart();
    mToggleMapa.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!isMapVisible) {
                openMap();
            } else {
                closeMap();
            }
            isMapVisible = !isMapVisible;
        }
    });
}

private void openMap() {
    // Creates initial configuration for the map
    GoogleMapOptions options = new GoogleMapOptions().camera(CameraPosition.fromLatLngZoom(new LatLng(37.4005502611301, -5.98233461380005), 16))
            .compassEnabled(false).mapType(GoogleMap.MAP_TYPE_NORMAL).rotateGesturesEnabled(false).scrollGesturesEnabled(false).tiltGesturesEnabled(false)
            .zoomControlsEnabled(false).zoomGesturesEnabled(false);

    // Modified from the sample code:
    // It isn't possible to set a fragment's id programmatically so we set a
    // tag instead and search for it using that.
    mMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);

    // We only create a fragment if it doesn't already exist.
    if (mMapFragment == null) {
        // To programmatically add the map, we first create a
        // SupportMapFragment.
        mMapFragment = SupportMapFragment.newInstance(options);
        // Then we add it using a FragmentTransaction.
        FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.parada_info_map_container, mMapFragment, MAP_FRAGMENT_TAG);
        fragmentTransaction.commit();
    }
    // We can't be guaranteed that the map is available because Google Play
    // services might not be available.
    setUpMapIfNeeded(); //XXX Here, getMap() returns null so  the Marker can't be added
    // The map is shown with the previous options.
}

private void closeMap() {
    FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
    fragmentTransaction.remove(mMapFragment);
    fragmentTransaction.commit();
}

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the
    // map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = mMapFragment.getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            mMap.addMarker(new MarkerOptions().position(new LatLng(37.4005502611301, -5.98233461380005)).title("Marker"));
        }
    }
}
}

Teşekkürler

CEVAP
5 Aralık 2012, ÇARŞAMBA


İyi AnderWebs Google bana bir cevap verdi ama çok laz o.... emm burada kısa versiyonu bu yüzden buraya tekrar yazmak, meşgul etmek: MapFragment sınıfını genişletir ve geçersiz onCreateView() yöntemi. Bu yöntem yapıldıktan sonra GoogleMap nesne que boş olmayan bir referans alabiliriz.

Bu benim özel bir çözüm:

public class MiniMapFragment extends SupportMapFragment {

private LatLng mPosFija;


public MiniMapFragment() {
    super();

}

public static MiniMapFragment newInstance(LatLng posicion){
    MiniMapFragment frag = new MiniMapFragment();
    frag.mPosFija = posicion;
    return frag;
}

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
    View v = super.onCreateView(arg0, arg1, arg2);
    initMap();
    return v;
}

private void initMap(){
    UiSettings settings = getMap().getUiSettings();
    settings.setAllGesturesEnabled(false);
    settings.setMyLocationButtonEnabled(false);

    getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(mPosFija,16));
    getMap().addMarker(new MarkerOptions().position(mPosFija).icon(BitmapDescriptorFactory.fromResource(R.drawable.marker)));
}
}

Ben önceki Bölümü, sınıf şimdi mMapFragment = MiniMapFragment.newInstance(new LatLng(37.4005502611301, -5.98233461380005));

Belki ekran gösteren harita yanıp söner çünkü henüz mükemmel değil. Ama tabii eğer sorun bu ya da başka bir şey yüzünden değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • failblog

    failblog

    17 HAZİRAN 2008
  • Lancome USA

    Lancome USA

    30 HAZİRAN 2009
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008