Правильное создание фрагмента в PopupWindow - PullRequest
17 голосов
/ 08 ноября 2011

Я новичок в разработке под 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.

1 Ответ

18 голосов
/ 11 марта 2012

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

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

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

...