Google मैप्स एपीआई के "मेरा स्थान" बटन की स्थिति बदलें


84

मैं Google मैप्स 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, आप नहीं। आप अपने लेआउट को ऐसे समायोजित करते हैं कि विज्ञापन मानचित्र को ओवरलैप न करे।
कॉमन्सवेयर

5
क्या आपने GoogleMap के सेटपैडिंग () विधि को देखा है? देखें: Developers.google.com/maps/documentation/android/…
इगोरगानापोलस्की

जवाबों:


70

बस GoogleMap.setPadding (बाएं, ऊपर, दाएं, नीचे) का उपयोग करें, जो आपको मानचित्र के कुछ हिस्सों को इंगित करने की अनुमति देता है जो अन्य विचारों द्वारा अस्पष्ट हो सकते हैं। पैडिंग को मानक मानचित्र नियंत्रणों को फिर से पोजिशन करना, और कैमरा अपडेट पैडेड क्षेत्र का उपयोग करेगा।

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


6
यह सबसे अच्छा जवाब है। findById (1) एक भयानक समाधान है
पाब्लोकिडेज़

पूर्ण स्पष्ट और सर्वोत्तम अभ्यास उत्तर। इसे प्यार करना।
josefdlange

3
नीचे दाहिने हाथ के कोने में mylocation बटन लगाने के लिए अच्छी तरह से काम करता है, लेकिन जैसा कि आप कहते हैं कि यह कैमरा अपडेट को गड़बड़ कर देता है। कैसे हल करें? अब तक मेरा कैमरा हमेशा स्क्रीन के निचले भाग को केंद्र के रूप में देखता है। क्या आप सामान की गणना करते समय स्क्रीन की आधी ऊंचाई को कैमरे में जोड़ते हैं?
राइपर

4
मैं mapView.findViewWithTag ("GoogleMapMyLocationButton") पसंद करता हूं; नीचे समाधान।
आयुवज

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);। धन्यवाद फिर से, एसएच
हंस

4
Android स्टूडियो डिबगर के माध्यम से
fabLouis

1
यदि आप ऐसा करते हैं, तो एंड्रॉइड स्टूडियो "टाइप आईडी का अपेक्षित संसाधन"
15

11
@inmyth यहां तक ​​कि मुझे एक ही त्रुटि मिली, लेकिन मैंने 1 और 2 को इंटेगर क्लास का उपयोग करके पार्स किया। findViewById (Integer.parseInt ( "1"))। यदि आपको बेहतर समाधान मिला होता तो मुझे बताएं।
हर्षा

2
हम्म कैसे RelativeLayout.ALIGN_PARENT_TOPऔर RelativeLayout.ALIGN_PARENT_BOTTOMबराबर नीचे सही है?
user2968401

15

यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन आप अपने स्वयं के बटन को मानचित्र पर रख सकते हैं और इसे स्वयं संभाल सकते हैं। यह निम्नलिखित होगा: -

1) मानचित्र को फ्रेमलेआउट में रखें और शीर्ष पर अपना बटन जोड़ें। उदाहरण के लिए

<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) मैप्स यूआई सेटिंग्स को संपादित करें ताकि बटन तब दिखाई दे जब आप सेटम्यलोकेशन सक्षम (सच) कहते हैं। आप इसे map.getUiSettings () के माध्यम से कर सकते हैं। (गलत) setMyLocationButtonEnabled;

3) आपूर्ति बटन क्या करता है अनुकरण करने के लिए अपने नए बटन के क्लिक को संभालें। जैसे कॉल mMap.setMyLocationEnabled (...); और मानचित्र को वर्तमान स्थान पर पैन करें।

आशा है कि मदद करता है, या आशा है कि किसी को आप के लिए एक सरल समाधान के साथ एक लंबा आता है ;-)


BTW के लिए क्या यह लायक है मैं कॉमन्सवेयर से सहमत हूं, एक विज्ञापन के साथ मानचित्र को कवर न करें सबसे अच्छा होगा!
रयान

14

