दिलचस्प पोस्ट
मैं अपने मूल कंटेनर के साथ एसटीवीपी पैमाने कैसे बना सकता हूं? निंजा 2 + (और मैं अपने मॉड्यूल की व्यवस्था कैसे करूँ) के साथ इंजेक्शन कहाँ करूँ? मैं "नेटवर्क" समय कैसे प्राप्त कर सकता हूं, ("स्वचालित" सेटिंग से "नेटवर्क-प्रदान किए गए मानों का उपयोग करें" कहलाता है), फोन पर समय नहीं है? एंड्रॉइड ऐप के लिए आप एक पारदर्शी डेमो स्क्रीन कैसे बना सकते हैं? अगर / अन्य बयानों के अंदर कार्य घोषणाएं हैं? UI- राउटर का उपयोग करके पेज शीर्षक सेट करें NumPy असाइनमेंट में डुप्लिकेट इंडेक्सों का प्रबंधन कैसे एक git उर्फ ​​के अंदर सीधे बाश स्क्रिप्ट एम्बेड करें पूरी तरह से एंड्रॉइड स्टूडियो की स्थापना रद्द करने के लिए कैसे? क्रॉस-ऑप संसाधन साझाकरण (सीओआरएस) को एनोड.जेएस पर एक्सप्रेस.जेएस ढांचे में कैसे सक्षम करें मैं सफारी में एक बाहरी लिंक कैसे खोल सकता हूं, जो ऐप के UIWebView नहीं है? सी # नई टी बनाएं () संकलन समय और रनटाइम कास्टिंग सी # फिबोनैकी अनुक्रम की कम्प्यूटेशनल जटिलता स्विफ्ट में एक अलग व्यू नियंत्रक से एक TableView में डेटा को पुनः लोड कैसे करें

Google मानचित्र एंड्रॉइड एपीआई v2 – इंटरैक्टिव इन्फोविंडो (जैसे मूल एंड्रॉइड गूगल मैप्स में)

मैं नए Google मैप्स एपीआई v2 के साथ एक मार्कर पर एक क्लिक के बाद कस्टम InfoWindow बनाने की कोशिश कर रहा हूं। मैं चाहता हूं कि यह Google द्वारा मूल नक्शे के अनुप्रयोगों में दिखता है इस कदर:

उदाहरण छवि

जब मेरे अंदर InfoWindow है, तो यह काम नहीं कर रहा है – पूरे InfoWindow और सिर्फ InfoWindow नहीं है मैंने पढ़ा है कि ऐसा इसलिए है क्योंकि कोई View स्वयं नहीं है, लेकिन यह स्नैपशॉट है, इसलिए अलग-अलग आइटम एक-दूसरे से अलग नहीं किए जा सकते हैं

संपादित करें: प्रलेखन में ( डिस्को एस 2 के लिए धन्यवाद):

जैसा कि सूचना खिड़कियों के पिछले अनुभाग में उल्लिखित है, एक जानकारी विंडो एक लाइव व्यू नहीं है, बल्कि दृश्य को नक्शे पर एक छवि के रूप में प्रदान किया जाता है। नतीजतन, आप जो भी श्रोताओं को इस दृश्य पर सेट करते हैं वे अवहेलना करते हैं और आप दृश्य के विभिन्न हिस्सों पर क्लिक ईवेंट के बीच अंतर नहीं कर सकते। आपको सलाह दी जाती है कि आप अपनी कस्टम जानकारी विंडो में इंटरैक्टिव घटकों – जैसे कि बटन, चेकबॉक्स या पाठ इनपुट को न रखें।

लेकिन अगर Google इसका इस्तेमाल करता है, तो इसे बनाने के लिए कोई रास्ता नहीं होना चाहिए क्या किसी को कोई ख़याल है?

वेब के समाधान से एकत्रित समाधान "Google मानचित्र एंड्रॉइड एपीआई v2 – इंटरैक्टिव इन्फोविंडो (जैसे मूल एंड्रॉइड गूगल मैप्स में)"

