• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Fragmentos
2parent.title=Atividades
3parent.link=activities.html
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8  <h2>Neste documento</h2>
9  <ol>
10    <li><a href="#Design">Filosofia do projeto</a></li>
11    <li><a href="#Creating">Criação de um fragmento</a>
12      <ol>
13        <li><a href="#UI">Adição de uma interface do usuário</a></li>
14        <li><a href="#Adding">Adição de um fragmento a uma atividade</a></li>
15      </ol>
16    </li>
17    <li><a href="#Managing">Gerenciamento de fragmentos</a></li>
18    <li><a href="#Transactions">Realização de operações com fragmentos</a></li>
19    <li><a href="#CommunicatingWithActivity">Comunicação com a atividade</a>
20      <ol>
21        <li><a href="#EventCallbacks">Criação de eventos de retornos de chamada para a atividade</a></li>
22        <li><a href="#ActionBar">Adição de itens à barra de ação</a></li>
23      </ol>
24    </li>
25    <li><a href="#Lifecycle">Tratamento do ciclo de vida dos fragmentos</a>
26      <ol>
27        <li><a href="#CoordinatingWithActivity">Coordenação com o ciclo de vida da atividade</a></li>
28      </ol>
29    </li>
30    <li><a href="#Example">Exemplo</a></li>
31  </ol>
32
33  <h2>Classes principais</h2>
34  <ol>
35    <li>{@link android.app.Fragment}</li>
36    <li>{@link android.app.FragmentManager}</li>
37    <li>{@link android.app.FragmentTransaction}</li>
38  </ol>
39
40  <h2>Veja também</h2>
41  <ol>
42    <li><a href="{@docRoot}training/basics/fragments/index.html">Construção de uma IU dinâmica com Fragmentos</a></li>
43    <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Compatibilidade com
44tablets e celulares</a></li>
45  </ol>
46</div>
47</div>
48
49<p>Um {@link android.app.Fragment} representa o comportamento ou uma parte da interface do usuário em um
50{@link android.app.Activity}. É possível combinar vários fragmentos em uma única atividade para compilar
51uma IU de painéis múltiplos e reutilizar um fragmento em diversas atividades. Um fragmento
52é como uma seção modular de uma atividade, que tem o próprio ciclo de vida, recebe os próprios eventos de entrada
53e que pode ser adicionado ou removido com a atividade em execução (uma espécie de "sub-atividade"
54que pode ser reutilizada em diferentes atividades).</p>
55
56<p>Um fragmento deve sempre ser embutido em uma atividade e o ciclo de vida dele
57é diretamente impactado pelo ciclo de vida da atividade do host. Por exemplo, quando a atividade é pausada, todos os fragmentos
58também são e, quando a atividade é destruída, todos os fragmentos também são. No entanto, enquanto
59uma atividade estiver em execução (estiver no <em>estado do ciclo de vida</em> <a href="{@docRoot}guide/components/activities.html#Lifecycle">retomado</a>), é possível
60manipular cada fragmento independentemente, como adicionar ou removê-los. Ao realizar tal operação com fragmentos,
61também é possível adicioná-los a uma pilha de retorno que é gerenciada pela
62atividade &mdash; cada entrada da pilha de retorno na atividade é um registro da operação de fragmento
63que ocorreu. A pilha de retorno permite que o usuário inverta uma operação de fragmento (navegue ao contrário),
64pressionando o botão <em>Voltar</em>.</p>
65
66<p>Ao adicionar um fragmento como parte do layout da atividade, ele viverá em um {@link
67android.view.ViewGroup} dentro da hierarquia de vistas e o fragmento definirá o próprio
68layout da vista.
69É possível inserir um fragmento no layout, declarando-o no arquivo de layout
70da atividade, como um elemento {@code &lt;fragment&gt;} ou a partir do código do aplicativo adicionando-o
71a um {@link android.view.ViewGroup} existente. No entanto, não é necessário que um fragmento faça parte
72do layout da atividade; também é possível usar um fragmento sem a IU como um trabalhador invisível
73da atividade.</p>
74
75<p>Este documento descreve como compilar o aplicativo para usar fragmentos,
76incluindo como os fragmentos podem manter seu estado ao serem adicionados à pilha de retorno da atividade,
77como compartilhar eventos com a atividade e com outros fragmentos da atividade, como contribuir para a barra de ação
78da atividade e muito mais.</p>
79
80
81<h2 id="Design">Filosofia do projeto</h2>
82
83<p>O Android introduziu os fragmentos no Android 3.0 (API de nível 11), principalmente para suportar
84mais projetos de IU flexíveis e dinâmicos em telas grandes, como em tablets. Como a tela de um tablet
85é muito maior que a de um celular, há mais espaço para combinar
86e alternar componentes da IU. Os fragmentos permitem tais projetos sem haver a necessidade de gerenciar
87alterações complexas na hierarquia de vistas. Ao dividir o layout de uma atividade em fragmentos, é possível
88modificar a aparência da atividade em tempo de execução e preservar essas alterações na pilha de retorno,
89que é gerenciada por esta atividade.</p>
90
91<p>Por exemplo, um aplicativo de notícias pode usar um fragmento para exibir uma lista de artigos
92na esquerda e outro fragmento para exibir um artigo na direita &mdash; ambos os fragmentos aparecem
93em uma atividade, lado a lado, e cada fragmento possui o próprio conjunto de métodos de retorno de chamada do ciclo de vida e lidam
94com os próprios eventos de entrada do usuário. Portanto, em vez de usar uma atividade para selecionar um artigo
95e outra atividade para lê-lo, o usuário pode selecionar um artigo e lê-lo por completo dentro
96da mesma atividade, como ilustrado no layout do tablet na figura 1.</p>
97
98<p>Você deve projetar cada fragmento como um componente modular e reutilizável da atividade. Ou seja, como cada fragmento
99define seu próprio layout e comportamento com os próprios retornos de chamada do ciclo de vida, é possível
100incluir um fragmento em várias atividades para poder projetá-lo para reutilização e evitar
101a manipulação direta de um fragmento a partir de outro fragmento. Isto é especialmente importante porque
102um fragmento modular permite alterar as combinações de fragmentos para tamanhos de tela diferentes. Ao projetar o aplicativo
103para ser compatível com tablets e celulares, você poderá reutilizar os fragmentos em diferentes configurações
104de layout para otimizar a experiência do usuário com base no espaço de tela disponível. Por exemplo,
105em um celular, talvez seja necessário separar os fragmentos para fornecer uma IU de painel único
106quando mais de um não se encaixar dentro da mesma atividade.</p>
107
108<img src="{@docRoot}images/fundamentals/fragments.png" alt="" />
109<p class="img-caption"><strong>Figura 1.</strong> Um exemplo de como dois módulos de IU definidos
110pelos fragmentos podem ser combinados em uma atividade de um projeto para tablet mas separados
111em um projeto para celular.</p>
112
113<p>Por exemplo, &mdash; continuando com o exemplo do aplicativo de notícias &mdash; o aplicativo pode embutir
114dois fragmentos na <em>atividade A</em>, quando executado em um dispositivo do tamanho de um tablet. No entanto,
115em uma tela de tamanho de celular, não há espaço suficiente para ambos os fragmentos, então a <em>atividade A</em> inclui
116somente o fragmento da lista de artigos e, quando o usuário seleciona um artigo, ele inicia
117a <em>atividade B</em>, que inclui o segundo fragmento para ler o artigo. Portanto, o aplicativo
118é compatível com tablets e celulares através da reutilização dos fragmentos em combinações diferentes, como ilustrado
119na figura 1.</p>
120
121<p>Para obter mais informações sobre o projeto de aplicativos com diferentes combinações de fragmentos
122para configurações de tela diferentes, consulte o guia <a href="{@docRoot}guide/practices/tablets-and-handsets.html">Compatibilidade com tablets e celulares</a>.</p>
123
124
125
126<h2 id="Creating">Criação de um fragmento</h2>
127
128<div class="figure" style="width:327px">
129<img src="{@docRoot}images/fragment_lifecycle.png" alt="" />
130<p class="img-caption"><strong>Figura 2.</strong> O ciclo de vida de um fragmento
131(enquanto sua atividade está em execução).</p>
132</div>
133
134<p>Para criar um fragmento, é preciso criar uma subclasse de {@link android.app.Fragment} (ou uma respectiva
135subclasse existente). A classe {@link android.app.Fragment} tem um código que é muito parecido
136com o de uma {@link android.app.Activity}. Ele contém métodos de retorno de chamada semelhantes aos de uma atividade,
137como {@link android.app.Fragment#onCreate onCreate()}, {@link android.app.Fragment#onStart onStart()},
138{@link android.app.Fragment#onPause onPause()} e {@link android.app.Fragment#onStop onStop()}. Na verdade,
139caso esteja convertendo um aplicativo do Android existente para usar os fragmentos, basta mover
140o código dos métodos de retorno de chamada da atividade para os respectivos métodos de retorno de chamada
141do fragmento.</p>
142
143<p>Geralmente, deve-se implementar pelo menos os seguintes métodos de ciclo de vida:</p>
144
145<dl>
146  <dt>{@link android.app.Fragment#onCreate onCreate()}</dt>
147  <dd>O sistema o chama ao criar o fragmento. Dentro da implementação,
148deve-se inicializar os componentes essenciais do fragmento que deseja-se reter quando o fragmento
149for pausado ou interrompido e, em seguida, retomado.</dd>
150  <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt>
151  <dd>O sistema chama isto quando é o momento de o fragmento desenhar a interface do usuário
152pela primeira vez. Para desenhar uma IU para o fragmento, você deve retornar uma {@link android.view.View}
153deste método, que é a raiz do layout do fragmento. É possível retornar como nulo se o fragmento
154não fornecer uma IU.</dd>
155  <dt>{@link android.app.Activity#onPause onPause()}</dt>
156  <dd>O sistema chama esse método como o primeiro indício de que o usuário está saindo
157do fragmento (embora não seja sempre uma indicação de que o fragmento está sendo destruído). É quando geralmente
158deve-se confirmar qualquer alteração que deva se manter além da sessão atual do usuário (porque
159o usuário pode não retornar).</dd>
160</dl>
161
162<p>A maioria dos aplicativos deve implementar pelo menos três destes métodos para cada fragmento,
163mas há vários outros métodos de retorno de chamada que você deve usar para lidar com diversos estágios
164do ciclo de vida do fragmento. Todos os métodos de retorno de chamada do ciclo de vida são abordados com mais detalhes na seção
165<a href="#Lifecycle">Tratamento do ciclo de vida dos fragmentos</a>.</p>
166
167
168<p>Há também algumas subclasses que você pode querer estender, em vez de a classe {@link
169android.app.Fragment} de base:</p>
170
171<dl>
172  <dt>{@link android.app.DialogFragment}</dt>
173  <dd>Exibe uma caixa de diálogo flutuante. Usar esta classe para criar uma caixa de diálogo é uma boa alternativa
174para usar métodos auxiliares das caixas de diálogo na classe {@link android.app.Activity},
175pois é possível incorporar uma caixa de diálogo de fragmento na pilha de retorno dos fragmentos gerenciados pela atividade,
176permitindo que o usuário retorne a um fragmento dispensado.</dd>
177
178  <dt>{@link android.app.ListFragment}</dt>
179  <dd>Exibe uma lista de itens que são gerenciados por um adaptador (como um {@link
180android.widget.SimpleCursorAdapter}), semelhante à {@link android.app.ListActivity}. Ele fornece vários métodos
181para gerenciar uma vista de lista, como o retorno de chamada {@link
182android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()}
183para lidar com eventos de clique.</dd>
184
185  <dt>{@link android.preference.PreferenceFragment}</dt>
186  <dd>Exibe uma hierarquia de objetos {@link android.preference.Preference} como uma lista,
187parecido com {@link android.preference.PreferenceActivity}. Isto é útil ao criar uma atividade
188de "configurações" para o aplicativo.</dd>
189</dl>
190
191
192<h3 id="UI">Adição de uma interface do usuário</h3>
193
194<p>Um fragmento é geralmente usado como parte de uma interface do usuário da atividade e contribui
195para a atividade com seu próprio layout.</p>
196
197<p>Para fornecer um layout para um fragmento, você deve implementar o método de retorno de chamada {@link
198android.app.Fragment#onCreateView onCreateView()}, que o sistema Android chama
199no momento em que o fragmento deve desenhar o layout. A implementação deste método deve retornar
200uma {@link android.view.View}, que é a raiz do layout do fragmento.</p>
201
202<p class="note"><strong>Observação:</strong> se o fragmento for uma subclasse de {@link
203android.app.ListFragment}, a implementação padrão retornará uma {@link android.widget.ListView}
204de {@link android.app.Fragment#onCreateView onCreateView()}, então não será necessário implementá-lo.</p>
205
206<p>Para retornar um layout de {@link
207android.app.Fragment#onCreateView onCreateView()}, é possível inflá-lo a partir de um <a href="{@docRoot}guide/topics/resources/layout-resource.html">recurso de layout</a> definido no XML. Para ajudar
208a fazer isto, o {@link android.app.Fragment#onCreateView onCreateView()} fornece
209um objeto {@link android.view.LayoutInflater}.</p>
210
211<p>Por exemplo, a seguir há uma subclasse de {@link android.app.Fragment} que carrega um layout
212do arquivo {@code example_fragment.xml}:</p>
213
214<pre>
215public static class ExampleFragment extends Fragment {
216    &#64;Override
217    public View onCreateView(LayoutInflater inflater, ViewGroup container,
218                             Bundle savedInstanceState) {
219        // Inflate the layout for this fragment
220        return inflater.inflate(R.layout.example_fragment, container, false);
221    }
222}
223</pre>
224
225<div class="sidebox-wrapper">
226<div class="sidebox">
227  <h3>Criação de um layout</h3>
228  <p>No exemplo acima, {@code R.layout.example_fragment} é uma referência para um recurso de layout
229chamado {@code example_fragment.xml}, salvo nos recursos do aplicativo. Para obter informações sobre
230como criar um layout no XML, consulte a documentação <a href="{@docRoot}guide/topics/ui/index.html">Interface do usuário</a>
231.</p>
232</div>
233</div>
234
235<p>O parâmetro {@code container} passado para {@link android.app.Fragment#onCreateView
236onCreateView()} é o pai de {@link android.view.ViewGroup} (do layout da atividade)
237em que o layout do fragmento
238será inserido. O parâmetro {@code savedInstanceState} é um {@link android.os.Bundle}
239que fornece dados sobre a instância anterior do fragmento, se o fragmento estiver sendo retomado
240(a restauração de estado é abordada mais detalhadamente na seção <a href="#Lifecycle">Tratamento do ciclo
241de vida dos fragmentos</a>).</p>
242
243<p>O método {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()}
244usa três argumentos:</p>
245<ul>
246  <li>O ID de recurso do layout que você quer inflar.</li>
247  <li>O {@link android.view.ViewGroup} que será pai do layout inflado. Passar o {@code
248container} é importante para que o sistema aplique os parâmetros de layout à vista raiz
249do layout inflado, especificado pela vista pai em que está ocorrendo.</li>
250  <li>Um booleano que indica se o layout inflado deve ser anexado a {@link
251android.view.ViewGroup} (o segundo parâmetro) durante a inflação (neste caso,
252isto é falso, pois o sistema já está inserindo o layout inflado no {@code
253container} &mdash; retornar como verdadeiro criaria um grupo de vistas redundante no layout final).</li>
254</ul>
255
256<p>Este é o modo de criar um fragmento que fornece um layout. A seguir,
257é preciso adicionar o fragmento à atividade.</p>
258
259
260
261<h3 id="Adding">Adição de um fragmento a uma atividade</h3>
262
263<p>Geralmente, um fragmento contribui com a atividade do host com uma parte da IU, que é embutida como parte
264da hierarquia de vistas geral da atividade. Há duas formas de adicionar um fragmento ao layout
265da atividade:</p>
266
267<ul>
268  <li><b>Declarar o fragmento dentro do arquivo de layout da atividade.</b>
269<p>Neste caso,
270é possível especificar as propriedades do layout para o fragmento como se fosse uma vista. Por exemplo, a seguir há o arquivo de layout
271para uma atividade com dois fragmentos:</p>
272<pre>
273&lt;?xml version="1.0" encoding="utf-8"?&gt;
274&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
275    android:orientation="horizontal"
276    android:layout_width="match_parent"
277    android:layout_height="match_parent"&gt;
278    &lt;fragment android:name="com.example.news.ArticleListFragment"
279            android:id="@+id/list"
280            android:layout_weight="1"
281            android:layout_width="0dp"
282            android:layout_height="match_parent" /&gt;
283    &lt;fragment android:name="com.example.news.ArticleReaderFragment"
284            android:id="@+id/viewer"
285            android:layout_weight="2"
286            android:layout_width="0dp"
287            android:layout_height="match_parent" /&gt;
288&lt;/LinearLayout&gt;
289</pre>
290  <p>O atributo {@code android:name} em {@code &lt;fragment&gt;} especifica a classe {@link
291android.app.Fragment} a instanciar no layout.</p>
292
293<p>Quando o sistema cria este layout de atividade, ele instancia cada fragmento especificado
294no layout e chama o método {@link android.app.Fragment#onCreateView onCreateView()} para cada um
295para recuperar o layout de cada fragmento. O sistema insere a {@link android.view.View} retornada
296pelo fragmento diretamente no lugar do elemento {@code &lt;fragment&gt;}.</p>
297
298<div class="note">
299  <p><strong>Observação:</strong> cada fragmento requer um identificador único
300que o sistema possa usar para restaurá-lo se a atividade for reiniciada (e que possa ser usado
301para capturar o fragmento para realizar operações, como a remoção). Há três maneiras de fornecer
302um ID para um fragmento:</p>
303  <ul>
304    <li>Fornecer o atributo {@code android:id} com um ID único.</li>
305    <li>Fornecer o atributo {@code android:tag} com uma string única.</li>
306    <li>Caso não forneça nenhuma das alternativas anteriores, o sistema usará o ID da vista
307do recipiente.</li>
308  </ul>
309</div>
310  </li>
311
312  <li><b>Ou adicionar programaticamente o fragmento a um {@link android.view.ViewGroup} existente.</b>
313<p>A qualquer momento, enquanto a atividade está em execução, é possível adicionar fragmentos ao layout da atividade. Você precisa
314apenas especificar um {@link
315android.view.ViewGroup} para posicionar o fragmento.</p>
316  <p>Para realizar operações de fragmentos na atividade (como adicionar, remover ou substituir
317um fragmento), você deve usar APIs de {@link android.app.FragmentTransaction}. É possível adquirir
318uma instância de {@link android.app.FragmentTransaction} da {@link android.app.Activity} desta maneira:</p>
319
320<pre>
321FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}
322FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
323</pre>
324
325<p>É possível adicionar um fragmento usando o método {@link
326android.app.FragmentTransaction#add(int,Fragment) add()}, especificando o fragmento que será adicionado
327e a vista em que será inserido. Por exemplo:</p>
328
329<pre>
330ExampleFragment fragment = new ExampleFragment();
331fragmentTransaction.add(R.id.fragment_container, fragment);
332fragmentTransaction.commit();
333</pre>
334
335  <p>O primeiro argumento passado para {@link android.app.FragmentTransaction#add(int,Fragment) add()}
336é {@link android.view.ViewGroup}, onde o fragmento deve ser colocado, especificado
337pelo ID de recurso e o segundo parâmetro é o fragmento a ser adicionado.</p>
338  <p>Ao realizar as alterações
339com {@link android.app.FragmentTransaction},
340deve-se chamar{@link android.app.FragmentTransaction#commit} para que as alterações entrem em vigor.</p>
341  </li>
342</ul>
343
344
345<h4 id="AddingWithoutUI">Adição de um fragmento sem IU</h4>
346
347<p>O exemplo acima mostra como adicionar um fragmento à atividade para fornecer uma IU. No entanto,
348é possível também usar um fragmento para fornecer o comportamento de segundo plano para a atividade sem apresentar
349IU adicional.</p>
350
351<p>Para adicionar um fragmento sem uma IU, adicione o fragmento da atividade usando {@link
352android.app.FragmentTransaction#add(Fragment,String)} (fornecendo uma "tag" de string única
353para o fragmento, em vez de um ID de vista). Isto adiciona o fragmento, mas, como ele não está associado
354a uma vista no layout da atividade, não recebe uma chamada de {@link
355android.app.Fragment#onCreateView onCreateView()}. Portanto, não é necessário implementar este método.</p>
356
357<p>Fornecer uma tag de string para o fragmento não é algo estrito para fragmentos que não sejam de IU &mdash; é possível também
358fornecer tags de string para fragmentos que possuam uma IU &mdash; mas, se o fragmento não possuir uma IU,
359a tag de string é a única maneira de identificá-lo. Caso queira obter o fragmento da atividade posteriormente,
360você precisará usar {@link android.app.FragmentManager#findFragmentByTag
361findFragmentByTag()}.</p>
362
363<p>Para ver uma atividade de exemplo que usa um fragmento como um trabalhador de segundo plano, sem uma IU, consulte o exemplo de {@code
364FragmentRetainInstance.java}, incluso nos exemplos do SDK (disponibilizados pelo
365Android SDK Manager) e localizado no sistema como
366<code>&lt;sdk_root&gt;/APIDemos/app/src/main/java/com/example/android/apis/app/FragmentRetainInstance.java</code>.</p>
367
368
369
370<h2 id="Managing">Gerenciamento de fragmentos</h2>
371
372<p>Para gerenciar os fragmentos na atividade, você precisa usar {@link android.app.FragmentManager}. Para adquiri-lo,
373chame {@link android.app.Activity#getFragmentManager()} a partir da atividade.</p>
374
375<p>Algumas das coisas que você pode fazer com {@link android.app.FragmentManager} incluem:</p>
376
377<ul>
378  <li>Adquirir fragmentos existentes na atividade, com {@link
379android.app.FragmentManager#findFragmentById findFragmentById()} (para fragmentos que forneçam uma IU
380no layout da atividade) ou {@link android.app.FragmentManager#findFragmentByTag
381findFragmentByTag()} (para fragmentos que forneçam ou não uma IU).</li>
382  <li>Retire os fragmentos da pilha de retorno com {@link
383android.app.FragmentManager#popBackStack()} (simulando um comando de <em>Voltar</em> do usuário).</li>
384  <li>Registre uma escuta para as alterações na pilha de retorno com {@link
385android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li>
386</ul>
387
388<p>Para obter mais informações sobre esses e outros métodos, consulte a documentação da classe {@link
389android.app.FragmentManager}.</p>
390
391<p>Como demonstrado na seção anterior, é possível usar o {@link android.app.FragmentManager}
392para abrir uma {@link android.app.FragmentTransaction}, que permite realizar operações,
393como adicionar e remover fragmentos.</p>
394
395
396<h2 id="Transactions">Realização de operações com fragmentos</h2>
397
398<p>Um grande recurso fornecido por fragmentos em atividades é a possibilidade de adicionar, remover, substituir
399e realizar outras ações com eles em resposta à interação do usuário. Cada conjunto de alterações que forem realizadas
400na atividade é chamado de operação e podem ser feitas usando APIs em {@link
401android.app.FragmentTransaction}. Também é possível salvar cada operação em uma pilha de retorno gerenciada pela atividade,
402permitindo que o usuário navegue inversamente por meio de alterações de fragmento (semelhante à navegação
403inversa por meio de atividades).</p>
404
405<p>É possível adquirir uma instância de {@link android.app.FragmentTransaction} a partir do {@link
406android.app.FragmentManager} da seguinte forma:</p>
407
408<pre>
409FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()};
410FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
411</pre>
412
413<p>Cada operação é um conjunto de alterações que você deseja realizar ao mesmo tempo. É possível definir
414todas as alterações desejadas para uma operação usando métodos como {@link
415android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()}
416e {@link android.app.FragmentTransaction#replace replace()}. Em seguida, para aplicar a operação
417à atividade, deve-se chamar {@link android.app.FragmentTransaction#commit()}.</p>
418</dl>
419
420<p>Antes de chamar {@link
421android.app.FragmentTransaction#commit()}, no entanto, você pode querer chamar {@link
422android.app.FragmentTransaction#addToBackStack addToBackStack()} para adicionar a operação
423a uma pilha de retorno de operações de fragmentos. A pilha de retorno é gerenciada pela atividade
424e permite que o usuário retorne ao estado anterior do fragmento, ao pressionar o botão <em>Voltar</em>.</p>
425
426<p>Por exemplo, a seguir é apresentado o modo de substituir um fragmento por outro e preservar
427o estado anterior da pilha de retorno:</p>
428
429<pre>
430// Create new fragment and transaction
431Fragment newFragment = new ExampleFragment();
432FragmentTransaction transaction = getFragmentManager().beginTransaction();
433
434// Replace whatever is in the fragment_container view with this fragment,
435// and add the transaction to the back stack
436transaction.replace(R.id.fragment_container, newFragment);
437transaction.addToBackStack(null);
438
439// Commit the transaction
440transaction.commit();
441</pre>
442
443<p>Neste exemplo, {@code newFragment} substitui qualquer fragmento (se houver) que estiver
444no recipiente do layout identificado pelo ID {@code R.id.fragment_container}. Ao chamar {@link
445android.app.FragmentTransaction#addToBackStack addToBackStack()}, a operação de substituição
446é salva na pilha de retorno para que o usuário possa reverter a operação
447e voltar ao fragmento anterior pressionando o botão <em>Voltar</em>.</p>
448
449<p>Se você adicionar várias alterações à operação (como outro {@link
450android.app.FragmentTransaction#add add()} ou {@link android.app.FragmentTransaction#remove
451remove()}) e chamar {@link
452android.app.FragmentTransaction#addToBackStack addToBackStack()}, todas as alterações aplicadas
453antes de chamar {@link android.app.FragmentTransaction#commit commit()} serão adicionadas
454à pilha de retorno como uma única operação e o botão <em>Voltar</em> reverterá todas elas juntas.</p>
455
456<p>A ordem em que você adicionar as alterações em {@link android.app.FragmentTransaction} não importa,
457exceto que:</p>
458<ul>
459  <li>Você deve chamar {@link android.app.FragmentTransaction#commit()} por último</li>
460  <li>Caso esteja adicionando vários fragmentos ao mesmo recipiente, a ordem em que
461adicioná-los determina a ordem em que eles aparecerão na hierarquia de vistas</li>
462</ul>
463
464<p>Caso você não chame {@link android.app.FragmentTransaction#addToBackStack(String)
465addToBackStack()} ao realizar uma operação que remove um fragmento, este fragmento
466será destruído quando a operação for realizada e o usuário não poderá navegar de volta a ele. Considerando que,
467se você não chamar {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()}
468ao remover um fragmento, o fragmento será <em>interrompido</em> e será retomado se o usuário
469navegar de volta.</p>
470
471<p class="note"><strong>Dica:</strong> para cada operação de fragmento, é possível aplicar uma animação
472de transição, chamando {@link android.app.FragmentTransaction#setTransition setTransition()}
473antes da realização.</p>
474
475<p>Chamar {@link android.app.FragmentTransaction#commit()} não realiza a operação
476imediatamente. Em vez disso, o parâmetro agenda a execução no encadeamento da IU da atividade (o encadeamento “main”, ou principal)
477assim que possível. Se necessário, no entanto, é possível chamar {@link
478android.app.FragmentManager#executePendingTransactions()} a partir do encadeamento da IU para executar imediatamente
479as operações enviadas por {@link android.app.FragmentTransaction#commit()}. Tal medida, geralmente,
480não é necessária, a não ser que a operação represente uma dependência para trabalhos em outros encadeamentos.</p>
481
482<p class="caution"><strong>Atenção:</strong> É possível realizar uma operação usando {@link
483android.app.FragmentTransaction#commit commit()} somente antes da atividade <a href="{@docRoot}guide/components/activities.html#SavingActivityState">salvar
484seu estado</a> (quando o usuário deixa a atividade). Caso tente efetivas as alterações após este ponto,
485uma exceção será lançada. Isto acontece porque o estado após a efetivação pode ser perdido se a atividade
486precisar ser restaurada. Para situações em que não haja problema em perder a efetivação, use {@link
487android.app.FragmentTransaction#commitAllowingStateLoss()}.</p>
488
489
490
491
492<h2 id="CommunicatingWithActivity">Comunicação com a atividade</h2>
493
494<p>Apesar de {@link android.app.Fragment} ser implementado como um objeto independente
495de uma {@link android.app.Activity} e poder ser usado dentro de várias atividades, uma dada instância
496de um fragmento é diretamente vinculada à atividade que o contém.</p>
497
498<p>Especificamente, o fragmento pode acessar a instância {@link android.app.Activity} com {@link
499android.app.Fragment#getActivity()} e realizar facilmente tarefas como encontrar uma vista
500no layout da atividade:</p>
501
502<pre>
503View listView = {@link android.app.Fragment#getActivity()}.{@link android.app.Activity#findViewById findViewById}(R.id.list);
504</pre>
505
506<p>Do mesmo modo, a atividade pode chamar métodos no fragmento adquirindo uma referência
507para o {@link android.app.Fragment} a partir do {@link android.app.FragmentManager} usando {@link
508android.app.FragmentManager#findFragmentById findFragmentById()} ou {@link
509android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. Por exemplo:</p>
510
511<pre>
512ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
513</pre>
514
515
516<h3 id="EventCallbacks">Criação de retornos de chamada de evento para a atividade</h3>
517
518<p>Em alguns casos, um fragmento que compartilhe eventos com a atividade pode ser necessário. Uma boa maneira de fazer isto
519é definir uma interface de retorno de chamada dentro do fragmento e solicitar que a atividade do host
520implemente-a. Quando a atividade recebe um retorno de chamada por meio da interface, ela pode compartilhar as informações
521com outros fragmentos no layout conforme necessário.</p>
522
523<p>Por exemplo, se um aplicativo de notícias em uma atividade tiver dois fragmentos &mdash; um para exibir uma lista
524de artigos (fragmento A) e outro para exibir um artigo (fragmento B) &mdash; então o fragmento A
525deve informar à atividade quando um item de lista é selecionado para que ela possa instruir o fragmento B a exibir o artigo. Neste caso,
526 a interface {@code OnArticleSelectedListener} é declarada dentro do fragmento A:</p>
527
528<pre>
529public static class FragmentA extends ListFragment {
530    ...
531    // Container Activity must implement this interface
532    public interface OnArticleSelectedListener {
533        public void onArticleSelected(Uri articleUri);
534    }
535    ...
536}
537</pre>
538
539<p>Portanto, a atividade que hospeda o fragmento implementa a interface {@code OnArticleSelectedListener}
540e suspende
541{@code onArticleSelected()} para notificar o fragmento B do evento do fragmento A. Para garantir
542que a atividade do host implemente esta interface, o método de retorno de chamada de {@link
543android.app.Fragment#onAttach onAttach()} do fragmento A (que o sistema chama ao adicionar
544o fragmento à atividade) instanciará {@code OnArticleSelectedListener}
545lançando a {@link android.app.Activity}, que é passada para {@link android.app.Fragment#onAttach
546onAttach()}:</p>
547
548<pre>
549public static class FragmentA extends ListFragment {
550    OnArticleSelectedListener mListener;
551    ...
552    &#64;Override
553    public void onAttach(Activity activity) {
554        super.onAttach(activity);
555        try {
556            mListener = (OnArticleSelectedListener) activity;
557        } catch (ClassCastException e) {
558            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
559        }
560    }
561    ...
562}
563</pre>
564
565<p>Se a atividade não implementar a interface, o fragmento lançará
566{@link java.lang.ClassCastException}.
567Se for bem-sucedida, o membro {@code mListener} reterá uma referência da implementação da atividade
568de {@code OnArticleSelectedListener}, para que o fragmento A possa compartilhar os eventos com a atividade
569chamando métodos definidos pela interface {@code OnArticleSelectedListener}. Por exemplo, se o fragmento A
570for uma extensão de {@link android.app.ListFragment}, sempre
571que o usuário clicar em um item de lista, o sistema chamará {@link android.app.ListFragment#onListItemClick
572onListItemClick()} no fragmento que, em seguida, chamará {@code onArticleSelected()} para compartilhar
573o evento com a atividade:</p>
574
575<pre>
576public static class FragmentA extends ListFragment {
577    OnArticleSelectedListener mListener;
578    ...
579    &#64;Override
580    public void onListItemClick(ListView l, View v, int position, long id) {
581        // Append the clicked item's row ID with the content provider Uri
582        Uri noteUri = ContentUris.{@link android.content.ContentUris#withAppendedId withAppendedId}(ArticleColumns.CONTENT_URI, id);
583        // Send the event and Uri to the host activity
584        mListener.onArticleSelected(noteUri);
585    }
586    ...
587}
588</pre>
589
590<p>O parâmetro {@code id} passado para {@link
591android.app.ListFragment#onListItemClick onListItemClick()} é o ID da linha do item clicado
592que a atividade (ou outro fragmento) usa para resgatar o artigo do {@link
593android.content.ContentProvider} do aplicativo.</p>
594
595<p><!--To see a complete implementation of this kind of callback interface, see the <a
596href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->Mais informações sobre
597como usar o provedor de conteúdo estão disponíveis na documentação <a href="{@docRoot}guide/topics/providers/content-providers.html">Provedores de conteúdo</a>.</p>
598
599
600
601<h3 id="ActionBar">Adição de itens à barra de ação</h3>
602
603<p>Os fragmentos podem contribuir com itens de menu para o <a href="{@docRoot}guide/topics/ui/menus.html#options-menu">menu de opções</a> da atividade (e, consequentemente, para a <a href="{@docRoot}guide/topics/ui/actionbar.html">barra de ação</a>) implementando
604{@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. Para que este método
605receba chamadas, no entanto, você deve chamar {@link
606android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} durante {@link
607android.app.Fragment#onCreate(Bundle) onCreate()} para indicar que o fragmento
608gostaria de adicionar itens ao menu de opções (caso contrário, o fragmento não receberá uma chamada
609para {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()}).</p>
610
611<p>Quaisquer itens adicionados ao menu de opções do fragmento são anexados
612aos itens de menu existentes. O fragmento também recebe retornos de chamada para {@link
613android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} quando um item de menu
614é selecionado.</p>
615
616<p>Também é possível registrar uma vista no layout do fragmento para fornecer um menu de contexto chamando {@link
617android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. Quando o usuário
618abre o menu de contexto, o fragmento recebe uma chamada de {@link
619android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo)
620onCreateContextMenu()}. Quando o usuário seleciona um item, o fragmento recebe uma chamada de {@link
621android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p>
622
623<p class="note"><strong>Observação:</strong> apesar de o fragmento receber um retorno de chamada selecionado no item
624para cada item de menu que adiciona, a atividade é a primeira a receber o respectivo retorno de chamada quando o usuário
625seleciona um item de menu. Se a implementação da atividade do retorno de chamada selecionado no item não
626lida com o item selecionado, o evento é passado para o retorno de chamada do fragmento. Isto é verdadeiro
627para o menu de opções e os menus de contexto.</p>
628
629<p>Para obter mais informações sobre menus, consulte os guias do desenvolvedor <a href="{@docRoot}guide/topics/ui/menus.html">Menus</a> e <a href="{@docRoot}guide/topics/ui/actionbar.html">Barra de ação</a>.</p>
630
631
632
633
634<h2 id="Lifecycle">Tratamento do ciclo de vida dos fragmentos</h2>
635
636<div class="figure" style="width:350px">
637<img src="{@docRoot}images/activity_fragment_lifecycle.png" alt="" />
638<p class="img-caption"><strong>Figura 3.</strong> O efeito do ciclo de vida da atividade no ciclo de vida
639do fragmento.</p>
640</div>
641
642<p>Gerenciar o ciclo de vida de um fragmento é muito parecido com gerenciar o ciclo de vida de uma atividade. Como uma atividade,
643um fragmento pode existir em três estados:</p>
644
645<dl>
646  <dt><i>Retomado</i></dt>
647    <dd>O fragmento é visível na atividade em execução.</dd>
648
649  <dt><i>Pausado</i></dt>
650    <dd>Outra atividade está em primeiro plano, mas a atividade em que este fragmento
651vive ainda está visível (a atividade de primeiro plano é parcialmente transparente
652ou não cobre a tela inteira).</dd>
653
654  <dt><i>Interrompido</i></dt>
655    <dd>O fragmento não é visível. A atividade do host foi interrompida
656ou o fragmento foi removido da atividade mas adicionado à pilha de retorno. Um fragmento interrompido
657ainda está vivo (todas as informações do membro e de estado estão retidas no sistema). No entanto,
658não está mais visível e será eliminado se a atividade também for.</dd>
659</dl>
660
661<p>Além disso, como uma atividade, é possível reter o estado de um fragmento usando um {@link
662android.os.Bundle}, caso o processo da atividade seja eliminado e você precise restaurar
663o estado do fragmento quando a atividade for recriada. É possível salvar o estado durante o retorno de chamada {@link
664android.app.Fragment#onSaveInstanceState onSaveInstanceState()} do fragmento e restaurá-lo
665durante {@link android.app.Fragment#onCreate onCreate()}, {@link
666android.app.Fragment#onCreateView onCreateView()} ou {@link
667android.app.Fragment#onActivityCreated onActivityCreated()}. Para obter mais informações sobre
668como salvar o estado, consulte a documentação <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Atividades</a>
669.</p>
670
671<p>A diferença mais significante entre o ciclo de vida de uma atividade e de um fragmento
672é o armazenamento em suas respectivas pilhas de retorno. Por padrão, uma atividade é colocada de volta na pilha de retorno de atividades,
673que é gerenciada pelo sistema, quando interrompida (para que o usuário possa navegar
674a ela com o botão <em>Voltar</em>, como discutido em <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tarefas e pilha de retorno</a>).
675No entanto, um fragmento é posicionado em uma pilha de retorno gerenciada pela atividade do host somente
676ao solicitar explicitamente que a instância seja salva chamando {@link
677android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} durante uma operação
678que remove o fragmento.</p>
679
680<p>Caso contrário, gerenciar o ciclo de vida do fragmento é muito semelhante a gerenciar
681o ciclo de vida da atividade. Portanto, as mesmas práticas para <a href="{@docRoot}guide/components/activities.html#Lifecycle">gerenciar o ciclo de vida
682da atividade</a> aplicam-se aos fragmentos. O que você também precisa entender, no entanto, é como a vida
683da atividade afeta a vida do fragmento.</p>
684
685<p class="caution"><strong>Atenção:</strong> caso precise de um objeto {@link android.content.Context}
686dentro do {@link android.app.Fragment}, é possível chamar {@link android.app.Fragment#getActivity()}.
687No entanto, tome cuidado para chamar {@link android.app.Fragment#getActivity()} somente quando o fragmento
688estiver anexado a uma atividade. Quando o fragmento ainda não estiver anexado, ou tiver sido desvinculado durante o fim
689do seu ciclo de vida, {@link android.app.Fragment#getActivity()} retornará como nulo.</p>
690
691
692<h3 id="CoordinatingWithActivity">Coordenação do ciclo de vida da atividade</h3>
693
694<p>O ciclo de vida da atividade em que o fragmento vive afeta diretamente o ciclo de vida
695do fragmento, da mesma forma que um retorno de chamada de cada ciclo de vida da atividade resulta em um retorno de chamada semelhante
696de cada fragmento. Por exemplo, quando a atividade receber {@link android.app.Activity#onPause},
697cada fragmento na atividade receberá {@link android.app.Fragment#onPause}.</p>
698
699<p>Os fragmentos têm alguns retornos de chamada do ciclo de vida extras. No entanto, isto trata da interação única
700com a atividade para realizar ações como compilar e destruir a IU do fragmento. Esses
701métodos adicionais de retorno de chamada são:</p>
702
703<dl>
704  <dt>{@link android.app.Fragment#onAttach onAttach()}</dt>
705    <dd>Chamado quando o fragmento tiver sido associado à atividade ({@link
706android.app.Activity} é passado aqui).</dd>
707  <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt>
708    <dd>Chamado para criar a hierarquia de vistas associada ao fragmento.</dd>
709  <dt>{@link android.app.Fragment#onActivityCreated onActivityCreated()}</dt>
710    <dd>Chamado quando o método {@link android.app.Activity#onCreate
711onCreate()} da atividade tiver retornado.</dd>
712  <dt>{@link android.app.Fragment#onDestroyView onDestroyView()}</dt>
713    <dd>Chamado quando a hierarquia de vistas associada ao fragmento estiver sendo removida.</dd>
714  <dt>{@link android.app.Fragment#onDetach onDetach()}</dt>
715    <dd>Chamado quando o fragmento estiver sendo desassociado da atividade.</dd>
716</dl>
717
718<p>O fluxo do ciclo de vida do fragmento, afetado pela atividade do host, como ilustrado
719pela figura 3. Nesta figura, é possível ver como cada estado sucessivo da atividade determina
720qual método de retorno de chamada um fragmento pode receber. Por exemplo, quando a atividade recebe o retorno de chamada {@link
721android.app.Activity#onCreate onCreate()}, um fragmento na atividade recebe nada mais
722do que o retorno de chamada {@link android.app.Fragment#onActivityCreated onActivityCreated()}.</p>
723
724<p>Quando a atividade atinge o estado retomado, é possível adicionar e remover fragmentos
725dela livremente. Portanto, somente quando a atividade estiver no estado retomado, o ciclo de vida
726de um fragmento poderá alterar-se de forma independente.</p>
727
728<p>No entanto, quando a atividade deixa o estado retomado, o fragmento é novamente forçado
729a passar pelo ciclo de vida pela atividade.</p>
730
731
732
733
734<h2 id="Example">Exemplo</h2>
735
736<p>Para juntar tudo que foi discutido neste documento, abaixo há um exemplo de uma atividade
737que usa dois fragmentos para criar um layout de dois painéis. A atividade abaixo inclui um fragmento
738para exibir uma lista de títulos de peças de Shakespeare e outra para exibir um resumo da peça,
739quando selecionada na lista. Ela também determina como fornecer diferentes configurações de fragmentos,
740com base na configuração da tela.</p>
741
742<p class="note"><strong>Observação:</strong> O código fonte completo desta atividade está disponível em
743<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code
744FragmentLayout.java}</a>.</p>
745
746<p>A atividade principal aplica-se de maneira comum, durante {@link
747android.app.Activity#onCreate onCreate()}:</p>
748
749{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java main}
750
751<p>O layout aplicado é {@code fragment_layout.xml}:</p>
752
753{@sample development/samples/ApiDemos/res/layout-land/fragment_layout.xml layout}
754
755<p>Usando este layout, o sistema instancia {@code TitlesFragment} (que lista os títulos
756das peças) assim que a atividade carrega o layout, enquanto que {@link android.widget.FrameLayout}
757(onde o fragmento para exibir o resumo da peça aparecerá) consome o espaço do lado direito da tela,
758 mas primeiramente permanece vazio. Como verá abaixo, ele não estará visível até que o usuário selecione um item
759na lista em que um fragmento esteja posicionado no {@link android.widget.FrameLayout}.</p>
760
761<p>No entanto, nem todas as configurações de tela são grandes o suficiente para exibir a lista
762de peças e o resumo, lado a lado. Portanto, o layout acima é usado somente para configuração
763de tela de paisagem, salvando-o em {@code res/layout-land/fragment_layout.xml}.</p>
764
765<p>Por isso, quando a tela está na orientação de retrato, o sistema aplica o seguinte layout,
766que é salvo em {@code res/layout/fragment_layout.xml}:</p>
767
768{@sample development/samples/ApiDemos/res/layout/fragment_layout.xml layout}
769
770<p>Este layout inclui somente {@code TitlesFragment}. Isto significa que, quando o dispositivo
771está na orientação de retrato, somente a lista de título das peças está disponível. Portanto, quando o usuário clicar
772em um item da lista nesta configuração, o aplicativo iniciará uma nova atividade para exibir o resumo,
773em vez de carregar um segundo fragmento.</p>
774
775<p>A seguir, é possível ver como isto é realizado com classes de fragmento. Primeiro, {@code
776TitlesFragment}, que exibe a lista de peças de Shakespeare. Este fragmento estende {@link
777android.app.ListFragment} e confia nele para lidar com grande parte do trabalho da vista de lista.</p>
778
779<p>Enquanto inspeciona este código, observe que há dois possíveis comportamentos quando um usuário
780clica em um item de lista: dependendo de qual dos dois layouts está ativo, ele pode criar e exibir
781um novo fragmento para exibir os detalhes na mesma atividade (adicionando o fragmento {@link
782android.widget.FrameLayout}), ou iniciar uma nova atividade (onde o fragmento possa ser exibido).</p>
783
784{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java titles}
785
786<p>O segundo fragmento, {@code DetailsFragment}, exibe o resumo da peça para o item selecionado
787na lista de {@code TitlesFragment}:</p>
788
789{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java details}
790
791<p>Uma nova chamada da classe {@code TitlesFragment}, ou seja, se o usuário clicar em um item de lista
792e o layout original <em>não</em> incluir a vista {@code R.id.details} (a que
793{@code DetailsFragment} pertence), o aplicativo iniciará a atividade {@code DetailsActivity}
794para exibir o conteúdo do item.</p>
795
796<p>A seguir há {@code DetailsActivity}, que simplesmente embute {@code DetailsFragment} para exibir
797o resumo da peça selecionada quando a tela está na orientação de retrato:</p>
798
799{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
800details_activity}
801
802<p>Observe que esta atividade finaliza-se se a configuração for de paisagem,
803pois a atividade principal pode tomar o controle e exibir {@code DetailsFragment} juntamente com {@code TitlesFragment}.
804Isto pode acontecer se o usuário iniciar {@code DetailsActivity} enquanto estiver na orientação de retrato,
805mas alternar para orientação de paisagem (o que reinicia a atividade atual).</p>
806
807
808<p>Para obter mais exemplos do uso de fragmentos (e arquivos fonte completos deste exemplo),
809consulte o aplicativo de exemplo API Demos disponível em <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment">
810ApiDemos</a> (disponível para download em <a href="{@docRoot}resources/samples/get.html">Exemplos de componentes do SDK</a>).</p>
811
812
813