Динамическое отображение в InfoWindow Googlemap V2

Я разрабатываю приложение для путешествий. В функции Google Map API V2 я хочу, чтобы у каждого InfoWindow было другое изображение.

Я переопределил WindowInfoAdapter для пользовательского заголовка и подробного текста.

public class MyInfoWindowAdapter implements InfoWindowAdapter {
    private final View  mView;
    public MyInfoWindowAdapter(Activity activity) {
        mView = activity.getLayoutInflater().inflate(R.layout.custom_info_window, null);
    }
    @Override
    public View getInfoContents(Marker marker){
        String title = marker.getTitle();
        final String snippet = marker.getSnippet();
        final TextView titleUi = (TextView) mView.findViewById(R.id.title);
        // final View subtitleUi = mView.findViewById(R.id.subtitle);
        final TextView snippetUi = ((TextView) mView.findViewById(R.id.snippet));
        final TextView placeid = ((TextView) mView.findViewById(R.id.placeid));
        final RatingBar voteUi = ((RatingBar) mView.findViewById(R.id.ratingBar1));
        final ImageView imageUi = ((ImageView) mView.findViewById(R.id.imageView1));
        titleUi.setText(title);

        //other code
        return mView;
    }

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

Это работает нормально, потому что это строка.
Теперь я хочу добавить изображение в это InforWindow с помощью ImageView.
Проблема возникает, потому что я использовал изображение из утверждений и потока. Это что-то вроде этого

InputStream ims = getSherlockActivity().getAssets().open("images/" + imageSubPath + "/" + splitedImages[i].toLowerCase());
Drawable iImages = Drawable.createFromStream(ims, null);

Я не могу поместить объект Drawable в фрагмент, как раньше делал со String. Результат, который я хочу здесь: введите здесь описание изображения

Как я могу отображать изображения в InfoWindows, любые советы великолепны!


person Tai Dao    schedule 24.05.2013    source источник
comment
Я не могу поместить объект Drawable в сниппет, как делал раньше со String — почему бы и нет?   -  person CommonsWare    schedule 24.05.2013
comment
@CommonsWare Поскольку параметры фрагмента являются строковыми. Я обрабатываю String отдельно с помощью ; а в getInfoContents я использую String.Split. Но изображение Drawable   -  person Tai Dao    schedule 24.05.2013
comment
Ах, извините, я неправильно понял раньше. Теперь я понимаю.   -  person CommonsWare    schedule 24.05.2013
comment
нет проблем, просто спасибо, что прочитали и ответили на мой вопрос :)   -  person Tai Dao    schedule 24.05.2013


Ответы (2)


Вам нужно будет создать дополнительную структуру данных для хранения ваших изображений, например:

Map<Marker, Drawable> allMarkersMap = new HashMap<Marker, Drawable>();

после добавления маркера к GoogleMap:

allMarkersMap.put(marker, iImages);

in getInfoContents:

Drawable iImages = allMarkersMap.get(marker);

и добавьте его в файл ImageView.

Другой способ — использовать расширения Android Maps, которые имеют такие методы, как Marker.setData(Object) и Object Marker.getData(). Это вы можете использовать для прямого назначения Drawable маркеру, как и в случае со сниппетом.

person MaciejGórski    schedule 24.05.2013
comment
спасибо за идею, получилось. Просто создайте глобальный HashMap. Не лучшее решение, но решило мою проблему. Я попробую Android Maps Extensions, если у меня будет больше времени на мою диссертацию :) - person Tai Dao; 24.05.2013

После трех часов чесания головы я решил это с помощью обработчика postDelayed. Идея такова: объект, содержащий данные для infoWindow, должен иметь какое-то поле Drawable (изображение, например). Когда вы впервые показываете infoWindow, какой-нибудь AsyncTash или другой асинхронный процесс получает изображение и помещает его в изображение. Вы должны установить runnable postDealyed, который будет проверять значение изображения когда-либо X миллисекунд и, если оно стало не нулевым, повторно показывать infoWindow, иначе - установить другой запуск postDelayed. Моя часть кода getInfoContents:

  final One o=data.get(id);
  View v=o.inflateMarkerInfo(this);
  if (o.image==null) {
    final Handler h=new Handler();
    h.postDelayed(new Runnable() {
      @Override
      public void run() {
        if (o.image!=null) m.showInfoWindow();
        else h.postDelayed(this, 100);
      }
    }, 100);
  }
  return v;

Конечно, вы можете вернуть null при первом вызове, чтобы ваше информационное окно не отображалось до тех пор, пока не будет получено изображение, но это вызовет некоторую задержку.

person AnVir    schedule 09.02.2014