Mahe
Mahe

Reputation: 2737

Java.lang.NullPointerException on Marker Click in android

I am having a map displayed with some markers which are dynamically generated based on latitude and longitude.

I am using a custom infowindow to be shown when clicked on the marker, with an ImageView and a TextView.

map.setInfoWindowAdapter(new InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker marker) {
            return v;
        }
        @Override
        public View getInfoContents(Marker marker) {
            v = getLayoutInflater().inflate(R.layout.info_window_layout,
                    null);

            Bitmap myBitmap;
            try {
                URL url = new URL(
                        "URL here");
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();

                connection.setDoInput(true);

                connection.connect();
                connection.setReadTimeout(120000);
                InputStream input = connection.getInputStream();
                myBitmap = BitmapFactory.decodeStream(input);

            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            ImageView imgPhoto = (ImageView) v
                    .findViewById(R.id.imageView1);
            tvPropertyID = (TextView) v.findViewById(R.id.textView1);
            imgPhoto.setImageBitmap(myBitmap);          
            return v;
        }
    });

    map.setOnMarkerClickListener(this);


and Dynamically placing markers like this,

 protected void placeMarker(final List<PropertiesList> PropertyStub) {

    for (int i = 0; i <= PropertyStub.size() - 1; i++) {
        final LatLng MeanLatLng = new LatLng(PropertyStub.get(i).Latitude,
                PropertyStub.get(i).Longitude);

        if (!visibleMarkers.containsKey(PropertyStub.get(i).PropertyID)) {
            visibleMarkers
                    .put(PropertyStub.get(i).PropertyID,
                            this.map.addMarker(new MarkerOptions()
                                    .position(MeanLatLng)
                                    .title("Property")

                                    .icon(BitmapDescriptorFactory
                                            .fromResource(R.drawable.pink_outside_marker))));
        }
    }
}

Here I am using hashmap to keep track of the marker which the user clicked and display Image and text accordingly based on some fields like location and PropertyID.

onMarkerClick,

View v;
public boolean onMarkerClick(Marker marker) {
    Log.d("", "On marker click");
    Log.d("", "VisibleMarkerText: " + visibleMarkers.get(marker));
    tvPropertyID = (TextView) v.findViewById(R.id.textView1);
    tvPropertyID.setText("" + visibleMarkers.get(marker));

    return true;
}

I am instantiating "v" in map.setInfoWindowAdpater().

Here at this line "tvPropertyID = (TextView) v.findViewById(R.id.textView1);" it gives null pointer exception. And not only that I am getting "visibleMarkers.get(marker)" value as null.

This is my logcat,

 06-18 12:39:26.812: E/AndroidRuntime(19018): FATAL EXCEPTION: main
 06-18 12:39:26.812: E/AndroidRuntime(19018): java.lang.NullPointerException
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at com.bu.PropertySearchTypes.MapSearch.onMarkerClick(MapSearch.java:230)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at com.google.android.gms.maps.GoogleMap$4.f(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at com.google.android.gms.internal.bp$a.onTransact(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at android.os.Binder.transact(Binder.java:279)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at bds.a(SourceFile:84)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.aj.bk.a(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.as.d.a(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.as.p.c(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.as.o.a(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.as.bo.c(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.as.bk.onSingleTapConfirmed(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.bs.g.onSingleTapConfirmed(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at maps.bs.i.handleMessage(Unknown Source)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at android.os.Handler.dispatchMessage(Handler.java:99)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at android.os.Looper.loop(Looper.java:130)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at android.app.ActivityThread.main(ActivityThread.java:3687)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at java.lang.reflect.Method.invokeNative(Native Method)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at java.lang.reflect.Method.invoke(Method.java:507)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
 06-18 12:39:26.812: E/AndroidRuntime(19018):   at dalvik.system.NativeStart.main(Native Method)

Please any one correct me. I don't know beyond this. Any help is appreciated!!

Upvotes: 2

Views: 1512

Answers (1)

Ishtiaq
Ishtiaq

Reputation: 1206

this is the custom info windows adopter , customize your view here and set it to you mMap

/** Demonstrates customizing the info window and/or its contents. */
    class CustomInfoWindowAdapter implements InfoWindowAdapter
        {
            // private final RadioGroup mOptions;

            // These a both viewgroups containing an ImageView with id  "badge" and two TextViews with id
            // "title" and "snippet".
            private final View mWindow;
            private final View mContents;

            CustomInfoWindowAdapter()
                {
                    mWindow = getLayoutInflater().inflate(R.layout.custom_info_window, null);
                    mContents = getLayoutInflater().inflate(R.layout.custom_info_contents, null);
                    // mOptions = (RadioGroup) findViewById(R.id.custom_info_window_options);
                }

            @Override
            public View getInfoWindow(Marker marker)
                {
                    // if (mOptions.getCheckedRadioButtonId() != R.id.custom_info_window)
                    // {
                    // // This means that getInfoContents will be called.
                    // return null;
                    // }
                    render(marker, mWindow);
                    return mWindow;
                }

            @Override
            public View getInfoContents(Marker marker)
                {
                    // if (mOptions.getCheckedRadioButtonId() != R.id.custom_info_contents)
                    // {
                    // // This means that the default info contents will be used.
                    // return null;
                    // }
                    render(marker, mContents);
                    return mContents;
                }

            private void render(Marker marker, View view)
                {

                    String title = marker.getTitle();
                    TextView titleUi = ((TextView) view.findViewById(R.id.title));
                    if (title != null)
                        {
                            // // Spannable string allows us to edit the formatting of the text.
                            SpannableString titleText = new SpannableString(title);
                            // titleText.setSpan(new ForegroundColorSpan(Color.RED), 0, titleText.length(), 0);
                            titleUi.setText(titleText);
                        }
                    else
                        {
                            titleUi.setText("");
                        }
                    //
                    String snippet = marker.getSnippet();
                    TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
                    if (snippet != null)// && snippet.length() > 12)
                        {
                            SpannableString snippetText = new SpannableString(snippet);
                            // snippetText.setSpan(new ForegroundColorSpan(Color.MAGENTA), 0, 10, 0);
                            // snippetText.setSpan(new ForegroundColorSpan(Color.BLUE), 12, snippet.length(), 0);
                            snippetUi.setText(snippetText);
                        }
                    else
                        {
                            snippetUi.setText("");
                        }
                }
        }

set it to your map.

// Setting an info window adapter allows us to change the both the contents and look of the
            // info window.
            mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());

you can find example project map you SDK path >extrass > google > google_play_services > samples > maps just load it from New project > Android Project from existing Code

Upvotes: 1

Related Questions