为Android标记信息窗口

时间:2016-07-25 05:06:13

标签: android image google-maps google-maps-markers infowindow

我正在制作一款Android应用。在这个应用程序中,有一些酒店的标记,当用户点击标记信息窗口时,它应该像下面的图像。 (这是一个Web应用程序)

Marker info window

我的导航抽屉片段中有一个列表视图,地图片段中有标记。

在我尝试为MainActivity.java中的信息窗口加载图片之前,这是我的代码。

  // Load Hotels
    private class GetHotelTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... data) {
            String identifier = data[0];

            // Toast.makeText(getContext(), "Manuli "+identifier, Toast.LENGTH_LONG ).show();
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://api.ayubo.lk/android/retrievehotels");
            HttpResponse response = null;
            String responseStr = null;

            try {
                //add data
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
                nameValuePairs.add(new BasicNameValuePair("long", data[0]));
                nameValuePairs.add(new BasicNameValuePair("lat", data[1]));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                //execute http post
                response = httpclient.execute(httppost);
                responseStr = EntityUtils.toString(response.getEntity());

            } catch (ClientProtocolException e) {
                e.printStackTrace();

            } catch (IOException e) {
                e.printStackTrace();
            }

            return responseStr;
        }

        protected void onPostExecute(String result) {

            try {
                JSONArray jObj = new JSONArray(result);

                for(int a=0;a<jObj.length();a++){

                JSONArray obj= (JSONArray) jObj.get(a);

                    Log.i("json", obj.get(3).toString());
                    Marker marker = GoogleMapsFragment.map.addMarker(new MarkerOptions()
                            .position(new LatLng( Double.valueOf(obj.get(3).toString()),  Double.valueOf(obj.get(2).toString())))
                            .title(obj.get(1).toString()+" | simple Price : "+obj.get(4).toString())
                            .snippet(obj.get(5).toString())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker_hotel)));


                    hotelMarkers.add(marker);

                }

                LatLng latLng = new LatLng(Double.valueOf(latitude),Double.valueOf(longtitude));

                GoogleMapsFragment.map.moveCamera(CameraUpdateFactory.newLatLng(latLng));

                GoogleMapsFragment.map.animateCamera(CameraUpdateFactory.zoomTo(15));

            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

        }

    }

以下是MainActivity.java内的酒店列表视图调用。

// Hotels
            case 0:
                if (A == 0){
                    Bundle bundle = new Bundle();
                    bundle.putString("restaurants", "Default");
                    fragmentObj = new GoogleMapsFragment();
                    fragmentObj.setArguments(bundle);

                    if (!sclItems.contains(0)){
                        new GetHotelTask().execute(longtitude, latitude);
                        sclItems.add(0);
                    }else {
                        removeHotels();
                        sclItems.remove((Integer)0);
                    }
                    A = 1;
                }else {
                    if (!sclItems.contains(0)){
                        new GetHotelTask().execute(longtitude, latitude);
                        sclItems.add(0);
                    }else {
                        removeHotels();
                        sclItems.remove((Integer)0);
                    }
                }
                break;

我尝试添加info_window_layout.xml,这是代码。

<?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="horizontal">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_prof"/>
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12dp"
            android:textStyle="bold"/>
        <TextView
            android:id="@+id/snippet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10dp"/>
    </LinearLayout>

</LinearLayout>

但是,我无法加载我的信息窗口,就像在图像中一样。我尝试了多种解决方案,包括this,其中任何一种都没有给我一个解决方案。

有人可以帮帮我吗?

提前致谢。 :)

  • 错误 -

error

4 个答案:

答案 0 :(得分:2)

终于搞清楚了。 :d

像这样更改了info_window_layout.xml

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#000000" >
    <LinearLayout
        android:id="@+id/text_box"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/markerImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
           />

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/distance"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</ScrollView>

然后添加了一个名为ManiInfoAdapter.java

的新类
class MapInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {

    private LayoutInflater inflater;
    private Context context;

    public MapInfoWindowAdapter(Context context){
        inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        this.context = context;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        // Getting view from the layout file
        View v = inflater.inflate(R.layout.info_window_layout, null);

        TextView title = (TextView) v.findViewById(R.id.title);
        title.setText(marker.getTitle());

        TextView address = (TextView) v.findViewById(R.id.distance);
        address.setText(marker.getSnippet());

        ImageView iv = (ImageView) v.findViewById(R.id.markerImage);
        iv.setImageResource(R.drawable.ic_attraction1);

        return v;
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }
}

现在按预期工作。 :)

答案 1 :(得分:1)

试试这段代码:

public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.

  Log.d(TAG, dataSnapshot.toString());
  Log.d(TAG, "ChildrenCount == " + dataSnapshot.getChildrenCount());
  for(DataSnapshot d : dataSnapshot.getChildren())
   {
        Log.d(TAG, d.getKey() + " : " + d.getValue(String.class));
   }
   dataSnapshot.getValue(ArrayList.class);
 }

答案 2 :(得分:1)

我试过为我的应用做同样的事情。我无法按照自己的意愿将图像加载到标记中。

所以我做的是。

  1. 创建了xml布局maps_info_window_blue

  2. 我已纳入我的地图布局。

    <fragment
        android:id="@+id/map_booking_frg"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    
    <ImageView
        android:id="@+id/center_marker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/shadowView"
        android:layout_centerHorizontal="true"
        android:src="@drawable/marker_start" />
    
    <include layout="@layout/maps_info_window_blue"
        android:id="@+id/rl_info_window_blue"
        android:layout_width="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_above="@+id/shadowView"
        android:layout_height="wrap_content"/>
    
    <View
        android:id="@+id/shadowView"
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:background="@color/transparent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:visibility="invisible" />
    

  3. 对我来说,要求是将标记信息窗口放在中心。你可以随意设置它。

    1. 为了给出标记的错觉,我总是设置LatLng,我想成为地图的中心(CameraPosition目标设置为我想要的LatLng)

答案 3 :(得分:1)

尝试使用信息窗口适配器。这可能对你有所帮助。

mMap.setInfoWindowAdapter(setMarkerWindow());




    private GoogleMap.InfoWindowAdapter setMarkerWindow() {
                return new GoogleMap.InfoWindowAdapter() {
                    @Override
                    public View getInfoWindow(Marker marker) {
                        View myContentView = getLayoutInflater().inflate(
                                R.layout.map_info_window, null);
                        myContentView.setBackgroundColor(Color.TRANSPARENT);
                        TextView tvTitle = ((TextView) myContentView
                                .findViewById(R.id.title));
 tvTitle.setText(marker.getTitle());
                       ......
                        return myContentView;
                    }

                    @Override
                    public View getInfoContents(Marker marker) {
                        return null;
                    }
                };
            }