मैं इस समस्या के समाधान के लिए कोई भाग्य नहीं देख रहा था, इसलिए मुझे अपना अपना रोल करना पड़ा, जिसे मैं यहां आपके साथ साझा करना चाहता हूं। (कृपया मेरी खराब अंग्रेजी का माफ़ करें) (यह अंग्रेजी में एक और चेक व्यक्ति का उत्तर देने के लिए थोड़ा सा पागल है :-))

सबसे पहले मैंने कोशिश की थी कि एक अच्छा पुराने PopupWindow का उपयोग करें। यह बहुत आसान है – केवल एक को OnMarkerClickListener को OnMarkerClickListener और फिर मार्कर के ऊपर एक कस्टम PopupWindow दिखाएं। स्टैक ओवरफ्लो पर मौजूद कुछ अन्य लोगों ने इस समाधान का सुझाव दिया और यह पहली नज़र में वास्तव में बहुत अच्छा दिखता है। लेकिन इस समाधान के साथ समस्या तब दिखती है जब आप मानचित्र को चारों ओर ले जाना शुरू करते हैं। आपको PopupWindow किसी भी तरह से अपने आप को स्थानांतरित करना PopupWindow जो संभव है (कुछ टच इवेंट्स को सुनकर) लेकिन आईएमएचओ आप इसे पर्याप्त रूप से नहीं देख सकते हैं, खासकर कुछ धीमे डिवाइस पर। यदि आप इसे एक स्थान से दूसरे स्थान पर "छलांग" के समान सरल तरीके से करते हैं आप उन एनिमेशन को पॉलिश करने के लिए कुछ एनिमेशन का उपयोग भी कर सकते हैं, लेकिन इस तरह PopupWindow हमेशा "पीछे एक कदम" होगा, जहां वह मानचित्र पर होना चाहिए जो मुझे पसंद नहीं है।

इस बिंदु पर, मैं कुछ अन्य समाधान के बारे में सोच रहा था मुझे एहसास हुआ कि वास्तव में मुझे बहुत स्वतंत्रता की आवश्यकता नहीं है – मेरे कस्टम विचारों को उन सभी संभावनाओं के साथ दिखाने के लिए (जैसे कि एनिमेटेड प्रोग्रेस बार आदि)। मुझे लगता है कि एक अच्छा कारण है कि Google इंजीनियरों ने भी Google मानचित्र ऐप में इस तरह से ऐसा नहीं किया है। मुझे केवल जरूरत है एक InfoWindow पर बटन या दो जो एक दबाया स्थिति दिखाएगा और क्लिक किए जाने पर कुछ कार्रवाइयां ट्रिगर करेगा। इसलिए मैं एक और समाधान के साथ आया जो दो भागों में विभाजित है:

पहला भाग:
पहला भाग कुछ कार्यों को ट्रिगर करने के लिए बटन पर क्लिक पकड़ने में सक्षम होना है। मेरा विचार इस प्रकार है:

  1. InfoWindowAdapter में बनाए गए कस्टम जानकारी के लिए एक संदर्भ रखें।
  2. कस्टम MapFragment में MapFragment (या MapFragment ) को लपेटें (मेरा नाम MapWrapperLayout कहा जाता है)
  3. MapWrapperLayout के डिस्पैच MapWrapperLayout ओवरराइड करें और (यदि InfoWindow वर्तमान में दिखाया गया है) पहले मार्गनिर्देशित किया गया था, जो पहले बनाए गए InfoWindow के लिए मोशन एव्हेंट थे। अगर यह MotionEvents (जैसे कि आप InfoWindow आदि के अंदर किसी भी क्लिक करने योग्य क्षेत्र पर क्लिक नहीं करते हैं) का उपभोग नहीं करते हैं, तो (और उसके बाद) ईवेंट को MapWrapperLayout के सुपर क्लास में नीचे जाने दें ताकि अंत में इसे नक्शे पर वितरित किया जा सके।

