Google Maps API'nin "Konumum" düğmesinin konumunu değiştirin


84

Google Haritalar Android API v2'yi kullanıyorum ve "Konumum" düğmesinin konumunu tesadüfen bulmanın bir yolunu bulmalıyım.

"Konumum" düğmesini şu şekilde alıyorum:

GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager()
        .findFragmentById(R.id.map)).getMap();

// This gets the button
map.setMyLocationEnabled(true);

2
AFAIK, yapmıyorsun. Yerleşiminizi, reklam haritayla çakışmayacak şekilde ayarlarsınız.
CommonsWare

5
GoogleMap’in setPadding () yöntemine baktınız mı? Bakın: developers.google.com/maps/documentation/android/…
IgorGanapolsky

Yanıtlar:


70

Haritanın diğer görünümler tarafından engellenebilecek kısımlarını belirtmenize olanak tanıyan GoogleMap.setPadding'i (sol, üst, sağ, alt) kullanmanız yeterlidir. Dolgu ayarı, standart harita kontrollerini yeniden konumlandırır ve kamera güncellemeleri yastıklı bölgeyi kullanır.

https://developers.google.com/maps/documentation/android/map#map_padding


6
Bu en iyi cevap. findById (1) korkunç bir çözüm
pablobaldez

Mutlak en açık ve en iyi uygulama yanıtı. Sevdim.
josefdlange

3
Mylocation düğmesini sağ alt köşeye koymak için iyi çalışıyor, ancak sizin söylediğiniz gibi kamera güncellemelerini karıştırıyor. Bunu nasıl çözebilirim? Şu an itibariyle kameram her zaman ekranın altını merkez olarak görüyor. Bir şeyleri hesaplarken kameraya ekranın yüksekliğinin yarısını ekliyor musunuz?
2016

4
MapView.findViewWithTag ("GoogleMapMyLocationButton") tercih ediyorum; aşağıdaki çözüm.
ayvazj

3
Bunun setPaddingistenmeyen birçok yan etkisi olduğunu unutmayın. En önemlisi, kamera hedefinin ekran konumunu değiştirir.
zyamys

87

"Konumum" düğmesini alabilir ve aşağıdaki gibi taşıyabilirsiniz:

public class MapFragment extends SupportMapFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View mapView = super.onCreateView(inflater, container, savedInstanceState);   

    // Get the button view 
    View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2);

    // and next place it, for exemple, on bottom right (as Google Maps app)
    RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
    // position on right bottom
    rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
    rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    rlp.setMargins(0, 0, 30, 30);
    }
}

4
Merhaba @fabLouis, Öncelikle teşekkür etmek istedim. Kodunuz LocationButton'ı taşıdı. Sadece o düğmenin kimliğini nasıl anladığını merak ediyorum? Bu konuda daha fazla açıklama yapabilir mapView.findViewById(1).getParent()).findViewById(2);. Tekrar teşekkürler, SH
Swan

4
Android Studio hata ayıklayıcı aracılığıyla
fabLouis

1
Bunu yaparsanız, Android Studio "beklenen türdeki kaynak"
diyecektir

11
@inmyth Ben bile aynı hatayı aldım, Ama 1 ve 2'yi Integer sınıfını kullanarak çözümledim. findViewById (Integer.parseInt ("1")). Daha iyi bir çözüm bulduysanız bana bildirin.
Harsha

2
hmm nasıl RelativeLayout.ALIGN_PARENT_TOPve RelativeLayout.ALIGN_PARENT_BOTTOMeşittir dip hakkı?
user2968401

15

Bu en iyi çözüm olmayabilir, ancak kendi düğmenizi haritanın üzerine yerleştirebilir ve kendiniz halledebilirsiniz. Aşağıdakileri alır: -

1) Haritayı bir çerçeve düzenine yerleştirin ve düğmenizi en üste ekleyin. Örneğin

<FrameLayout
    android:id="@+id/mapFrame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >



    <fragment
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mapFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        class="com.google.android.gms.maps.MapFragment"
        map:mapType="normal"
        map:uiCompass="true" />

    <ImageButton
        android:id="@+id/myMapLocationButton"
        android:layout_width="36dp"
        android:layout_height="36dp"
        android:layout_gravity="bottom|right"
        android:background="@drawable/myMapLocationDrawable"
        android:contentDescription="My Location" />

