Добавить фрагмент Android в содержимое InfoWindow

Я пишу приложение для Android, предназначенное для версии 4.0 и выше, и использую Google Maps v2. Я хотел бы установить содержимое InfoWindow с помощью Fragment. Кто-нибудь знает, возможно ли это?

Мой класс реализует InfoWindowAdapter, и вот соответствующий код:

//
// InfoWindowAdapter interface
//

@Override
public View getInfoContents (Marker marker) {
    LinearLayout layout = new LinearLayout(this.getActivity());
    LayoutInflater inflater = (LayoutInflater) this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.map_details, layout);

    MapDetailsFragment frag = new MapDetailsFragment();
    // TODO: How to add this fragment to v???

    return v;
}

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

Я пробовал следующий код после создания экземпляра frag:

this.getFragmentManager().beginTransaction().replace(R.id.fragment_map_details, frag).commit();

Но R.id.fragment_map_details из R.layout.map_details, и поэтому FragmentManager еще ничего об этом не знает.

Любые указатели будут очень признательны!


person themanatuf    schedule 10.06.2013    source источник


Ответы (3)


Представление, возвращаемое адаптером, не является живым представлением, а преобразуется в растровое изображение, поэтому код, связанный с этим представлением (например, нажатия кнопок), никогда не будет выполняться.

То же самое относится и к фрагментам, поэтому вы можете перестать пытаться это сделать и вместо этого создать макет, который связывает воедино map_details и макет фрагмента. Использование включения в xml, вероятно, будет работать.

person MaciejGórski    schedule 10.06.2013

Я не видел, чтобы кто-то достиг этого, и я не думаю, что это возможно, поскольку это простое представление, которое создается для вас, а это означает, что многое происходит за вашей спиной.

person Warpzit    schedule 10.06.2013
comment
Я думаю ты прав. Я уже несколько дней безуспешно. К счастью, мне удалось сделать большинство методов в этом фрагменте статическими, поэтому я смог расширить представление и установить все поля с помощью статических методов. Не идеальный, но и не дублирующий код. - person themanatuf; 12.06.2013

Три предложения:

  1. Транзакция и фиксация асинхронны. Вы можете попробовать позвонить http://developer.android.com/reference/android/app/FragmentManager.html#executePendingTransactions(). Однако в какой-то момент у меня были исключения, когда я пытался использовать это. Но может вам с ним больше повезет.

  2. В противном случае вы можете попробовать добавить фрагмент в качестве обычного подпредставления в свой контейнер, заменив R.id.fragment_map_details представлением, возвращаемым из frag.getView(). Однако это всего лишь дикая догадка. Возможно, вы не должны использовать это возвращаемое значение таким образом. (Я стал немного осторожнее, когда дело доходит до Android API...)

  3. Из https://developers.google.com/maps/documentation/android/infowindows (в разделе «Пользовательские информационные окна»):

Чтобы обновить информационное окно позже (например, после загрузки изображения), вызовите showInfoWindow().

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

person Risadinha    schedule 14.01.2014