यहां MapWrapperLayout का स्रोत कोड है:

 package com.circlegate.tt.cg.an.lib.map; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.Marker; import android.content.Context; import android.graphics.Point; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.RelativeLayout; public class MapWrapperLayout extends RelativeLayout { /** * Reference to a GoogleMap object */ private GoogleMap map; /** * Vertical offset in pixels between the bottom edge of our InfoWindow * and the marker position (by default it's bottom edge too). * It's a good idea to use custom markers and also the InfoWindow frame, * because we probably can't rely on the sizes of the default marker and frame. */ private int bottomOffsetPixels; /** * A currently selected marker */ private Marker marker; /** * Our custom view which is returned from either the InfoWindowAdapter.getInfoContents * or InfoWindowAdapter.getInfoWindow */ private View infoWindow; public MapWrapperLayout(Context context) { super(context); } public MapWrapperLayout(Context context, AttributeSet attrs) { super(context, attrs); } public MapWrapperLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * Must be called before we can route the touch events */ public void init(GoogleMap map, int bottomOffsetPixels) { this.map = map; this.bottomOffsetPixels = bottomOffsetPixels; } /** * Best to be called from either the InfoWindowAdapter.getInfoContents * or InfoWindowAdapter.getInfoWindow. */ public void setMarkerWithInfoWindow(Marker marker, View infoWindow) { this.marker = marker; this.infoWindow = infoWindow; } @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean ret = false; // Make sure that the infoWindow is shown and we have all the needed references if (marker != null && marker.isInfoWindowShown() && map != null && infoWindow != null) { // Get a marker position on the screen Point point = map.getProjection().toScreenLocation(marker.getPosition()); // Make a copy of the MotionEvent and adjust it's location // so it is relative to the infoWindow left top corner MotionEvent copyEv = MotionEvent.obtain(ev); copyEv.offsetLocation( -point.x + (infoWindow.getWidth() / 2), -point.y + infoWindow.getHeight() + bottomOffsetPixels); // Dispatch the adjusted MotionEvent to the infoWindow ret = infoWindow.dispatchTouchEvent(copyEv); } // If the infoWindow consumed the touch event, then just return true. // Otherwise pass this event to the super class and return it's result return ret || super.dispatchTouchEvent(ev); } } 

यह सब इन्फ्यूव्यू "लाइव" के अंदर के विचारों को फिर से बना देगा – ऑनक्लिक लिस्टनर आदि ट्रिगरिंग शुरू करेंगे।

दूसरा हिस्सा: शेष समस्या यह है, कि जाहिर है, आप स्क्रीन पर अपनी जानकारी विंडो के कोई भी UI परिवर्तन नहीं देख सकते। ऐसा करने के लिए आपको मैन्युअल रूप से मार्कर.शोइनफ़ोउंडिव कॉल करना होगा। अब, यदि आप अपनी जानकारी विंडो में कुछ स्थायी बदलाव करते हैं (जैसे कि अपने बटन का लेबल बदलना), यह काफी अच्छा है

लेकिन एक बटन दबाए गए राज्य या उस प्रकृति के कुछ दिखाते हुए अधिक जटिल है। पहली समस्या यह है कि (कम से कम) मैं InfoWindow को सामान्य बटन दबाए गए राज्य दिखाने में सक्षम नहीं था। यहां तक ​​कि अगर मैं एक लंबे समय के लिए बटन दबाया, यह सिर्फ स्क्रीन पर unpressed बने रहे। मेरा मानना ​​है कि यह ऐसा कुछ है जो नक्शा फ्रेमवर्क द्वारा नियंत्रित किया जाता है जो संभवतः सुनिश्चित करता है कि सूचना खिड़की में कोई क्षणिक स्थिति न दिखाए। लेकिन मैं गलत हो सकता था, मैंने इसे ढूँढ़ने की कोशिश नहीं की।

मैंने जो किया वह दूसरा बुरा हैक है – मैंने बटन पर एक OnTouchListener संलग्न किया और मैन्युअल रूप से इसे पृष्ठभूमि बदल दिया जब बटन को दबाया गया या दो कस्टम डिवायबल्स में रिलीज किया गया – एक सामान्य स्थिति में एक बटन के साथ और दबाए हुए राज्य में दूसरा। यह बहुत अच्छा नहीं है, लेकिन यह काम करता है :)। अब मैं स्क्रीन पर सामान्य दबाए गए राज्यों के बीच बटन स्विचिंग देखने में सक्षम था।