यह पहले से ही ऊपर समझाया गया है। बस एक छोटे से जोड़ के साथ फेबुलिस के जवाब। हो सकता है कि आपको अपना मानचित्र दृश्य 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
यह पंक्ति - (देखें) मुझे एक त्रुटि दे रहा था - 1 और 2 पूर्णांक पर "टाइप आईडी का अपेक्षित संसाधन" तब मैंने इसे इस तरह से हल किया ((देखें) mapView.findViewById (Integer.parseInt ("1"))। getPentent ())। 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
हे कॉर्ड, मुझे नहीं पता कि आपको यह याद है कि यह कैसे करना है, लेकिन क्या आपको याद है कि आपको मैपव्यू टैग की सूची कहां मिली है? मैं कुछ अन्य सामानों को इधर-उधर ले जाना चाह रहा हूं और मैं वास्तव में उन अन्य पैटर्नों को नापसंद करता हूं जिनका लोग उपयोग कर रहे हैं।
रैंडी

2
@ रंडी मैपव्यू (फ्रेमलेयआउट) के साक्षात्कार के माध्यम से Iterate करें और उन्हें प्राप्त करने के लिए टैग को लॉग इन करें। यहां देखें (
कोटलिन

@ElegyD धन्यवाद !!
रैंडी

12

मैंने नीचे दिए गए कोड का उपयोग करके अपने स्थान बटन को दाईं ओर नीचे कोने में स्थित करके अपने मानचित्र के टुकड़े में इस समस्या को हल किया, यहां मेरी मैप्स गतिविधि है। 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 के साथ प्रयास कर रहा था, लेकिन मेरे लिए काम नहीं किया। यह कैसे काम कर रहा है?
शरथ वीवर

आपको mapView की तरह कास्ट (दृश्य) करना होगा = (देखें) mapFragment.getView ();
एमडी शिहाब उद्दीन

9

सबसे पहले, Google मानचित्र दृश्य प्राप्त करें:

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

फिर MyLocation बटन ढूंढें (Android स्टूडियो डीबगर से आईडी):

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

अंत में, MyLocation बटन के लिए नए RelativeLayout params सेट करें (इस मामले में पैरेंट राइट + सेंटर को अलाइन करें):

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
यह पंक्ति - (देखें) मुझे एक त्रुटि दे रहा है - 1 और 2 पूर्णांक पर "टाइप आईडी का अपेक्षित संसाधन"।
ज़ूकास्टोस

3
इसे आज़माएं - देखें btnMyLocation = ((देखें) mapView.findViewById (Integer.parseInt ("1"))। GetParent ())। FindViewById (Integer.parseInt ("2"));
सिलंबरासन पूनगुटी

@ नलिन एक विकल्प है यदि आप चेक को निष्क्रिय करने के लिए त्रुटि पर Alt- दर्ज करते हैं (उदाहरण के लिए विधि)।
रिचर्ड ले मेसुरियर

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 में नहीं लाया जा सकता
नयनेश गुप्ते

8

यदि आप केवल स्थान संकेत सक्षम करना चाहते हैं (नीली डॉट), लेकिन डिफ़ॉल्ट की आवश्यकता नहीं है मेरा स्थान बटन:

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

इस तरह से आप अपना खुद का बटन भी खींच सकते हैं जहाँ आप इस तरह के अजीब सामान के बिना चाहते हैं mapView.findViewById(1).getParent())


बहुत बहुत धन्यवाद
नाचो ज़ुल्लो

2

मुझे भी यही समस्या थी। मैंने बटन को प्रदर्शित करने के लिए उपयोग किए गए दृश्य की पहचान करने और उसे हेरफेर करने के लिए पदानुक्रम व्यूअर का उपयोग करके समाप्त किया। बहुत हैकी, मुझे पता है, लेकिन एक अलग तरीके का पता नहीं लगा सका।


1
क्या आप अपना समाधान साझा कर सकते हैं।
क्लूज़िएर

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 ()); स्थान दृश्य मिलेगा?
रिदिसाकी

एंड्रॉइड स्टूडियो डिबगर में बहुत सारे शानदार सामान हैं;)
रोमन

0

मैंने अपने टुकड़े Android के लिए एक पंक्ति जोड़ी : लेआउट_marginTop = "? Attr / actionBarSize" इसने मेरी मदद की


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.