18

Sto creando un elenco di schede con diversi frammenti. Ho notato che, nell'attività principale, ho utilizzato setContentView per ottenere il layout xml e utilizzare findViewById per ottenere la configurazione dell'elemento dell'interfaccia utente corrispondente.Differenza tra setContentView e LayoutInflater

setContentView(R.layout.fragment_tabs); 
mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
mTabHost.setup(); 
mTabManager = new TabManager(this, mTabHost, android.R.id.tabcontent); 

Tuttavia, nella classe frammento diverso, devo utilizzare il gonfiatore invece.

View v = inflater.inflate(R.layout.webview, container, false); 
WebView myBrowser=(WebView)v.findViewById(R.id.mybrowser); 

E entrambe le funzioni sono utilizzate per ottenere il layout xml per creare un oggetto, perché c'è una differenza? Il primo viene utilizzato durante lo onCreate e il secondo durante lo onCreateView? In che situazione dovrei scegliere uno di loro?

risposta

22

setContentView è solo un metodo Activity. Ogni Activity viene fornito con uncon ID "@+id/content" (vale a dire la vista del contenuto). Qualsiasi vista specificata in setContentView sarà la vista per quello Activity. Nota che puoi anche passare un'istanza di una vista a questo metodo, ad es. setContentView(new WebView(this)); La versione del metodo che stai usando gonfierà la vista per te dietro le quinte.

I frammenti, d'altra parte, hanno un metodo del ciclo di vita chiamato onCreateView che restituisce una vista (se ne ha una). Il modo più comune per farlo è quello di gonfiare una vista in XML e restituirla in questo metodo. In questo caso però devi gonfiarlo da solo. I frammenti non hanno un metodo setContentView

+0

Grazie per la risposta, inoltre, è necessario ottenere il file xml e creare un oggetto per esso prima di findViewById? Dal momento che ho trovato qualche esempio nel documento ufficiale non lo è. per esempio. EditText editText = (EditText) findViewById (R.id.email_address); – user782104

+4

Non sono sicuro di aver capito completamente la domanda, quindi se la mia risposta non ha senso, sentitevi liberi di chiedere nuovamente. Attività e viste hanno entrambi un metodo chiamato findViewById(). La versione dell'attività cercherà una vista con l'id specificato all'interno della sua vista del contenuto (quindi, internamente, chiamerà contentView.findViewById()). Ciò significa che ContentView deve essere impostato prima che diventi utilizzabile. Come "setContentView", i frammenti non hanno un metodo per "findViewById" (che ha senso, perché non c'è vista del contenuto). Basta usare getView(). FindViewById() invece per lo stesso comportamento. –

+0

Non hai menzionato che si può usare anche 'LayoutInflater.inflate' in un'attività, in alternativa a' setContentView'. –