अभी भी एक आखिरी गड़बड़ी है – यदि आप बटन को बहुत तेज़ करते हैं, तो यह दबाया गया राज्य नहीं दिखाता है – यह अभी भी इसकी सामान्य स्थिति में रहता है (हालांकि क्लिक खुद ही निकाल दिया जाता है, इसलिए बटन "काम करता है")। कम से कम यह मेरे गैलेक्सी नेक्सस पर दिखाई देता है। तो मैंने जो आखिरी चीज की है, वह यह है कि मैंने दबाने वाले राज्य में बटन को थोड़ी देर दे दिया। यह भी बहुत बदसूरत है और मुझे यकीन नहीं है कि यह कुछ पुराने, धीमी डिवाइसों पर कैसे काम करेगा, लेकिन मुझे संदेह है कि नक्शा ढांचा खुद ही ऐसा कुछ करता है आप इसे स्वयं की कोशिश कर सकते हैं – जब आप संपूर्ण इन्फोविंडो पर क्लिक करते हैं, तो यह थोड़ी देर तक दबाए गए राज्य में रहता है, फिर सामान्य बटन (फिर से – मेरे फोन पर कम से कम)। और यह वास्तव में मूल Google मानचित्र ऐप पर भी काम करता है।

वैसे भी, मैंने खुद को एक कस्टम वर्ग लिखा था जो बटन राज्य के परिवर्तनों और अन्य सभी चीजों का उल्लेख करता है जो मैंने उल्लेख किया है, इसलिए ये कोड है:

 package com.circlegate.tt.cg.an.lib.map; import android.graphics.drawable.Drawable; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import com.google.android.gms.maps.model.Marker; public abstract class OnInfoWindowElemTouchListener implements OnTouchListener { private final View view; private final Drawable bgDrawableNormal; private final Drawable bgDrawablePressed; private final Handler handler = new Handler(); private Marker marker; private boolean pressed = false; public OnInfoWindowElemTouchListener(View view, Drawable bgDrawableNormal, Drawable bgDrawablePressed) { this.view = view; this.bgDrawableNormal = bgDrawableNormal; this.bgDrawablePressed = bgDrawablePressed; } public void setMarker(Marker marker) { this.marker = marker; } @Override public boolean onTouch(View vv, MotionEvent event) { if (0 <= event.getX() && event.getX() <= view.getWidth() && 0 <= event.getY() && event.getY() <= view.getHeight()) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: startPress(); break; // We need to delay releasing of the view a little so it shows the pressed state on the screen case MotionEvent.ACTION_UP: handler.postDelayed(confirmClickRunnable, 150); break; case MotionEvent.ACTION_CANCEL: endPress(); break; default: break; } } else { // If the touch goes outside of the view's area // (like when moving finger out of the pressed button) // just release the press endPress(); } return false; } private void startPress() { if (!pressed) { pressed = true; handler.removeCallbacks(confirmClickRunnable); view.setBackground(bgDrawablePressed); if (marker != null) marker.showInfoWindow(); } } private boolean endPress() { if (pressed) { this.pressed = false; handler.removeCallbacks(confirmClickRunnable); view.setBackground(bgDrawableNormal); if (marker != null) marker.showInfoWindow(); return true; } else return false; } private final Runnable confirmClickRunnable = new Runnable() { public void run() { if (endPress()) { onClickConfirmed(view, marker); } } }; /** * This is called after a successful click */ protected abstract void onClickConfirmed(View v, Marker marker); } 

यहां एक कस्टम इन्फ्यून्डो लेआउट फ़ाइल है जिसका उपयोग मैंने किया था:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginRight="10dp" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:text="Title" /> <TextView android:id="@+id/snippet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="snippet" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> 

टेस्ट गतिविधि लेआउट फ़ाइल ( MapFragment अंदर होने वाला MapWrapperLayout ):

 <com.circlegate.tt.cg.an.lib.map.MapWrapperLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map_relative_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment" /> </com.circlegate.tt.cg.an.lib.map.MapWrapperLayout> 

और अंत में एक परीक्षण गतिविधि के स्रोत कोड, जो यह सब एक साथ glues:

 package com.circlegate.testapp; import com.circlegate.tt.cg.an.lib.map.MapWrapperLayout; import com.circlegate.tt.cg.an.lib.map.OnInfoWindowElemTouchListener; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private ViewGroup infoWindow; private TextView infoTitle; private TextView infoSnippet; private Button infoButton; private OnInfoWindowElemTouchListener infoButtonListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.map); final MapWrapperLayout mapWrapperLayout = (MapWrapperLayout)findViewById(R.id.map_relative_layout); final GoogleMap map = mapFragment.getMap(); // MapWrapperLayout initialization // 39 - default marker height // 20 - offset between the default InfoWindow bottom edge and it's content bottom edge mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20)); // We want to reuse the info window for all the markers, // so let's create only one class member instance this.infoWindow = (ViewGroup)getLayoutInflater().inflate(R.layout.info_window, null); this.infoTitle = (TextView)infoWindow.findViewById(R.id.title); this.infoSnippet = (TextView)infoWindow.findViewById(R.id.snippet); this.infoButton = (Button)infoWindow.findViewById(R.id.button); // Setting custom OnTouchListener which deals with the pressed state // so it shows up this.infoButtonListener = new OnInfoWindowElemTouchListener(infoButton, getResources().getDrawable(R.drawable.btn_default_normal_holo_light), getResources().getDrawable(R.drawable.btn_default_pressed_holo_light)) { @Override protected void onClickConfirmed(View v, Marker marker) { // Here we can perform some action triggered after clicking the button Toast.makeText(MainActivity.this, marker.getTitle() + "'s button clicked!", Toast.LENGTH_SHORT).show(); } }; this.infoButton.setOnTouchListener(infoButtonListener); map.setInfoWindowAdapter(new InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { // Setting up the infoWindow with current's marker info infoTitle.setText(marker.getTitle()); infoSnippet.setText(marker.getSnippet()); infoButtonListener.setMarker(marker); // We must call this to set the current marker and infoWindow references // to the MapWrapperLayout mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow); return infoWindow; } }); // Let's add a couple of markers map.addMarker(new MarkerOptions() .title("Prague") .snippet("Czech Republic") .position(new LatLng(50.08, 14.43))); map.addMarker(new MarkerOptions() .title("Paris") .snippet("France") .position(new LatLng(48.86,2.33))); map.addMarker(new MarkerOptions() .title("London") .snippet("United Kingdom") .position(new LatLng(51.51,-0.1))); } public static int getPixelsFromDp(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int)(dp * scale + 0.5f); } } 

बस। अब तक मैंने केवल अपने गैलेक्सी नेक्सस (4.2.1) और नेक्सस 7 (4.2.1) पर भी इसका परीक्षण किया है, जब मुझे एक मौका मिल गया है, तो मैं इसे कुछ जिंजरब्रेड फोन पर देखूंगा। मैंने अभी तक पाया एक सीमा यह है कि आप मैप को स्क्रीन पर अपना बटन कहां से नहीं खींच सकते और नक्शे को चारों ओर ले जा सकते हैं। यह संभवतः किसी भी तरह से दूर हो सकता है लेकिन अब के लिए, मैं इसके साथ रह सकता हूं।

मुझे पता है कि यह एक बदसूरत हैक है, लेकिन मुझे अभी कुछ भी अच्छा नहीं मिला और मुझे इस डिजाइन पैटर्न की इतनी बुरी तरह आवश्यकता है कि यह वास्तव में मानचित्र v1 ढांचे पर वापस जाने का एक कारण होगा (जो बीटीडब्ल्यू। मैं सचमुच से बचाना चाहूंगा टुकड़ों के साथ एक नया ऐप के लिए आदि)। मुझे यह समझ में नहीं आता है कि Google डेवलपर्स को जानकारी विंडो पर एक बटन बनाने का कोई आधिकारिक तरीका क्यों नहीं पेश करता है। यह एक सामान्य डिजाइन पैटर्न है, इसके अलावा आधिकारिक Google मानचित्र एप में भी इस पद्धति का उपयोग किया जाता है 🙂 मैं इन कारणों को समझता हूं कि वे सिर्फ इन्फ्यून्डोव में अपने विचारों को "लाइव" क्यों नहीं बना सकते हैं – यह चलते-फिरते और मैप के आसपास स्क्रॉल करते समय प्रदर्शन को मार देगा। लेकिन विचारों का उपयोग किए बिना इस प्रभाव को कैसे प्राप्त किया जाए, यह कोई तरीका होना चाहिए।

मुझे लगता है कि यह सवाल पहले से ही पुराना है लेकिन अभी भी …

वांछित क्या हासिल करने के लिए हमने हमारी कंपनी में एक sipmle लाइब्रेरी बनाई है – विचारों और सब कुछ के साथ एक इंटरैक्टिव जानकारी विंडो आप इसे गिथूब पर देख सकते हैं

मुझे उम्मीद है यह मदद करेगा 🙂

यहाँ समस्या पर मेरा ले लिया है मैं AbsoluteLayout ओवरले बना देता हूं जिसमें जानकारी विंडो (इंटरैक्टिविटी और ड्राइंग क्षमताओं के हर बिट के साथ एक नियमित दृश्य) शामिल हैं। फिर मैं Handler शुरू करता हूं जो मानचित्र पर हर 16 एमएस के बिंदु के साथ सूचना विंडो की स्थिति को सिंक्रनाइज़ करता है। पागल लग रहा है, लेकिन वास्तव में काम करता है

डेमो वीडियो: https://www.youtube.com/watch?v=bT9RpH4p9mU (ध्यान दें कि एमुलेटर और वीडियो रिकॉर्डिंग एक साथ चलाने के कारण प्रदर्शन घट गया है)।

डेमो का कोड: https://github.com/deville/info-window-demo

विवरण प्रदान करने वाला एक लेख (रूसी में): http://habrahabr.ru/post/213415/

उन लोगों के लिए जो choose007's उत्तर को choose007's और चलाना नहीं चुन सके

यदि clickListener को clickListener है chose007's समाधान में हर समय ठीक से काम नहीं कर रहा है, तो View.onTouchListener बजाय View.onTouchListener को लागू करने का clickListener । कार्रवाई ACTION_UP या ACTION_DOWN किसी एक का उपयोग करके स्पर्श ईवेंट को संभाल ACTION_UP किसी कारण के लिए, नक्शा जानकारी clickListeners करने के लिए प्रेषण करते समय कुछ अजीब व्यवहार का कारण clickListeners

 infoWindow.findViewById(R.id.my_view).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = MotionEventCompat.getActionMasked(event); switch (action){ case MotionEvent.ACTION_UP: Log.d(TAG,"a view in info window clicked" ); break; } return true; } 