</FrameLayout>

2) Haritalar kullanıcı arayüzü ayarlarını, setMyLocationEnabled (true) öğesini çağırdığınızda düğme görünmeyecek şekilde düzenleyin. Bunu map.getUiSettings () aracılığıyla yapabilirsiniz. setMyLocationButtonEnabled (false);

3) Sağlanan düğmenin ne yaptığını taklit etmek için yeni düğmenizin tıklamasını yapın. Örneğin mMap.setMyLocationEnabled (...); ve haritayı geçerli konuma kaydırın.

Umarım yardımcı olur ya da birisinin sizin için daha basit bir çözümle uzun süre gelmesini umar ;-)


BTW ne olursa olsun CommonsWare'e katılıyorum, haritayı bir reklamla örtmeyin en iyisi!
Ryan

14

Yukarıda zaten açıklanmıştı, fabLouis'in cevabına sadece küçük bir ek. Harita görünümünüzü SupportMapFragment'dan da alabilirsiniz.

        /**
         * Move the button
         */
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().
                findFragmentById(R.id.map);
        View mapView = mapFragment.getView();
        if (mapView != null &&
                mapView.findViewById(1) != null) {
            // Get the button view
            View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2);
            // and next place it, on bottom right (as Google Maps app)
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
                    locationButton.getLayoutParams();
            // position on right bottom
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
            layoutParams.setMargins(0, 0, 30, 30);
        }

3
Bu satır - ((Görüntüle) mapView.findViewById (1) .getParent ()). FindViewById (2); bana bir hata veriyordu - 1 ve 2 tamsayıda "Beklenen ID türü kaynak" sonra bunu şu şekilde çözdüm ((View) mapView.findViewById (Integer.parseInt ("1")). getParent ()). findViewById (Integer .parseInt ("2"));
Zohab Ali

14

Başkalarının kullandığı bu sihirli görünüm kimliklerini görmekten hoşlanmıyorum, MapViewçocuklarını bulmak için etiketleri kullanmanızı öneririm .

Konumum düğmesini Yakınlaştırma kontrollerinin üzerine yerleştirmek için benim çözümüm .

// Get map views
View location_button =_mapView.findViewWithTag("GoogleMapMyLocationButton");
View zoom_in_button = _mapView.findViewWithTag("GoogleMapZoomInButton");
View zoom_layout = (View) zoom_in_button.getParent();

// adjust location button layout params above the zoom layout
RelativeLayout.LayoutParams location_layout = (RelativeLayout.LayoutParams) location_button.getLayoutParams();
location_layout.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
location_layout.addRule(RelativeLayout.ABOVE, zoom_layout.getId());

3
Aynı şeyi pusula için nasıl yapacağını merak eden herkes için etiket GoogleMapCompass.
zyamys

1
Hey Cord, bunu nasıl yapacağını hatırlıyor musun bilmiyorum ama mapview etiketlerinin listesini nerede bulduğunu hatırlıyor musun? Başka şeyler de taşımak istiyorum ve insanların kullandığı diğer kalıplardan gerçekten hoşlanmıyorum.
Randy

2
@Randy MapView (FrameLayout) alt görünümlerini yineleyin ve bunları almak için etiketleri günlüğe kaydedin. Buraya bakın (
Kotlin'de

@ElegyD Teşekkürler !!
Randy

12

Aşağıdaki kodu kullanarak konum düğmesini görünümün sağ alt köşesine yeniden konumlandırarak harita parçamdaki bu sorunu çözdüm, işte Haritalar Activity.java: -

bu kod satırlarını onCreate () yöntemine ekleyin,

 SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapView = mapFragment.getView();
        mapFragment.getMapAsync(this);

ve işte onMapReady () kodu: -

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

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

            if (mapView != null &&
                    mapView.findViewById(Integer.parseInt("1")) != null) {
                // Get the button view
                View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
                // and next place it, on bottom right (as Google Maps app)
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
                        locationButton.getLayoutParams();
                // position on right bottom
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
                layoutParams.setMargins(0, 0, 30, 30);
            }

        }

Umarım bu sorununuzu çözer. Teşekkürler.


Teşekkürler benim için çalıştı. Sadece ALIGN_PARENT_BOTTOM ile deniyordum ama benim için işe yaramadı. bu nasıl çalışıyor?
Sharath Weaver

