Как передать данные в пользовательскую информацию об окне в Google Maps API v2?

У меня есть собственный макет для информации окна моей карты, но я не вижу ни одного примера того, как передать данные из маркера.

Кто-нибудь может помочь?

mMap.setInfoWindowAdapter(new InfoWindowAdapter() {

    // Use default InfoWindow frame
    @Override
    public View getInfoWindow(Marker arg0) {
        return null;
    }

    @Override
    public View getInfoContents(Marker arg0) {

        View v = getActivity().getLayoutInflater().inflate(R.layout.info_window_layout, null); 

        ImageView pic = (ImageView) v.findViewById(R.id.pic); 
        String url = <????>;
        // set pic image from url

        TextView name = (TextView) v.findViewById(R.id.name); 
        name.setText(<????>);

        TextView address = (TextView) v.findViewById(R.id.address); 
        address.setText(<????>);

        return v;

    }
});

mCenterList = MyApplication.dbHelper.getAllCenter();

for(Center center : mCenterList){

    Marker marker = mMap.addMarker(
            new MarkerOptions().position(new LatLng(center.lat, center.lng))
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.elipin)));                

    // How can I pass custom data, here pic, name and address, to the marker, to
    // make it available in getInfoContents?


}

info_window_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:layout_height="50dp"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/pic"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginRight="5dp"
        android:scaleType="centerCrop" />

    <ImageView
        android:id="@+id/arrow"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="5dp"
        android:scaleType="centerCrop"
        android:src="@drawable/arrowri" />

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:layout_toRightOf="@id/pic"
        android:layout_toLeftOf="@id/arrow"
        android:gravity="center_vertical"
        android:singleLine="true"
        android:textColor="#ffffff"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/address"
        android:layout_width="match_parent"
        android:layout_height="15dp"
        android:layout_toRightOf="@id/pic"
        android:layout_toLeftOf="@id/arrow"
        android:layout_below="@id/name"
        android:gravity="center_vertical"
        android:singleLine="true"
        android:textColor="#ffffff"
        android:textSize="16sp" />

</RelativeLayout>

person jul    schedule 19.04.2013    source источник


Ответы (5)


Поскольку Marker — это final, вы не можете создать из него подкласс.

Следовательно, лучшее решение, которое я нашел, — это использовать что-то в Marker, например фрагмент, для хранения ключа, позволяющего искать дополнительные данные. Например, это может быть ключ к HashMap вашей модели данных, или это может быть первичный ключ для вашей базы данных, или что-то в этом роде.

Тогда ваши <????> берутся не из Marker напрямую, а из вашей реальной модели данных, где Marker просто имеет идентифицирующую информацию, связывающую их вместе.

person CommonsWare    schedule 19.04.2013

Я нашел эту библиотеку Android Maps Extentions и использовал ее в своем проекте. Это полезно и может помочь вам легко передавать данные в окно.

Спасибо,

person sonida    schedule 30.04.2013

Я решил это, сохранив свои данные внутри массива, создав собственный макет для информационного окна и после этого передав индексатор массива после заголовка так: «заголовок/индексатор». Внутри информационного окна я разделил строку и использовал индексатор для использования массива и получения данных.

person JessinR    schedule 08.03.2017

Взгляните на этот пример кода, в коде есть комментарии для объяснения:

 map.setInfoWindowAdapter(new InfoWindowAdapter() {

                // Use default InfoWindow frame
                @Override
                public View getInfoWindow(Marker args) {
                    return null;
                }

                // Defines the contents of the InfoWindow
                @Override
                public View getInfoContents(Marker args) {

                    // Getting view from the layout file info_window_layout
                    View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);

                    // Getting the position from the marker
                    clickMarkerLatLng = args.getPosition();

                    //Setting title text
                    TextView title = (TextView) v.findViewById(R.id.tvTitle);
                    title.setText(args.getTitle());

                    map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {          
                        public void onInfoWindowClick(Marker marker) 
                        {
                            if (SGTasksListAppObj.getInstance().currentUserLocation!=null)
                            {   
                                if (String.valueOf(SGTasksListAppObj.getInstance().currentUserLocation.getLatitude()).substring(0, 8).contains(String.valueOf(clickMarkerLatLng.latitude).substring(0, 8)) &&
                                        String.valueOf(SGTasksListAppObj.getInstance().currentUserLocation.getLongitude()).substring(0, 8).contains(String.valueOf(clickMarkerLatLng.longitude).substring(0, 8)))
                                {
                                    Toast.makeText(getApplicationContext(), "This your current location, navigation is not needed.",  Toast.LENGTH_SHORT).show();
                                }
                                else
                                {
                                    FlurryAgent.onEvent("Start navigation window was clicked from daily map");
                                    tasksRepository = SGTasksListAppObj.getInstance().tasksRepository.getTasksRepository();
                                    for (Task tmptask : tasksRepository)
                                    {
                                        String tempTaskLat = String.valueOf(tmptask.getLatitude());
                                        String tempTaskLng = String.valueOf(tmptask.getLongtitude());

                                        Log.d(TAG, String.valueOf(tmptask.getLatitude())+","+String.valueOf(clickMarkerLatLng.latitude).substring(0, 8));

                                        if (tempTaskLat.contains(String.valueOf(clickMarkerLatLng.latitude).substring(0, 8)) && tempTaskLng.contains(String.valueOf(clickMarkerLatLng.longitude).substring(0, 8)))
                                        {  
                                            task = tmptask;
                                            break;
                                        }
                                    }
                                    Intent intent = new Intent(getApplicationContext() ,RoadDirectionsActivity.class);
                                    intent.putExtra(TasksListActivity.KEY_ID, task.getId());
                                    startActivity(intent);

                                }
                            }
                            else
                            {
                                Toast.makeText(getApplicationContext(), "Your current location could not be found,\nNavigation is not possible.",  Toast.LENGTH_SHORT).show();
                            }
                        }
                    });

                    // Returning the view containing InfoWindow contents
                    return v;

                }
            });  

ОБНОВЛЕНИЕ:

Затем вы должны связать объект HashMap с вашим маркером, взгляните на этот ответ здесь:

Как связать Google Сопоставляет маркер Android API v2 с объектом

person Emil Adz    schedule 19.04.2013
comment
Вы используете методы getPosition() и getTitle(), которые являются методами маркера по умолчанию. Мне нужно передать пользовательские данные, то есть в моем примере изображение, имя и адрес (я знаю, что могу использовать заголовок и фрагмент для передачи имени и адреса, но я хочу иметь возможность добавить больше данных). - person jul; 19.04.2013
comment
взгляните на ответ здесь о том, как связать объект HashMap с маркером: stackoverflow.com/questions/14310280/ - person Emil Adz; 19.04.2013

Метод ниже

mMap.setOnMarkerClickListener (новый OnMarkerClickListener() {

        @Override
        public boolean onMarkerClick(**Marker arg0**) { } 

помогает передать значение .

т.е. Параметр маркера возвращает количество маркеров, например 1,2,3 и т. д.

Передайте этот номер как arraylist.get(1).details, вы можете получить соответствующие данные

из списка

person KP_    schedule 19.04.2013