Правилно създаване на фрагмент в 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. Проблемът е, че създавайки го по този начин, класът на фрагмент 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.

С кода на Fragment просто разширете 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