mapView = (Görüntüle) mapFragment.getView () gibi yayınlamanız (görüntülemeniz) gerekir;
Md Shihab Uddin

9

Önce Google Harita Görünümünü edinin:

 View mapView = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getView();

Ardından MyLocation düğmesini bulun (Android Studio hata ayıklayıcısından gelen id'ler):

 View btnMyLocation = ((View) mapView.findViewById(1).getParent()).findViewById(2);

Son olarak, MyLocation düğmesi için yeni RelativeLayout parametreleri ayarlayın (bu durumda ebeveyni sağa + ortaya dikey olarak hizalayın):

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(80,80); // size of button in dp
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
    params.setMargins(0, 0, 20, 0);
    btnMyLocation.setLayoutParams(params);

Boom! Şimdi istediğiniz gibi hareket ettirebilirsiniz;)


3
Bu satır - ((Görüntüle) mapView.findViewById (1) .getParent ()). FindViewById (2); bana bir hata veriyor - 1 ve 2 tamsayısında "Beklenen kaynak türü kimliği".
zookastos

3
Bunu deneyin - View btnMyLocation = ((Görüntüle) mapView.findViewById (Integer.parseInt ("1")). GetParent ()). FindViewById (Integer.parseInt ("2"));
Silambarasan Poonguti

@Nalin Hata üzerinde Alt-Enter yaparsanız, denetimi devre dışı bırakmak için bir seçenek vardır (örn. Yöntem için).
Richard Le Mesurier

8

Aşağıdaki yönteme bakın. SupportMapFragment'ı genişleten bir sınıfın içinde yaşar. Düğmenin kap görünümünü alır ve yatay olarak ortalanmış olarak altta görüntüler.

/**
     * Move my position button at the bottom of map
     */
    private void resetMyPositionButton()
    {
        //deep paths for map controls
        ViewGroup v1 = (ViewGroup)this.getView();
        ViewGroup v2 = (ViewGroup)v1.getChildAt(0);
        ViewGroup v3 = (ViewGroup)v2.getChildAt(0);
        ViewGroup v4 = (ViewGroup)v3.getChildAt(1);

        //my position button
        View position =  (View)v4.getChildAt(0);

        int positionWidth = position.getLayoutParams().width;
        int positionHeight = position.getLayoutParams().height;

        //lay out position button
        RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight);
        int margin = positionWidth/5;
        positionParams.setMargins(0, 0, 0, margin);
        positionParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        positionParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        position.setLayoutParams(positionParams);
    }

bana java.lang.ClassCastException veriyor: maps.af.q android.view.ViewGroup'a dönüştürülemiyor
Nayanesh Gupte

8

Yalnızca konum göstergesinin etkinleştirilmesini (mavi nokta) istiyorsanız, ancak varsayılan Konumum düğmesine ihtiyacınız yoksa:

mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);

Bu şekilde, bunun gibi garip şeyler olmadan da istediğiniz yere kendi düğmenizi çizebilirsiniz mapView.findViewById(1).getParent()).


Çok teşekkür ederim
Nacho Zullo

2

Ben de aynı sorunu yaşadım. Düğmeyi görüntülemek için kullanılan görünümü tanımlamak için Hierarchy Viewer'ı kullandım ve değiştirdim. Çok huysuz, biliyorum ama farklı bir yol bulamadım.


1
Lütfen çözümünüzü paylaşır mısınız?
clauziere

2

Bunu çalıştırmak biraz zordu. Ama hallettim ve süreç içinde yakınlaştırma düğmelerini de hareket ettirmeye başladım. İşte tam kodum:

package com.squirrel.hkairpollution;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.LatLng;

public class MySupportMapFragment extends SupportMapFragment {

private static final String TAG = HKAirPollution.TAG;

public MySupportMapFragment() {
    return;
}

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
    Log.v(TAG, "In overridden onCreateView.");
    View v = super.onCreateView(arg0, arg1, arg2);
    Log.v(TAG, "Initialising map.");
    initMap();
    return v;
}

@Override
 public void onViewCreated (View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    resetButtons();
}

private void initMap(){
    UiSettings settings = getMap().getUiSettings();
    settings.setAllGesturesEnabled(true);
    settings.setMyLocationButtonEnabled(true);
    LatLng latLong = new LatLng(22.320542, 114.185715);
    getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(latLong,11));
}


