2011-11-08 20 views
16

Sono nuovo nello sviluppo di Android e sono confuso su come realizzare ciò che sto cercando di fare. Ho letto e studiato alcuni frammenti in modo da poter condividere layout e codice tra vari progetti di dimensioni dello schermo. Ho creato un paio di frammenti e li ho usati con successo. Ma ho una situazione in cui voglio mostrare un frammento in una normale attività sul telefono, ma voglio mostrare il frammento in una finestra popup (o qualcosa di simile se c'è una scelta migliore) su un tablet.Creazione corretta di un frammento in una finestra popup

Sono riuscito a capire come gonfiare il frammento e visualizzarlo in un PopupWindow quando si fa clic su un pulsante. Il mio codice è simile al seguente: appare

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); 
} 

Il pop-up e contiene l'interfaccia utente descritta in serverconnection_fragment.xml. Il problema è che creandolo in questo modo, la classe Fragment ServerConnectionFragment.java non viene mai istanziata quindi non ci sono elementi nell'elenco nella mia interfaccia utente, nessun listener sui pulsanti e così via. Sembra che dovrebbe esserci un modo per me di istanziare la classe java, farla gonfiare normalmente il frammento e allegare i listener di eventi, quindi passare la vista creata lì nel costruttore di PopupWindow, ma non riesco a capire come. Qualcuno mi può aiutare?

FYI, sto costruendo questo per Android 2.1 utilizzando il file Android-support-v4.jar per le classi Fragment.

risposta

17

Fare gonfiare il layout direttamente non lo fa istanziare il frammento; Android considererebbe semplicemente una coincidenza che sia il frammento che l'attività stiano cercando di riferirsi allo stesso file di layout.

In genere, è necessario utilizzare FragmentManager.add(int,Fragment) per aggiungere un frammento a un layout. Tuttavia, l'id del contenitore specificato deve far parte del layout dell'attività corrente e non è il caso di uno PopupWindow. Invece, dovresti aggiungere il frammento al gestore dei frammenti senza specificare un contenitore, e quindi qualche tempo dopo nel frammento (ad esempio onStart()) puoi mostrare una finestra popup. Questo è esattamente il modo in cui funziona DialogFragment e, poiché esiste già un sacco di supporto, suggerirei di utilizzare invece un DialogFragment.

Con il tuo codice Fragment, estendi semplicemente DialogFragment invece di Fragment e usa DialogFragment.show(FragmentManager,String) per visualizzarlo. È possibile eliminare il bordo predefinito chiamando lo setStyle(DialogFragment.STYLE_NO_FRAME, getTheme()) nel metodo onCreate. Puoi ancora aggiungere questo frammento a un layout (come dici tu, su un telefono non vuoi che venga mostrato come popup) e funzionerà come ti aspetti.

+0

Sicuramente la risposta corretta, grazie Inoltre, quando stavamo mostrando una lista nel nostro PopupWindow si è rifiutato di mostrare il ContextMenu che avevamo specificato per la lista. Passare a DialogFragment ci ha permesso di risolverlo. –

+1

Potresti, per favore, spiegare o esemplificare la tua ultima frase, se possibile aggiungendo il frammento a una finestra popup, come esempio iniziale? "Puoi ancora aggiungere questo frammento a un layout (come dici tu, su un telefono non lo vuoi per essere mostrato come popup) e funzionerà come ti aspetti. " – JPMagalhaes

+1

@JPMagalhaes, Strong consiglia di non utilizzare il frammento in PopupWindow poiché potrebbe introdurre problemi di perdita di memoria – Jacky

Problemi correlati