Search code examples
androidimagegoogle-mapsgoogle-maps-markersinfowindow

Add an image for Android marker info window


I'm making an android app. In this app, there are markers of some hotels and when user click on the marker info window appears and it should be like following image. (This is a web application)

Marker info window

I have a list view in my navigation drawer fragment and map fragment has the markers.

This is my code before I try to load image for the info window in 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());
            }

        }

    }

Here is the listview call of hotels inside 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;

I've tried adding info_window_layout.xml and here is the code.

<?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>

But, I cannot load my info window like in the image. I've tried several solutions including this and any of that didn't give me a solution.

Can someone please help me with this?

Thanks in advance. :)

  • Error -

error


Solution

  • Figured it out finally. :D

    Changed the info_window_layout.xml like this.

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

    Then added a new class called, 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;
        }
    }
    

    Now working as expected. :)