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




google-maps infowindow (5)

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

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

नुकसान यह है कि नक्शा खंड को बैकग्राउड पर जमा किया जाएगा, जब तक एक कस्टम जानकारी खंड वापसी पर नियंत्रण न हो जाए।

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

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

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

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

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


मैं देखता हूं कि यह प्रश्न पहले से ही पुराना है लेकिन अभी भी ...

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

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


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

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

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

कृपया ध्यान दें: आपको Android APIifest.xml में अपनी एपीआई कुंजी जोड़नी होगी


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

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 पर कस्टम infowindow का एक कार्य उदाहरण पा सकते हैं

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


उन लोगों के लिए जो choose007's लिए choose007's जवाब नहीं दे सके

यदि clickListener गया chose007's समाधान में हर समय ठीक से काम नहीं कर रहा है, तो View.onTouchListener बजाय View.onTouchListener को लागू करने का clickListener । किसी भी कार्रवाई ACTION_UP या ACTION_DOWN का उपयोग करके हैंडल स्पर्श ईवेंट। कुछ कारणों से, नक्शा 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 (वैश्विक परिवर्तनीय) फुलाओ। मेरा टुकड़ा टुकड़ा है। यह भी बीमा करें कि आपके infowindow लेआउट में रूट व्यू linearlayout है (किसी कारण से relativelayout infowindow में स्क्रीन की पूरी चौड़ाई ले रहा था)

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 मानचित्र एंड्रॉइड एपीआई के onMapReady कॉलबैक में (अगर आप नहीं जानते कि क्या हैमैपरेडी मानचित्र है> दस्तावेज़ीकरण - प्रारंभ करना )

   @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 प्रारंभिकरण http://.com/questions/14123243/google-maps-android-api-v2- इंटरैक्टिव-infowindow-like-in-original-android-go / 15040761 # 15040761 39 - डिफ़ॉल्ट मार्कर ऊंचाई 20 - ऑफसेट के बीच डिफ़ॉल्ट InfoWindow नीचे किनारे और इसकी सामग्री नीचे किनारे * /

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






google-maps-android-api-2