Правильное создание фрагмента во всплывающем окне

#android #android-fragments #popupwindow

#Android #android-фрагменты #всплывающее окно

Вопрос:

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

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

 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 файл для классов фрагмента.

Ответ №1:

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

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

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

Комментарии:

1. Определенно правильный ответ, спасибо Дополнительно, когда мы показывали список в нашем всплывающем окне, он отказался показывать контекстное меню, которое мы указали для списка. Переключение на DialogFragment позволило нам решить эту проблему.

2. Не могли бы вы, пожалуйста, объяснить или проиллюстрировать свое последнее предложение, по возможности добавив фрагмент во всплывающее окно в качестве начального примера?» Вы все еще можете добавить этот фрагмент в макет (как вы говорите, на телефоне вы не хотите, чтобы он отображался как всплывающее окно), и он будет работать так, как вы ожидаете.»

3. @JPMagalhaes, настоятельно рекомендую не использовать фрагмент во всплывающем окне, поскольку это может привести к утечке памяти

4. Можем ли мы реализовать функцию перетаскивания для диалогового фрагмента, такого как PopupWindow?

5. Как бы это решило проблему относительного позиционирования вида, которое обеспечивается с помощью всплывающего окна?