2

我的地图显示了一些标记,这些标记是根据纬度和经度动态生成的。

我正在使用一个自定义信息窗口,当单击标记时显示一个 ImageView 和一个 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))));
        }
    }
}

在这里,我使用 hashmap 来跟踪用户单击的标记,并根据位置和 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;
}

我在 map.setInfoWindowAdpater() 中实例化“v”。

在这一行“tvPropertyID = (TextView) v.findViewById(R.id.textView1);” 它给出了空指针异常。不仅如此,我将“visibleMarkers.get(marker)”值设为空。

这是我的日志猫,

 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)

请任何人纠正我。我不知道除此之外。任何帮助表示赞赏!

4

1 回答 1

1

这是自定义信息窗口采用者,在此处自定义您的视图并将其设置为您的 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("");
                        }
                }
        }

将其设置为您的地图。

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

您可以在 SDK 路径 >extrass > google > google_play_services > samples > maps 中找到示例项目映射,只需从新项目 > Android 项目从现有代码中加载它

于 2013-06-18T08:03:29.400 回答