Custom infowindow in Google map android v2

48,247

Solution 1

Please refer Info window click events in this link

Info window is not a live View, rather the view is rendered as an image onto the map. As a result, any listeners you set on the view are disregarded and you cannot distinguish between click events on various parts of the view. You are advised not to place interactive components — such as buttons, checkboxes, or text inputs — within your custom info window.

Solution 2

You have to implement Custom marker; It is like this:

custommarker.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:layout_gravity="center_vertical|center_horizontal"
android:background="#ADD8E6"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal" >

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="5dp"
    android:adjustViewBounds="true"
    android:contentDescription="@string/app_name"
    android:src="@drawable/sabarmati" />

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/snippet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textColor="@android:color/black"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textColor="@android:color/black"
        android:textSize="10sp"
        android:textStyle="bold" />
</LinearLayout>

</LinearLayout>

Activity:

public class PlacesMapActivity extends android.support.v4.app.FragmentActivity
    implements OnClickListener, LocationListener {
/**
 * Note that this may be null if the Google Play services APK is not
 * available.
 */
ImageButton btn_home;
private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

    SupportMapFragment fragment =   (SupportMapFragment)getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mMap = fragment.getMap();
    mMap.setMyLocationEnabled(true);

    // mMap = ((SupportMapFragment) getSupportFragmentManager()
    // .findFragmentById(R.id.map)).getMap();

    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.title("First Location");
    markerOptions.snippet("This Is Test Location");

    LatLng latlng = new LatLng(23.0333, 72.6167);

    markerOptions.position(latlng);
    // markerOptions.title("Ahmedabad Cordinat Found here");

    // Marker m = mMap.addMarker(markerOptions);

    ***mMap.setInfoWindowAdapter(new InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }
        @Override
        public View getInfoContents(Marker marker) {
            View myContentView = getLayoutInflater().inflate(
                    R.layout.custommarker, null);
            TextView tvTitle = ((TextView) myContentView
                    .findViewById(R.id.title));
            tvTitle.setText(marker.getTitle());
            TextView tvSnippet = ((TextView) myContentView
                    .findViewById(R.id.snippet));
            tvSnippet.setText(marker.getSnippet());
            return myContentView;
        }
    });***

    mMap.addMarker(new MarkerOptions()
            .position(latlng)
            .title("This is Sabarmati Ashram")
            .snippet("Ahmedabad")
            .icon(BitmapDescriptorFactory
                .defaultMarker(BitmapDescriptorFactory.HUE_RED)));

    mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

        @Override
        public void onInfoWindowClick(Marker arg0) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getBaseContext(),
                    DetailsOfPlacesActivity.class);
            startActivity(intent);
        }
    });

    btn_home = (ImageButton) findViewById(R.id.activity_map_ibtn_home);
    btn_home.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
        }
    });
}
}
Share:
48,247
SBK
Author by

SBK

Updated on October 01, 2020

Comments

  • SBK
    SBK over 3 years

    I am using Google Map API V2 and i have created a custom InfoWindow for a Marker on map.In this InfoWindow i have a button.

    My problem is unable to set Onclicklistener/functioning to that Button(Dummy).Any one give me some idea to solve this :

    enter image description here

    Here is code snippet:

    public class MarkerView extends FragmentActivity implements OnMarkerClickListener,OnInfoWindowClickListener{
    
    private GoogleMap mMap;
    private Marker chennai;
    private View infoWindow;
    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.basic_demo);
    
        infoWindow=getLayoutInflater().inflate(R.layout.custom_info_contents, null);
    
        mMap=((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
        chennai=mMap.addMarker(new MarkerOptions().position(new LatLng(13.0810, 80.274)).anchor(2, 1).title("Android").snippet("Snippet").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
        mMap.setInfoWindowAdapter(new CustomInfoAdapter());
        mMap.setOnInfoWindowClickListener(null);
        mMap.setOnMarkerClickListener(this);
        Button dummy=(Button) infoWindow.findViewById(R.id.dummy);
        dummy.setVisibility(View.VISIBLE);
        dummy.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                Toast.makeText(MarkerView.this, "Dummy Button", Toast.LENGTH_SHORT).show();
    
            }
        });
    }
    
    
    class CustomInfoAdapter implements InfoWindowAdapter{
    
    
        @Override
        public View getInfoContents(Marker arg0) {
            displayView(arg0);
            return infoWindow;
        }
    
        @Override
        public View getInfoWindow(Marker arg0) {
    
            return null;
        }
    
    
    }
    
    
    public void displayView(Marker arg0) {
    
        ((ImageView)infoWindow.findViewById(R.id.badge)).setImageResource(R.drawable.arrow);
        ((ImageView)infoWindow.findViewById(R.id.badge)).setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                Toast.makeText(MarkerView.this, "Arrow Image", Toast.LENGTH_SHORT).show();
    
            }
        });
         ((TextView)infoWindow.findViewById(R.id.title)).setText(arg0.getTitle());
         ((TextView)infoWindow.findViewById(R.id.snippet)).setText(arg0.getTitle());
    
    }
    
    
    @Override
    public boolean onMarkerClick(Marker arg0) {
        if(arg0.equals(chennai)){
    
            infoWindow.setClickable(false);
    
        }
        return false;
    }
    
    
    @Override
    public void onInfoWindowClick(Marker arg0) {
        Toast.makeText(MarkerView.this, "Info window", Toast.LENGTH_SHORT).show();
    }