Google MapsAPIの「現在地」ボタンの位置を変更する


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 2013年

5
GoogleMapのsetPadding()メソッドを見たことがありますか?参照:developers.google.com/maps/documentation/android/...
IgorGanapolsky

回答:


70

GoogleMap.setPadding(left、top、right、bottom)を使用するだけで、他のビューによって隠されている可能性のあるマップの部分を示すことができます。パディングを設定すると、標準のマップコントロールが再配置され、カメラの更新ではパディングされた領域が使用されます。

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


6
これが最良の答えです。findById(1)はひどい解決策です
pablobaldez 2016年

絶対的に最も明確でベストプラクティスの答え。大好きです。
josefdlange 2016年

3
右下隅にマイロケーションボタンを配置するのに適していますが、あなたが言うように、カメラの更新を台無しにします。それを解決する方法は?今のところ、私のカメラは常に画面の下部を中央として認識しています。計算時に画面の半分の高さをカメラに追加しますか?
リパー2016年

4
mapView.findViewWithTag( "GoogleMapMyLocationButton");が好きです。以下の解決策。
ayvazj 2017年

3
setPaddingは、望ましくない可能性のある他の多くの副作用があることに注意してください。最も重要なことは、カメラターゲットの画面位置を変更することです。
zyamys 2017年

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を動かしました。そのボタンのIDをどのように把握したのか興味がありますか?これについて詳しく説明していただけますかmapView.findViewById(1).getParent()).findViewById(2);。もう一度ありがとう、SH
白鳥

4
Android Studioデバッガー経由
fabLouis 2014

1
これを行うと、Android Studioは「タイプIDの予想されるリソース」と表示します
inmyth 2015

11
@inmyth同じエラーが発生しましたが、整数クラスを使用して1と2を解析しました。findViewById(Integer.parseInt( "1"))。あなたがより良い解決策を見つけたなら、私に知らせてください。
ハーシャ2015年

2
うーんどのようにRelativeLayout.ALIGN_PARENT_TOPしてRelativeLayout.ALIGN_PARENT_BOTTOM右下に等しいですか?
user2968401 2015

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)マップのUI設定を編集して、setMyLocationEnabled(true)を呼び出したときにボタンが表示されないようにします。これは、map.getUiSettings()を介して行うことができます。setMyLocationButtonEnabled(false);

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
この行-((View)mapView.findViewById(1).getParent())。findViewById(2); 私にエラーを与えていました-1と2の整数で「タイプIDの予期されたリソース」そして私はそれをこのように解決しました((View)mapView.findViewById(Integer.parseInt( "1"))。getParent())。findViewById(Integer .parseInt( "2"));
Zohab Ali 2017

14

他の人が使用しているこれらのマジックビューIDを見るのは好きではありません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 2017

1
コードさん、これを行う方法を覚えているかどうかはわかりませんが、mapviewタグのリストをどこで見つけたか覚えていますか?私は他のものを動かそうと思っています、そして私は人々が使っている他のパターンを本当に嫌います。
ランディ

2
@Randy MapView(FrameLayout)のサブビューを反復処理し、タグをログに記録して取得します。こちらをご覧ください(Kotlinで作成)
ElegyD 2017年

@ElegyDありがとうございます!!
ランディ

12

以下のコードを使用して、位置ボタンをビューの右下隅に再配置することで、マップフラグメントのこの問題を解決しました。これが、Maps Activity.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 2017

mapView =(View)mapFragment.getView();のようにキャスト(ビュー)する必要があります。
Md ShihabUddin18年

9

まず、Googleマップビューを取得します。

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

次に、MyLocationボタン(Android StudioデバッガーからのID)を見つけます。

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

最後に、MyLocationボタンの新しいRelativeLayoutパラメータを設定します(この場合、親を右に揃え、中央を垂直に揃えます)。

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
この行-((View)mapView.findViewById(1).getParent())。findViewById(2); 1と2の整数に「タイプIDの予期されたリソース」というエラーが表示されます。
zookastos 2015

3
これを試してください-ViewbtnMyLocation =((View)mapView.findViewById(Integer.parseInt( "1"))。getParent())。findViewById(Integer.parseInt( "2"));
Silambarasan Poonguti 2015

@NalinエラーでAlt-Enterを押してチェックを無効にするオプションがあります(メソッドなど)。
リチャードルメスリエ2015年

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 2013

8

位置表示(青い点)を有効にしたいが、デフォルトの[現在地]ボタンは必要ない場合:

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

このようにして、このような奇妙なものなしで、必要な場所に独自のボタンを描画することもできますmapView.findViewById(1).getParent())


どうもありがとうございました
Nacho Zullo

2

私も同じ問題を抱えていました。結局、階層ビューアを使用して、ボタンの表示に使用されるビューを識別し、それを操作しました。非常にハッキーだと私は知っていますが、別の方法を理解することはできませんでした。


1
ソリューションを共有していただけませんか。
clauziere 2013

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

この問題に対処する1つの方法。デフォルトのボタンを削除して、独自のボタンを作成します。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);

((View)getView()。findViewById(1).getParent());をどうやって知ったのですか?ロケーションビューを取得しますか?
reidisaki 2014

Android Studioデバッガーには素晴らしいものがたくさんあります;)
Roman

0

フラグメントに行を追加しました android:layout_marginTop = "?attr / actionBarSize" それは私を助けました


0

これを右下の場所に使用します

map.setMyLocationEnabled(true); 
map.setPadding(0,1600,0,0);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.