संपादित करें: इस तरह मैंने कदम से कदम किया

पहले अपनी गतिविधि / टुकड़ा में अपनी स्वयं की इन्फॉंडोवा (वैश्विक चर) कहीं बढ़ें। मेरा टुकड़ा के भीतर है। इसके अलावा बीमा की गारंटी दें कि आपके इन्फंडोन्डआउट लेआउट में रूट व्यूअर लाइनरलेआउट है (कुछ कारणों से रिलेटिव्हेलाइट इनफ़ोइंडो में स्क्रीन की पूरी चौड़ाई ले रहा था)

 infoWindow = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.info_window, null); /* Other global variables used in below code*/ private HashMap<Marker,YourData> mMarkerYourDataHashMap = new HashMap<>(); private GoogleMap mMap; private MapWrapperLayout mapWrapperLayout; 

फिर Google Maps एंड्रॉपी एपीआई पर MapReady कॉलबैक में (यदि आप नहीं जानते हैं कि क्या onMapReady https://developers.google.com/maps/documentation/android-api/start है ) का पालन करें।

  @Override public void onMapReady(GoogleMap googleMap) { /*mMap is global GoogleMap variable in activity/fragment*/ mMap = googleMap; /*Some function to set map UI settings*/ setYourMapSettings(); /**MapWrapperLayout initialization http://stackoverflow.com/questions/14123243/google-maps-android-api-v2- interactive-infowindow-like-in-original-android-go/15040761#15040761 39 - default marker height 20 - offset between the default InfoWindow bottom edge and it's content bottom edge */ mapWrapperLayout.init(mMap, Utils.getPixelsFromDp(mContext, 39 + 20)); /*handle marker clicks separately - not necessary*/ mMap.setOnMarkerClickListener(this); mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { YourData data = mMarkerYourDataHashMap.get(marker); setInfoWindow(marker,data); mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow); return infoWindow; } }); } 

