Правильное создание фрагмента в 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, но я не могу понять, как это сделать. Может кто-нибудь мне помочь?

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

Solutions Collecting From Web of "Правильное создание фрагмента в PopupWindow"

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

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

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