/**
 * Move my position button at the bottom of map
 */
private void resetButtons()
{
    // Get a reference to the zoom buttons and the position button.
    ViewGroup v1 = (ViewGroup)this.getView();
    ViewGroup v2 = (ViewGroup)v1.getChildAt(0);
    ViewGroup v3 = (ViewGroup)v2.getChildAt(0);
    ViewGroup v4 = (ViewGroup)v3.getChildAt(1);

    // The My Position button
    View position =  (View)v4.getChildAt(0);
    int positionWidth = position.getLayoutParams().width;
    int positionHeight = position.getLayoutParams().height;

    // Lay out the My Position button.
    RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight);
    int margin = positionWidth/5;
    positionParams.setMargins(0, 0, 0, margin);
    positionParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
    positionParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    position.setLayoutParams(positionParams);

    // The Zoom buttons
    View zoom = (View)v4.getChildAt(2);
    int zoomWidth = zoom.getLayoutParams().width;
    int zoomHeight = zoom.getLayoutParams().height;

    // Lay out the Zoom buttons.
    RelativeLayout.LayoutParams zoomParams = new RelativeLayout.LayoutParams(zoomWidth, zoomHeight);
    zoomParams.setMargins(0, 0, 0, margin);
    zoomParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
    zoomParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    zoom.setLayoutParams(zoomParams);
} 
}

2

Bu sorunu çözmenin bir yolu. Varsayılan düğmeyi silin ve kendinizinkini oluşturun. OnCreate deyiminde sonrakini ekleyin:

GoogleMap mMap = ((MapView) inflatedView.findViewById(R.id.mapview)).getMap();
LocationManager locationManager =    
(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(provider, 2000, 1,  this);

mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(false); // delete default button

Imagebutton imgbtn = (ImageButton) view.findViewById(R.id.imgbutton); //your button
imgbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new    
LatLng(location.getLatitude(),     
location.getLongitude()), 15));
        }
    });

2

bu kodu dene

private void resetMyPositionButton()
{
    Fragment fragment = ( (SupportMapFragment) getSupportFragmentManager().findFragmentById( R.id.map ) );
    ViewGroup v1 = (ViewGroup) fragment.getView();
    ViewGroup v2 = (ViewGroup)v1.getChildAt(0);
    ViewGroup v3 = (ViewGroup)v2.getChildAt(2);
    View position =  (View)v3.getChildAt(0);
    int positionWidth = position.getLayoutParams().width;
    int positionHeight = position.getLayoutParams().height;

    //lay out position button
    RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight);
    int margin = positionWidth/5;
    positionParams.setMargins(margin, 0, 0, margin);
    positionParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
    positionParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
    position.setLayoutParams(positionParams);
}

2

Bu düğme haritanın sol tarafına taşındıDaha önce, eski düğme kuralını kaldırabiliyordunuz:

@Override
public void onMapReady(final GoogleMap googleMap) {
    this.map = googleMap;
    // Show location button
    View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
    RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
    // position on right bottom
    Log.l(Arrays.toString(rlp.getRules()), L.getLogInfo());
    int[] ruleList = rlp.getRules();
    for (int i = 0; i < ruleList.length; i ++) {
        rlp.removeRule(i);
    }
    Log.l(Arrays.toString(rlp.getRules()), L.getLogInfo());
    //Do what you want to move this location button:
    rlp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
    rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
}

0

Aşağıdaki yaklaşımı kullanabilirsiniz:

    View myLocationParent = ((View) getView().findViewById(1).getParent());
    View myLocationParentParent = ((View) myLocationParent.getParent());

    // my position button

    int positionWidth = myLocationParent.getLayoutParams().width;
    int positionHeight = myLocationParent.getLayoutParams().height;

    // lay out position button
    FrameLayout.LayoutParams positionParams = new FrameLayout.LayoutParams(
            positionWidth, positionHeight);
    positionParams.setMargins(0, 100, 0, 0);

    myLocationParent.setLayoutParams(positionParams);

((View) getView (). findViewById (1) .getParent ()); konum görünümünü alacak mıydı?
reidisaki

Android Studio hata ayıklayıcısında pek çok harika şey var;)
Roman

0

Android parçama bir satır ekledim : layout_marginTop = "? Attr / actionBarSize" Bana yardımcı oldu


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.