SetInfoWindow विधि

 private void setInfoWindow (final Marker marker, YourData data) throws NullPointerException{ if (data.getVehicleNumber()!=null) { ((TextView) infoWindow.findViewById(R.id.VehicelNo)) .setText(data.getDeviceId().toString()); } if (data.getSpeed()!=null) { ((TextView) infoWindow.findViewById(R.id.txtSpeed)) .setText(data.getSpeed()); } //handle dispatched touch event for view click infoWindow.findViewById(R.id.any_view).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = MotionEventCompat.getActionMasked(event); switch (action) { case MotionEvent.ACTION_UP: Log.d(TAG,"any_view clicked" ); break; } return true; } }); 

संभाल मार्कर अलग से क्लिक करें

  @Override public boolean onMarkerClick(Marker marker) { Log.d(TAG,"on Marker Click called"); marker.showInfoWindow(); CameraPosition cameraPosition = new CameraPosition.Builder() .target(marker.getPosition()) // Sets the center of the map to Mountain View .zoom(10) .build(); mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),1000,null); return true; } 

बस एक अटकलें हैं, मुझे इसकी कोशिश करने के लिए पर्याप्त अनुभव नहीं है …) -:

चूंकि GoogleMap एक टुकड़ा है, मार्कर पर onClick ईवेंट को पकड़ना और कस्टम टुकड़ा दृश्य दिखाने के लिए संभव है। एक मानचित्र का टुकड़ा अभी भी पृष्ठभूमि पर दिखाई देगा। क्या कोई इसे कोशिश करता है? किसी भी कारण से यह काम नहीं कर सका?

यह नुकसान यह है कि मैप टुकड़ा को बैकग्राउंड पर रोक दिया जाएगा, जब तक कि कस्टम जानकारी टुकड़ा रिटर्न कंट्रोल तक नहीं हो जाता।

मैंने इस प्रश्न के लिए एक सैमसंग एंड्रॉइड स्टूडियो परियोजना का निर्माण किया है।

आउटपुट स्क्रीन शॉट्स: –

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

पूर्ण प्रोजेक्ट स्रोत कोड डाउनलोड करें यहां क्लिक करें

कृपया ध्यान दें: आपको Androidmanifest.xml में अपनी API कुंजी जोड़नी है

यह वास्तव में सरल है

 googleMap.setInfoWindowAdapter(new InfoWindowAdapter() { // Use default InfoWindow frame @Override public View getInfoWindow(Marker marker) { return null; } // Defines the contents of the InfoWindow @Override public View getInfoContents(Marker marker) { // Getting view from the layout file info_window_layout View v = getLayoutInflater().inflate(R.layout.info_window_layout, null); // Getting reference to the TextView to set title TextView note = (TextView) v.findViewById(R.id.note); note.setText(marker.getTitle() ); // Returning the view containing InfoWindow contents return v; } }); 

बस अपने वर्ग में उपरोक्त कोड जोड़ें जहां आप GoogleMap का उपयोग कर रहे हैं। R.layout.info_window_layout हमारा कस्टम लेआउट है जो दृश्य दिखा रहा है जो कि infowindow के स्थान पर आएगा मैंने अभी यहां टेक्स्ट विज़िट जोड़ा है आप नमूना स्नैप की तरह इसे बनाने के लिए यहां ऐडिटोनल व्यू जोड़ सकते हैं। मेरा info_window_layout था

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/note" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

मुझे उम्मीद है इससे मदद मिलेगी। http://wptrafficanalyzer.in/blog/customizing-infowindow-contents-in-google-map-android-api-v2-using-infowindowadapter/#comment-39731 पर हम कस्टम इन्फॉन्डोन्डो का काम उदाहरण पा सकते हैं

संपादित किया गया: यह कोड दिखाता है कि हम जानकारी पर कस्टम दृश्य कैसे जोड़ सकते हैं। इस कोड ने कस्टम व्यू मदों पर क्लिक को नियंत्रित नहीं किया तो यह जवाब देने के करीब है, लेकिन बिल्कुल जवाब नहीं है इसलिए इसका जवाब उत्तर के रूप में स्वीकार नहीं किया गया है।