Правильное создание фрагмента в 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.
1 ответ
Непосредственное надувание макета не приведет к его созданию фрагмента; Android просто посчитал бы простым совпадением, что и фрагмент, и действие пытаются сослаться на один и тот же файл макета.
Обычно вы используете FragmentManager.add(int,Fragment) для добавления фрагмента в макет. Однако указанный вами идентификатор контейнера должен быть частью макета текущей операции, а в случае с PopupWindow
, Вместо этого вам придется добавить фрагмент в диспетчер фрагментов без указания контейнера, а затем через некоторое время во фрагменте (например, onStart()
) вы можете показать PopupWindow. Это именно так DialogFragment
работает, и так как уже есть большая поддержка для этого, я бы посоветовал вам вместо этого использовать DialogFragment.
Используя код фрагмента, просто расширьте DialogFragment вместо Fragment и используйте DialogFragment.show(FragmentManager,String) для его отображения. Вы можете избавиться от границы по умолчанию, позвонив setStyle(DialogFragment.STYLE_NO_FRAME, getTheme())
в onCreate
метод. Вы все еще можете добавить этот фрагмент в макет (как вы говорите, на телефоне вы не хотите, чтобы он отображался как всплывающее окно), и он будет работать так, как вы ожидаете.