Правильное создание фрагмента в PopupWindow

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

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

public void onClick(View v) {
    LayoutInflater inflater = (LayoutInflater) BrowsingActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View popupLayout = inflater.inflate(R.layout.serverconnection_fragment, null, false);
    connectionListPopup = new PopupWindow(popupLayout, 300, 470, true);
    connectionListPopup.showAtLocation(BrowsingActivity.this.findViewById(R.id.connectionListImage), Gravity.CENTER, 0, 0);
}

Появится всплывающее окно, содержащее пользовательский интерфейс, описанный в файле serverconnection_fragment.xml. Проблема в том, что при таком создании экземпляр класса Fragment ServerConnectionFragment.java никогда не создается, поэтому в моем пользовательском интерфейсе нет элементов в списке, нет прослушивателей на кнопках и т. д. Похоже, у меня должен быть способ создать экземпляр класса java, заставить его нормально раздувать фрагмент и прикреплять прослушиватели событий, а затем передавать созданное там представление в конструктор PopupWindow, но я не могу понять, как это сделать. Может кто-нибудь мне помочь?

К вашему сведению, я создаю это для Android 2.1, используя файл Android-support-v4.jar для классов Fragment.


person Mark Rausch    schedule 08.11.2011    source источник


Ответы (1)


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

Обычно вы должны использовать FragmentManager.add(int, Фрагмент), чтобы добавить фрагмент в макет. Однако указанный вами идентификатор контейнера должен быть частью макета текущего действия, а это не относится к PopupWindow. Вместо этого вам нужно будет добавить фрагмент в диспетчер фрагментов без указания контейнера, а затем через некоторое время во фрагменте (например, onStart()) вы можете показать PopupWindow. Именно так работает DialogFragment, и, поскольку для него уже есть много поддержки, я бы посоветовал вам вместо этого переключиться на использование DialogFragment.

С кодом фрагмента просто расширьте DialogFragment вместо Fragment и используйте DialogFragment.show(FragmentManager,String) для его отображения. Вы можете избавиться от границы по умолчанию, вызвав setStyle(DialogFragment.STYLE_NO_FRAME, getTheme()) в методе onCreate. Вы все еще можете добавить этот фрагмент в макет (как вы говорите, на телефоне вы не хотите, чтобы он отображался как всплывающее окно), и он будет работать так, как вы ожидаете.

person antonyt    schedule 11.03.2012
comment
Определенно правильный ответ, спасибо. Кроме того, когда мы показывали список в нашем PopupWindow, он отказывался показывать ContextMenu, который мы указали для списка. Переход на DialogFragment позволил нам решить эту проблему. - person Mark Rausch; 05.04.2012
comment
Не могли бы вы, пожалуйста, объяснить или проиллюстрировать ваше последнее предложение, если возможно, добавив фрагмент во всплывающее окно, в качестве исходного примера? Вы все еще можете добавить этот фрагмент в макет (как вы говорите, на телефоне вы не хотите, чтобы он был отображается как всплывающее окно), и он будет работать так, как вы ожидаете. - person JPMagalhaes; 26.06.2012
comment
@JPMagalhaes, настоятельно рекомендую не использовать фрагмент в PopupWindow, так как это может привести к утечке памяти. - person LiangWang; 05.06.2015
comment
Можем ли мы реализовать функцию перетаскивания для DialogFragment, например PopupWindow? - person heyjii; 02.06.2016
comment
Как это решит относительное позиционирование представления, которое обеспечивается с помощью PopupWindow? - person Pepster; 06.03.2017