Змініть позицію кнопки "Моє місцезнаходження" API Карт Google


84

Я використовую Google Maps Android API v2, і мені потрібен спосіб, щоб згадати позицію кнопки "Моє місцезнаходження".

Я отримую кнопку "Моє місцезнаходження" так:

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

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

2
AFAIK, ти ні. Ви налаштовуєте свій макет таким чином, щоб реклама не перекривала карту.
CommonsWare

5
Ви розглядали метод setPadding () GoogleMap? Див .: developers.google.com/maps/documentation/android/…
Ігор Ганапольський

Відповіді:


70

Просто використовуйте GoogleMap.setPadding (ліворуч, зверху, праворуч, знизу), що дозволяє вказати частини карти, які можуть бути затемнені іншими видами. Налаштування відступів змінює стандартні елементи керування картою, а оновлення камери використовуватиме заповнену область.

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


6
Це найкраща відповідь. findById (1) є жахливим рішенням
pablobaldez

Абсолютно чітка та найкраща практика відповіді. Любіть це.
josefdlange

3
Добре працює, якщо клацнути кнопку мілокації в нижньому правому куті, але, як ви говорите, це псує оновлення камери. Як це вирішити? На сьогодні моя камера завжди бачить нижню частину екрана як центр. Чи додаєте ви половину висоти екрану до камери під час обчислення речей?
дозрівач

4
Я віддаю перевагу mapView.findViewWithTag ("GoogleMapMyLocationButton"); рішення нижче.
ayvazj

3
Зверніть увагу, що setPaddingмає безліч інших побічних ефектів, які можуть бути небажаними. Найголовніше, це змінює положення екрана цілі камери.
zyamys

87

Ви можете отримати кнопку "Моє місцезнаходження" та перемістити її, наприклад:

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
Привіт @fabLouis, Перш за все, я хотів подякувати вам. Ваш код перемістив LocationButton. Мені просто цікаво, як ви зрозуміли ідентифікатор цієї кнопки? Чи можете ви пояснити більше про це mapView.findViewById(1).getParent()).findViewById(2);? Ще раз спасибі, SH
Swan

4
через налагоджувач Android Studio
fabLouis

1
якщо ви зробите це, Android Studio скаже "очікуваний ресурс ідентифікатора типу"
inmyth

11
@inmyth Навіть у мене така ж помилка, але я проаналізував 1 і 2 за допомогою класу Integer. findViewById (Integer.parseInt ("1")). Якщо ви знайшли краще рішення, дайте мені знати.
Харша,

2
хмм як RelativeLayout.ALIGN_PARENT_TOPі RelativeLayout.ALIGN_PARENT_BOTTOMрівно внизу праворуч?
user2968401

15

Це може бути не найкращим рішенням, але ви можете розмістити власну кнопку над картою і впоратися з цим самостійно. Це займе наступне: -

1) Помістіть карту у frameLayout і додайте свою кнопку зверху. Напр

<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) Відредагуйте налаштування інтерфейсу карт, щоб кнопка не відображалася під час виклику setMyLocationEnabled (істина). Ви можете зробити це за допомогою map.getUiSettings (). setMyLocationButtonEnabled (хибне);

3) Обробляйте натискання нової кнопки, щоб імітувати, що робить кнопка, що додається. Наприклад, виклик mMap.setMyLocationEnabled (...); і перемістіть карту до поточного місця.

Сподіваємось, що допоможе, або сподіваємось, що хтось довго шукає простішого рішення для вас;


ДО ВСЬОГО, що того варте, я погоджуюсь з CommonsWare, не закривайте карту рекламою, найкраще!
Райан

14

Це вже було пояснено вище. Лише невелике доповнення до відповіді fabLouis. Ви також можете отримати вигляд карти з SupportMapFragment.

        /**
         * 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
Цей рядок - ((Переглянути) mapView.findViewById (1) .getParent ()). FindViewById (2); давав мені помилку - "Очікуваний ресурс ідентифікатора типу" на цілому 1 і 2, то я вирішив це так ((Перегляд) mapView.findViewById (Integer.parseInt ("1")). getParent ()). findViewById (Ціле число .parseInt ("2"));
Зохаб Алі

14

Мені неприємно бачити ці ідентифікатори чарівного виду, якими користуються інші, я пропоную використовувати теги для пошуку MapViewдітей.

Ось моє рішення для розміщення кнопки « Моє місце розташування » над елементами керування масштабуванням .

// 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
Для тих, хто задається питанням, як зробити те саме для компаса, тег є GoogleMapCompass.
zyamys

1
Гей, Корд, я не знаю, чи пам’ятаєш ти, як це зробити, але чи пам’ятаєш, де ти знайшов список тегів mapview? Я прагну перемістити деякі інші речі, і мені дуже не подобаються інші моделі, які використовують люди.
Ренді

2
@Randy Переглядайте підпрогляди MapView (FrameLayout) та реєструйте теги, щоб отримати їх. Дивіться тут (Написано в
Котліні

@ElegyD Дякую !!
Ренді

12

Я вирішив цю проблему у своєму фрагменті карти, перемістивши кнопку розташування в правий нижній кут зору, використовуючи код нижче, ось мій Activity Maps.java:

додати ці рядки коду в метод onCreate (),

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

і ось код onMapReady (): -

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

        }

Сподіваюся, це вирішить вашу проблему. Дякую.


Подяка спрацювала на мене. Я намагався лише з ALIGN_PARENT_BOTTOM, але не працював у мене. як це працює?
Sharath Weaver

вам потрібно кинути (переглянути), як mapView = (переглянути) mapFragment.getView ();
Md Shihab Uddin

9

Спочатку отримайте Google Map View:

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

Потім знайдіть кнопку MyLocation (ідентифікатори з налагоджувача Android Studio):

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

Нарешті, просто встановіть нові параметри RelativeLayout для кнопки MyLocation (у цьому випадку вирівняйте батьківський правий + центр по вертикалі):

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

Бум! Тепер ви можете переміщати його як завгодно;)


3
Цей рядок - ((Переглянути) mapView.findViewById (1) .getParent ()). FindViewById (2); видає мені помилку - "Очікуваний ресурс ідентифікатора типу" на 1 і 2 ціле число.
zookastos

3
Спробуйте це - Переглянути btnMyLocation = ((Переглянути) mapView.findViewById (Integer.parseInt ("1")). GetParent ()). FindViewById (Integer.parseInt ("2"));
Silambarasan Poonguti

@Nalin Існує можливість, якщо Alt-Enter на помилці вимкнути перевірку (наприклад, для методу).
Річард Ле Мессюр'є

8

Див. Метод нижче. Він живе всередині класу, який розширює SupportMapFragment. Він отримує вигляд контейнера для кнопки та відображає його внизу, по центру горизонтально.

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

це дає мені java.lang.ClassCastException: maps.af.q не можна передати на android.view.ViewGroup
Nayanesh Gupte

8

Якщо ви просто хочете, щоб увімкнено вказівку місцезнаходження (синя крапка), але вам не потрібна кнопка Моє місце за замовчуванням:

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

Таким чином, ви також можете намалювати власну кнопку, де хочете, без таких дивних речей mapView.findViewById(1).getParent()).


Щиро дякую
Начо Зулло,

2

У мене була та сама проблема. Я в кінцевому підсумку використовував Hierarchy Viewer для ідентифікації подання, що використовується для відображення кнопки, і маніпулював ним. Дуже хакі, я знаю, але не міг зрозуміти по-іншому.


1
Не могли б ви поділитися своїм рішенням, будь ласка.
clauziere

2

Це було трохи боротьби, щоб отримати цю роботу. Але я це зробив, і в процесі також почав рухати кнопки масштабування. Ось мій повний код:

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

Один із способів вирішити цю проблему. Видаліть кнопку за замовчуванням і створіть свою власну. У заяві OnCreate додайте наступне:

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

спробуйте цей код

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

Цю кнопку було переміщено в ліву частину картиРаніше ви могли видалити старе правило кнопки:

@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

Ви можете використовувати наступний підхід:

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

звідки ви дізналися, що ((Перегляд) getView (). findViewById (1) .getParent ()); отримаєте вигляд розташування?
reidisaki

У налагоджувачі Android Studio багато чудового матеріалу;)
Роман

0

Я додав рядок до свого фрагмента android: layout_marginTop = "? Attr / actionBarSize" Це мені допомогло


0

використовуйте його для розташування внизу праворуч

map.setMyLocationEnabled(true); 
map.setPadding(0,1600,0,0);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.