1 page.title=Fragmentos 2 parent.title=Atividades 3 parent.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">Criao de um fragmento</a> 12 <ol> 13 <li><a href="#UI">Adio de uma interface do usurio</a></li> 14 <li><a href="#Adding">Adio 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">Realizao de operaes com fragmentos</a></li> 19 <li><a href="#CommunicatingWithActivity">Comunicao com a atividade</a> 20 <ol> 21 <li><a href="#EventCallbacks">Criao de eventos de retornos de chamada para a atividade</a></li> 22 <li><a href="#ActionBar">Adio de itens barra de ao</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">Coordenao 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 tambm</h2> 41 <ol> 42 <li><a href="{@docRoot}training/basics/fragments/index.html">Construo de uma IU dinmica com Fragmentos</a></li> 43 <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Compatibilidade com 44 tablets 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 usurio em um 50 {@link android.app.Activity}. possvel combinar vrios fragmentos em uma nica atividade para compilar 51 uma IU de painis mltiplos e reutilizar um fragmento em diversas atividades. Um fragmento 52 como uma seo modular de uma atividade, que tem o prprio ciclo de vida, recebe os prprios eventos de entrada 53 e que pode ser adicionado ou removido com a atividade em execuo (uma espcie de "sub-atividade" 54 que 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 58 tambm so e, quando a atividade destruda, todos os fragmentos tambm so. No entanto, enquanto 59 uma atividade estiver em execuo (estiver no <em>estado do ciclo de vida</em> <a href="{@docRoot}guide/components/activities.html#Lifecycle">retomado</a>), possvel 60 manipular cada fragmento independentemente, como adicionar ou remov-los. Ao realizar tal operao com fragmentos, 61 tambm possvel adicion-los a uma pilha de retorno que gerenciada pela 62 atividade — cada entrada da pilha de retorno na atividade um registro da operao de fragmento 63 que ocorreu. A pilha de retorno permite que o usurio inverta uma operao de fragmento (navegue ao contrrio), 64 pressionando o boto <em>Voltar</em>.</p> 65 66 <p>Ao adicionar um fragmento como parte do layout da atividade, ele viver em um {@link 67 android.view.ViewGroup} dentro da hierarquia de vistas e o fragmento definir o prprio 68 layout da vista. 69 possvel inserir um fragmento no layout, declarando-o no arquivo de layout 70 da atividade, como um elemento {@code <fragment>} ou a partir do cdigo do aplicativo adicionando-o 71 a um {@link android.view.ViewGroup} existente. No entanto, no necessrio que um fragmento faa parte 72 do layout da atividade; tambm possvel usar um fragmento sem a IU como um trabalhador invisvel 73 da atividade.</p> 74 75 <p>Este documento descreve como compilar o aplicativo para usar fragmentos, 76 incluindo como os fragmentos podem manter seu estado ao serem adicionados pilha de retorno da atividade, 77 como compartilhar eventos com a atividade e com outros fragmentos da atividade, como contribuir para a barra de ao 78 da 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 nvel 11), principalmente para suportar 84 mais projetos de IU flexveis e dinmicos em telas grandes, como em tablets. Como a tela de um tablet 85 muito maior que a de um celular, h mais espao para combinar 86 e alternar componentes da IU. Os fragmentos permitem tais projetos sem haver a necessidade de gerenciar 87 alteraes complexas na hierarquia de vistas. Ao dividir o layout de uma atividade em fragmentos, possvel 88 modificar a aparncia da atividade em tempo de execuo e preservar essas alteraes na pilha de retorno, 89 que gerenciada por esta atividade.</p> 90 91 <p>Por exemplo, um aplicativo de notcias pode usar um fragmento para exibir uma lista de artigos 92 na esquerda e outro fragmento para exibir um artigo na direita — ambos os fragmentos aparecem 93 em uma atividade, lado a lado, e cada fragmento possui o prprio conjunto de mtodos de retorno de chamada do ciclo de vida e lidam 94 com os prprios eventos de entrada do usurio. Portanto, em vez de usar uma atividade para selecionar um artigo 95 e outra atividade para l-lo, o usurio pode selecionar um artigo e l-lo por completo dentro 96 da 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 reutilizvel da atividade. Ou seja, como cada fragmento 99 define seu prprio layout e comportamento com os prprios retornos de chamada do ciclo de vida, possvel 100 incluir um fragmento em vrias atividades para poder projet-lo para reutilizao e evitar 101 a manipulao direta de um fragmento a partir de outro fragmento. Isto especialmente importante porque 102 um fragmento modular permite alterar as combinaes de fragmentos para tamanhos de tela diferentes. Ao projetar o aplicativo 103 para ser compatvel com tablets e celulares, voc poder reutilizar os fragmentos em diferentes configuraes 104 de layout para otimizar a experincia do usurio com base no espao de tela disponvel. Por exemplo, 105 em um celular, talvez seja necessrio separar os fragmentos para fornecer uma IU de painel nico 106 quando mais de um no 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 mdulos de IU definidos 110 pelos fragmentos podem ser combinados em uma atividade de um projeto para tablet mas separados 111 em um projeto para celular.</p> 112 113 <p>Por exemplo, — continuando com o exemplo do aplicativo de notcias — o aplicativo pode embutir 114 dois fragmentos na <em>atividade A</em>, quando executado em um dispositivo do tamanho de um tablet. No entanto, 115 em uma tela de tamanho de celular, no h espao suficiente para ambos os fragmentos, ento a <em>atividade A</em> inclui 116 somente o fragmento da lista de artigos e, quando o usurio seleciona um artigo, ele inicia 117 a <em>atividade B</em>, que inclui o segundo fragmento para ler o artigo. Portanto, o aplicativo 118 compatvel com tablets e celulares atravs da reutilizao dos fragmentos em combinaes diferentes, como ilustrado 119 na figura 1.</p> 120 121 <p>Para obter mais informaes sobre o projeto de aplicativos com diferentes combinaes de fragmentos 122 para configuraes 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">Criao 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 execuo).</p> 132 </div> 133 134 <p>Para criar um fragmento, preciso criar uma subclasse de {@link android.app.Fragment} (ou uma respectiva 135 subclasse existente). A classe {@link android.app.Fragment} tem um cdigo que muito parecido 136 com o de uma {@link android.app.Activity}. Ele contm mtodos de retorno de chamada semelhantes aos de uma atividade, 137 como {@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, 139 caso esteja convertendo um aplicativo do Android existente para usar os fragmentos, basta mover 140 o cdigo dos mtodos de retorno de chamada da atividade para os respectivos mtodos de retorno de chamada 141 do fragmento.</p> 142 143 <p>Geralmente, deve-se implementar pelo menos os seguintes mtodos 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 implementao, 148 deve-se inicializar os componentes essenciais do fragmento que deseja-se reter quando o fragmento 149 for 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 usurio 152 pela primeira vez. Para desenhar uma IU para o fragmento, voc deve retornar uma {@link android.view.View} 153 deste mtodo, que a raiz do layout do fragmento. possvel retornar como nulo se o fragmento 154 no fornecer uma IU.</dd> 155 <dt>{@link android.app.Activity#onPause onPause()}</dt> 156 <dd>O sistema chama esse mtodo como o primeiro indcio de que o usurio est saindo 157 do fragmento (embora no seja sempre uma indicao de que o fragmento est sendo destrudo). quando geralmente 158 deve-se confirmar qualquer alterao que deva se manter alm da sesso atual do usurio (porque 159 o usurio pode no retornar).</dd> 160 </dl> 161 162 <p>A maioria dos aplicativos deve implementar pelo menos trs destes mtodos para cada fragmento, 163 mas h vrios outros mtodos de retorno de chamada que voc deve usar para lidar com diversos estgios 164 do ciclo de vida do fragmento. Todos os mtodos de retorno de chamada do ciclo de vida so abordados com mais detalhes na seo 165 <a href="#Lifecycle">Tratamento do ciclo de vida dos fragmentos</a>.</p> 166 167 168 <p>H tambm algumas subclasses que voc pode querer estender, em vez de a classe {@link 169 android.app.Fragment} de base:</p> 170 171 <dl> 172 <dt>{@link android.app.DialogFragment}</dt> 173 <dd>Exibe uma caixa de dilogo flutuante. Usar esta classe para criar uma caixa de dilogo uma boa alternativa 174 para usar mtodos auxiliares das caixas de dilogo na classe {@link android.app.Activity}, 175 pois possvel incorporar uma caixa de dilogo de fragmento na pilha de retorno dos fragmentos gerenciados pela atividade, 176 permitindo que o usurio retorne a um fragmento dispensado.</dd> 177 178 <dt>{@link android.app.ListFragment}</dt> 179 <dd>Exibe uma lista de itens que so gerenciados por um adaptador (como um {@link 180 android.widget.SimpleCursorAdapter}), semelhante {@link android.app.ListActivity}. Ele fornece vrios mtodos 181 para gerenciar uma vista de lista, como o retorno de chamada {@link 182 android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()} 183 para 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, 187 parecido com {@link android.preference.PreferenceActivity}. Isto til ao criar uma atividade 188 de "configuraes" para o aplicativo.</dd> 189 </dl> 190 191 192 <h3 id="UI">Adio de uma interface do usurio</h3> 193 194 <p>Um fragmento geralmente usado como parte de uma interface do usurio da atividade e contribui 195 para a atividade com seu prprio layout.</p> 196 197 <p>Para fornecer um layout para um fragmento, voc deve implementar o mtodo de retorno de chamada {@link 198 android.app.Fragment#onCreateView onCreateView()}, que o sistema Android chama 199 no momento em que o fragmento deve desenhar o layout. A implementao deste mtodo deve retornar 200 uma {@link android.view.View}, que a raiz do layout do fragmento.</p> 201 202 <p class="note"><strong>Observao:</strong> se o fragmento for uma subclasse de {@link 203 android.app.ListFragment}, a implementao padro retornar uma {@link android.widget.ListView} 204 de {@link android.app.Fragment#onCreateView onCreateView()}, ento no ser necessrio implement-lo.</p> 205 206 <p>Para retornar um layout de {@link 207 android.app.Fragment#onCreateView onCreateView()}, possvel infl-lo a partir de um <a href="{@docRoot}guide/topics/resources/layout-resource.html">recurso de layout</a> definido no XML. Para ajudar 208 a fazer isto, o {@link android.app.Fragment#onCreateView onCreateView()} fornece 209 um 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 212 do arquivo {@code example_fragment.xml}:</p> 213 214 <pre> 215 public static class ExampleFragment extends Fragment { 216 @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>Criao de um layout</h3> 228 <p>No exemplo acima, {@code R.layout.example_fragment} uma referncia para um recurso de layout 229 chamado {@code example_fragment.xml}, salvo nos recursos do aplicativo. Para obter informaes sobre 230 como criar um layout no XML, consulte a documentao <a href="{@docRoot}guide/topics/ui/index.html">Interface do usurio</a> 231 .</p> 232 </div> 233 </div> 234 235 <p>O parmetro {@code container} passado para {@link android.app.Fragment#onCreateView 236 onCreateView()} o pai de {@link android.view.ViewGroup} (do layout da atividade) 237 em que o layout do fragmento 238 ser inserido. O parmetro {@code savedInstanceState} um {@link android.os.Bundle} 239 que fornece dados sobre a instncia anterior do fragmento, se o fragmento estiver sendo retomado 240 (a restaurao de estado abordada mais detalhadamente na seo <a href="#Lifecycle">Tratamento do ciclo 241 de vida dos fragmentos</a>).</p> 242 243 <p>O mtodo {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()} 244 usa trs 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 248 container} importante para que o sistema aplique os parmetros de layout vista raiz 249 do 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 251 android.view.ViewGroup} (o segundo parmetro) durante a inflao (neste caso, 252 isto falso, pois o sistema j est inserindo o layout inflado no {@code 253 container} — 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">Adio 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 264 da hierarquia de vistas geral da atividade. H duas formas de adicionar um fragmento ao layout 265 da atividade:</p> 266 267 <ul> 268 <li><b>Declarar o fragmento dentro do arquivo de layout da atividade.</b> 269 <p>Neste caso, 270 possvel especificar as propriedades do layout para o fragmento como se fosse uma vista. Por exemplo, a seguir h o arquivo de layout 271 para uma atividade com dois fragmentos:</p> 272 <pre> 273 <?xml version="1.0" encoding="utf-8"?> 274 <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"> 278 <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" /> 283 <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" /> 288 </LinearLayout> 289 </pre> 290 <p>O atributo {@code android:name} em {@code <fragment>} especifica a classe {@link 291 android.app.Fragment} a instanciar no layout.</p> 292 293 <p>Quando o sistema cria este layout de atividade, ele instancia cada fragmento especificado 294 no layout e chama o mtodo {@link android.app.Fragment#onCreateView onCreateView()} para cada um 295 para recuperar o layout de cada fragmento. O sistema insere a {@link android.view.View} retornada 296 pelo fragmento diretamente no lugar do elemento {@code <fragment>}.</p> 297 298 <div class="note"> 299 <p><strong>Observao:</strong> cada fragmento requer um identificador nico 300 que o sistema possa usar para restaur-lo se a atividade for reiniciada (e que possa ser usado 301 para capturar o fragmento para realizar operaes, como a remoo). H trs maneiras de fornecer 302 um 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 no fornea nenhuma das alternativas anteriores, o sistema usar o ID da vista 307 do 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 execuo, possvel adicionar fragmentos ao layout da atividade. Voc precisa 314 apenas especificar um {@link 315 android.view.ViewGroup} para posicionar o fragmento.</p> 316 <p>Para realizar operaes de fragmentos na atividade (como adicionar, remover ou substituir 317 um fragmento), voc deve usar APIs de {@link android.app.FragmentTransaction}. possvel adquirir 318 uma instncia de {@link android.app.FragmentTransaction} da {@link android.app.Activity} desta maneira:</p> 319 320 <pre> 321 FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()} 322 FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()}; 323 </pre> 324 325 <p> possvel adicionar um fragmento usando o mtodo {@link 326 android.app.FragmentTransaction#add(int,Fragment) add()}, especificando o fragmento que ser adicionado 327 e a vista em que ser inserido. Por exemplo:</p> 328 329 <pre> 330 ExampleFragment fragment = new ExampleFragment(); 331 fragmentTransaction.add(R.id.fragment_container, fragment); 332 fragmentTransaction.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 337 pelo ID de recurso e o segundo parmetro o fragmento a ser adicionado.</p> 338 <p>Ao realizar as alteraes 339 com {@link android.app.FragmentTransaction}, 340 deve-se chamar{@link android.app.FragmentTransaction#commit} para que as alteraes entrem em vigor.</p> 341 </li> 342 </ul> 343 344 345 <h4 id="AddingWithoutUI">Adio 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 possvel tambm usar um fragmento para fornecer o comportamento de segundo plano para a atividade sem apresentar 349 IU adicional.</p> 350 351 <p>Para adicionar um fragmento sem uma IU, adicione o fragmento da atividade usando {@link 352 android.app.FragmentTransaction#add(Fragment,String)} (fornecendo uma "tag" de string nica 353 para o fragmento, em vez de um ID de vista). Isto adiciona o fragmento, mas, como ele no est associado 354 a uma vista no layout da atividade, no recebe uma chamada de {@link 355 android.app.Fragment#onCreateView onCreateView()}. Portanto, no necessrio implementar este mtodo.</p> 356 357 <p>Fornecer uma tag de string para o fragmento no algo estrito para fragmentos que no sejam de IU — possvel tambm 358 fornecer tags de string para fragmentos que possuam uma IU — mas, se o fragmento no possuir uma IU, 359 a tag de string a nica maneira de identific-lo. Caso queira obter o fragmento da atividade posteriormente, 360 voc precisar usar {@link android.app.FragmentManager#findFragmentByTag 361 findFragmentByTag()}.</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 364 FragmentRetainInstance.java}, incluso nos exemplos do SDK (disponibilizados pelo 365 Android SDK Manager) e localizado no sistema como 366 <code><sdk_root>/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, 373 chame {@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 379 android.app.FragmentManager#findFragmentById findFragmentById()} (para fragmentos que forneam uma IU 380 no layout da atividade) ou {@link android.app.FragmentManager#findFragmentByTag 381 findFragmentByTag()} (para fragmentos que forneam ou no uma IU).</li> 382 <li>Retire os fragmentos da pilha de retorno com {@link 383 android.app.FragmentManager#popBackStack()} (simulando um comando de <em>Voltar</em> do usurio).</li> 384 <li>Registre uma escuta para as alteraes na pilha de retorno com {@link 385 android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li> 386 </ul> 387 388 <p>Para obter mais informaes sobre esses e outros mtodos, consulte a documentao da classe {@link 389 android.app.FragmentManager}.</p> 390 391 <p>Como demonstrado na seo anterior, possvel usar o {@link android.app.FragmentManager} 392 para abrir uma {@link android.app.FragmentTransaction}, que permite realizar operaes, 393 como adicionar e remover fragmentos.</p> 394 395 396 <h2 id="Transactions">Realizao de operaes com fragmentos</h2> 397 398 <p>Um grande recurso fornecido por fragmentos em atividades a possibilidade de adicionar, remover, substituir 399 e realizar outras aes com eles em resposta interao do usurio. Cada conjunto de alteraes que forem realizadas 400 na atividade chamado de operao e podem ser feitas usando APIs em {@link 401 android.app.FragmentTransaction}. Tambm possvel salvar cada operao em uma pilha de retorno gerenciada pela atividade, 402 permitindo que o usurio navegue inversamente por meio de alteraes de fragmento (semelhante navegao 403 inversa por meio de atividades).</p> 404 405 <p> possvel adquirir uma instncia de {@link android.app.FragmentTransaction} a partir do {@link 406 android.app.FragmentManager} da seguinte forma:</p> 407 408 <pre> 409 FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}; 410 FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()}; 411 </pre> 412 413 <p>Cada operao um conjunto de alteraes que voc deseja realizar ao mesmo tempo. possvel definir 414 todas as alteraes desejadas para uma operao usando mtodos como {@link 415 android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()} 416 e {@link android.app.FragmentTransaction#replace replace()}. Em seguida, para aplicar a operao 417 atividade, deve-se chamar {@link android.app.FragmentTransaction#commit()}.</p> 418 </dl> 419 420 <p>Antes de chamar {@link 421 android.app.FragmentTransaction#commit()}, no entanto, voc pode querer chamar {@link 422 android.app.FragmentTransaction#addToBackStack addToBackStack()} para adicionar a operao 423 a uma pilha de retorno de operaes de fragmentos. A pilha de retorno gerenciada pela atividade 424 e permite que o usurio retorne ao estado anterior do fragmento, ao pressionar o boto <em>Voltar</em>.</p> 425 426 <p>Por exemplo, a seguir apresentado o modo de substituir um fragmento por outro e preservar 427 o estado anterior da pilha de retorno:</p> 428 429 <pre> 430 // Create new fragment and transaction 431 Fragment newFragment = new ExampleFragment(); 432 FragmentTransaction 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 436 transaction.replace(R.id.fragment_container, newFragment); 437 transaction.addToBackStack(null); 438 439 // Commit the transaction 440 transaction.commit(); 441 </pre> 442 443 <p>Neste exemplo, {@code newFragment} substitui qualquer fragmento (se houver) que estiver 444 no recipiente do layout identificado pelo ID {@code R.id.fragment_container}. Ao chamar {@link 445 android.app.FragmentTransaction#addToBackStack addToBackStack()}, a operao de substituio 446 salva na pilha de retorno para que o usurio possa reverter a operao 447 e voltar ao fragmento anterior pressionando o boto <em>Voltar</em>.</p> 448 449 <p>Se voc adicionar vrias alteraes operao (como outro {@link 450 android.app.FragmentTransaction#add add()} ou {@link android.app.FragmentTransaction#remove 451 remove()}) e chamar {@link 452 android.app.FragmentTransaction#addToBackStack addToBackStack()}, todas as alteraes aplicadas 453 antes de chamar {@link android.app.FragmentTransaction#commit commit()} sero adicionadas 454 pilha de retorno como uma nica operao e o boto <em>Voltar</em> reverter todas elas juntas.</p> 455 456 <p>A ordem em que voc adicionar as alteraes em {@link android.app.FragmentTransaction} no importa, 457 exceto que:</p> 458 <ul> 459 <li>Voc deve chamar {@link android.app.FragmentTransaction#commit()} por ltimo</li> 460 <li>Caso esteja adicionando vrios fragmentos ao mesmo recipiente, a ordem em que 461 adicion-los determina a ordem em que eles aparecero na hierarquia de vistas</li> 462 </ul> 463 464 <p>Caso voc no chame {@link android.app.FragmentTransaction#addToBackStack(String) 465 addToBackStack()} ao realizar uma operao que remove um fragmento, este fragmento 466 ser destrudo quando a operao for realizada e o usurio no poder navegar de volta a ele. Considerando que, 467 se voc no chamar {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} 468 ao remover um fragmento, o fragmento ser <em>interrompido</em> e ser retomado se o usurio 469 navegar de volta.</p> 470 471 <p class="note"><strong>Dica:</strong> para cada operao de fragmento, possvel aplicar uma animao 472 de transio, chamando {@link android.app.FragmentTransaction#setTransition setTransition()} 473 antes da realizao.</p> 474 475 <p>Chamar {@link android.app.FragmentTransaction#commit()} no realiza a operao 476 imediatamente. Em vez disso, o parmetro agenda a execuo no encadeamento da IU da atividade (o encadeamento main, ou principal) 477 assim que possvel. Se necessrio, no entanto, possvel chamar {@link 478 android.app.FragmentManager#executePendingTransactions()} a partir do encadeamento da IU para executar imediatamente 479 as operaes enviadas por {@link android.app.FragmentTransaction#commit()}. Tal medida, geralmente, 480 no necessria, a no ser que a operao represente uma dependncia para trabalhos em outros encadeamentos.</p> 481 482 <p class="caution"><strong>Ateno:</strong> possvel realizar uma operao usando {@link 483 android.app.FragmentTransaction#commit commit()} somente antes da atividade <a href="{@docRoot}guide/components/activities.html#SavingActivityState">salvar 484 seu estado</a> (quando o usurio deixa a atividade). Caso tente efetivas as alteraes aps este ponto, 485 uma exceo ser lanada. Isto acontece porque o estado aps a efetivao pode ser perdido se a atividade 486 precisar ser restaurada. Para situaes em que no haja problema em perder a efetivao, use {@link 487 android.app.FragmentTransaction#commitAllowingStateLoss()}.</p> 488 489 490 491 492 <h2 id="CommunicatingWithActivity">Comunicao com a atividade</h2> 493 494 <p>Apesar de {@link android.app.Fragment} ser implementado como um objeto independente 495 de uma {@link android.app.Activity} e poder ser usado dentro de vrias atividades, uma dada instncia 496 de um fragmento diretamente vinculada atividade que o contm.</p> 497 498 <p>Especificamente, o fragmento pode acessar a instncia {@link android.app.Activity} com {@link 499 android.app.Fragment#getActivity()} e realizar facilmente tarefas como encontrar uma vista 500 no layout da atividade:</p> 501 502 <pre> 503 View 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 mtodos no fragmento adquirindo uma referncia 507 para o {@link android.app.Fragment} a partir do {@link android.app.FragmentManager} usando {@link 508 android.app.FragmentManager#findFragmentById findFragmentById()} ou {@link 509 android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. Por exemplo:</p> 510 511 <pre> 512 ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 513 </pre> 514 515 516 <h3 id="EventCallbacks">Criao 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 necessrio. Uma boa maneira de fazer isto 519 definir uma interface de retorno de chamada dentro do fragmento e solicitar que a atividade do host 520 implemente-a. Quando a atividade recebe um retorno de chamada por meio da interface, ela pode compartilhar as informaes 521 com outros fragmentos no layout conforme necessrio.</p> 522 523 <p>Por exemplo, se um aplicativo de notcias em uma atividade tiver dois fragmentos — um para exibir uma lista 524 de artigos (fragmento A) e outro para exibir um artigo (fragmento B) — ento o fragmento A 525 deve 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> 529 public 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} 540 e suspende 541 {@code onArticleSelected()} para notificar o fragmento B do evento do fragmento A. Para garantir 542 que a atividade do host implemente esta interface, o mtodo de retorno de chamada de {@link 543 android.app.Fragment#onAttach onAttach()} do fragmento A (que o sistema chama ao adicionar 544 o fragmento atividade) instanciar {@code OnArticleSelectedListener} 545 lanando a {@link android.app.Activity}, que passada para {@link android.app.Fragment#onAttach 546 onAttach()}:</p> 547 548 <pre> 549 public static class FragmentA extends ListFragment { 550 OnArticleSelectedListener mListener; 551 ... 552 @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 no implementar a interface, o fragmento lanar 566 {@link java.lang.ClassCastException}. 567 Se for bem-sucedida, o membro {@code mListener} reter uma referncia da implementao da atividade 568 de {@code OnArticleSelectedListener}, para que o fragmento A possa compartilhar os eventos com a atividade 569 chamando mtodos definidos pela interface {@code OnArticleSelectedListener}. Por exemplo, se o fragmento A 570 for uma extenso de {@link android.app.ListFragment}, sempre 571 que o usurio clicar em um item de lista, o sistema chamar {@link android.app.ListFragment#onListItemClick 572 onListItemClick()} no fragmento que, em seguida, chamar {@code onArticleSelected()} para compartilhar 573 o evento com a atividade:</p> 574 575 <pre> 576 public static class FragmentA extends ListFragment { 577 OnArticleSelectedListener mListener; 578 ... 579 @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 parmetro {@code id} passado para {@link 591 android.app.ListFragment#onListItemClick onListItemClick()} o ID da linha do item clicado 592 que a atividade (ou outro fragmento) usa para resgatar o artigo do {@link 593 android.content.ContentProvider} do aplicativo.</p> 594 595 <p><!--To see a complete implementation of this kind of callback interface, see the <a 596 href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->Mais informaes sobre 597 como usar o provedor de contedo esto disponveis na documentao <a href="{@docRoot}guide/topics/providers/content-providers.html">Provedores de contedo</a>.</p> 598 599 600 601 <h3 id="ActionBar">Adio de itens barra de ao</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 opes</a> da atividade (e, consequentemente, para a <a href="{@docRoot}guide/topics/ui/actionbar.html">barra de ao</a>) implementando 604 {@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. Para que este mtodo 605 receba chamadas, no entanto, voc deve chamar {@link 606 android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} durante {@link 607 android.app.Fragment#onCreate(Bundle) onCreate()} para indicar que o fragmento 608 gostaria de adicionar itens ao menu de opes (caso contrrio, o fragmento no receber uma chamada 609 para {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()}).</p> 610 611 <p>Quaisquer itens adicionados ao menu de opes do fragmento so anexados 612 aos itens de menu existentes. O fragmento tambm recebe retornos de chamada para {@link 613 android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} quando um item de menu 614 selecionado.</p> 615 616 <p>Tambm possvel registrar uma vista no layout do fragmento para fornecer um menu de contexto chamando {@link 617 android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. Quando o usurio 618 abre o menu de contexto, o fragmento recebe uma chamada de {@link 619 android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo) 620 onCreateContextMenu()}. Quando o usurio seleciona um item, o fragmento recebe uma chamada de {@link 621 android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p> 622 623 <p class="note"><strong>Observao:</strong> apesar de o fragmento receber um retorno de chamada selecionado no item 624 para cada item de menu que adiciona, a atividade a primeira a receber o respectivo retorno de chamada quando o usurio 625 seleciona um item de menu. Se a implementao da atividade do retorno de chamada selecionado no item no 626 lida com o item selecionado, o evento passado para o retorno de chamada do fragmento. Isto verdadeiro 627 para o menu de opes e os menus de contexto.</p> 628 629 <p>Para obter mais informaes 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 ao</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 639 do 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, 643 um fragmento pode existir em trs estados:</p> 644 645 <dl> 646 <dt><i>Retomado</i></dt> 647 <dd>O fragmento visvel na atividade em execuo.</dd> 648 649 <dt><i>Pausado</i></dt> 650 <dd>Outra atividade est em primeiro plano, mas a atividade em que este fragmento 651 vive ainda est visvel (a atividade de primeiro plano parcialmente transparente 652 ou no cobre a tela inteira).</dd> 653 654 <dt><i>Interrompido</i></dt> 655 <dd>O fragmento no visvel. A atividade do host foi interrompida 656 ou o fragmento foi removido da atividade mas adicionado pilha de retorno. Um fragmento interrompido 657 ainda est vivo (todas as informaes do membro e de estado esto retidas no sistema). No entanto, 658 no est mais visvel e ser eliminado se a atividade tambm for.</dd> 659 </dl> 660 661 <p>Alm disso, como uma atividade, possvel reter o estado de um fragmento usando um {@link 662 android.os.Bundle}, caso o processo da atividade seja eliminado e voc precise restaurar 663 o estado do fragmento quando a atividade for recriada. possvel salvar o estado durante o retorno de chamada {@link 664 android.app.Fragment#onSaveInstanceState onSaveInstanceState()} do fragmento e restaur-lo 665 durante {@link android.app.Fragment#onCreate onCreate()}, {@link 666 android.app.Fragment#onCreateView onCreateView()} ou {@link 667 android.app.Fragment#onActivityCreated onActivityCreated()}. Para obter mais informaes sobre 668 como salvar o estado, consulte a documentao <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Atividades</a> 669 .</p> 670 671 <p>A diferena mais significante entre o ciclo de vida de uma atividade e de um fragmento 672 o armazenamento em suas respectivas pilhas de retorno. Por padro, uma atividade colocada de volta na pilha de retorno de atividades, 673 que gerenciada pelo sistema, quando interrompida (para que o usurio possa navegar 674 a ela com o boto <em>Voltar</em>, como discutido em <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tarefas e pilha de retorno</a>). 675 No entanto, um fragmento posicionado em uma pilha de retorno gerenciada pela atividade do host somente 676 ao solicitar explicitamente que a instncia seja salva chamando {@link 677 android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} durante uma operao 678 que remove o fragmento.</p> 679 680 <p>Caso contrrio, gerenciar o ciclo de vida do fragmento muito semelhante a gerenciar 681 o ciclo de vida da atividade. Portanto, as mesmas prticas para <a href="{@docRoot}guide/components/activities.html#Lifecycle">gerenciar o ciclo de vida 682 da atividade</a> aplicam-se aos fragmentos. O que voc tambm precisa entender, no entanto, como a vida 683 da atividade afeta a vida do fragmento.</p> 684 685 <p class="caution"><strong>Ateno:</strong> caso precise de um objeto {@link android.content.Context} 686 dentro do {@link android.app.Fragment}, possvel chamar {@link android.app.Fragment#getActivity()}. 687 No entanto, tome cuidado para chamar {@link android.app.Fragment#getActivity()} somente quando o fragmento 688 estiver anexado a uma atividade. Quando o fragmento ainda no estiver anexado, ou tiver sido desvinculado durante o fim 689 do seu ciclo de vida, {@link android.app.Fragment#getActivity()} retornar como nulo.</p> 690 691 692 <h3 id="CoordinatingWithActivity">Coordenao 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 695 do fragmento, da mesma forma que um retorno de chamada de cada ciclo de vida da atividade resulta em um retorno de chamada semelhante 696 de cada fragmento. Por exemplo, quando a atividade receber {@link android.app.Activity#onPause}, 697 cada fragmento na atividade receber {@link android.app.Fragment#onPause}.</p> 698 699 <p>Os fragmentos tm alguns retornos de chamada do ciclo de vida extras. No entanto, isto trata da interao nica 700 com a atividade para realizar aes como compilar e destruir a IU do fragmento. Esses 701 mtodos adicionais de retorno de chamada so:</p> 702 703 <dl> 704 <dt>{@link android.app.Fragment#onAttach onAttach()}</dt> 705 <dd>Chamado quando o fragmento tiver sido associado atividade ({@link 706 android.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 mtodo {@link android.app.Activity#onCreate 711 onCreate()} 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 719 pela figura 3. Nesta figura, possvel ver como cada estado sucessivo da atividade determina 720 qual mtodo de retorno de chamada um fragmento pode receber. Por exemplo, quando a atividade recebe o retorno de chamada {@link 721 android.app.Activity#onCreate onCreate()}, um fragmento na atividade recebe nada mais 722 do que o retorno de chamada {@link android.app.Fragment#onActivityCreated onActivityCreated()}.</p> 723 724 <p>Quando a atividade atinge o estado retomado, possvel adicionar e remover fragmentos 725 dela livremente. Portanto, somente quando a atividade estiver no estado retomado, o ciclo de vida 726 de um fragmento poder alterar-se de forma independente.</p> 727 728 <p>No entanto, quando a atividade deixa o estado retomado, o fragmento novamente forado 729 a 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 737 que usa dois fragmentos para criar um layout de dois painis. A atividade abaixo inclui um fragmento 738 para exibir uma lista de ttulos de peas de Shakespeare e outra para exibir um resumo da pea, 739 quando selecionada na lista. Ela tambm determina como fornecer diferentes configuraes de fragmentos, 740 com base na configurao da tela.</p> 741 742 <p class="note"><strong>Observao:</strong> O cdigo fonte completo desta atividade est disponvel em 743 <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code 744 FragmentLayout.java}</a>.</p> 745 746 <p>A atividade principal aplica-se de maneira comum, durante {@link 747 android.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 ttulos 756 das peas) assim que a atividade carrega o layout, enquanto que {@link android.widget.FrameLayout} 757 (onde o fragmento para exibir o resumo da pea aparecer) consome o espao do lado direito da tela, 758 mas primeiramente permanece vazio. Como ver abaixo, ele no estar visvel at que o usurio selecione um item 759 na lista em que um fragmento esteja posicionado no {@link android.widget.FrameLayout}.</p> 760 761 <p>No entanto, nem todas as configuraes de tela so grandes o suficiente para exibir a lista 762 de peas e o resumo, lado a lado. Portanto, o layout acima usado somente para configurao 763 de tela de paisagem, salvando-o em {@code res/layout-land/fragment_layout.xml}.</p> 764 765 <p>Por isso, quando a tela est na orientao de retrato, o sistema aplica o seguinte layout, 766 que 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 771 est na orientao de retrato, somente a lista de ttulo das peas est disponvel. Portanto, quando o usurio clicar 772 em um item da lista nesta configurao, o aplicativo iniciar uma nova atividade para exibir o resumo, 773 em vez de carregar um segundo fragmento.</p> 774 775 <p>A seguir, possvel ver como isto realizado com classes de fragmento. Primeiro, {@code 776 TitlesFragment}, que exibe a lista de peas de Shakespeare. Este fragmento estende {@link 777 android.app.ListFragment} e confia nele para lidar com grande parte do trabalho da vista de lista.</p> 778 779 <p>Enquanto inspeciona este cdigo, observe que h dois possveis comportamentos quando um usurio 780 clica em um item de lista: dependendo de qual dos dois layouts est ativo, ele pode criar e exibir 781 um novo fragmento para exibir os detalhes na mesma atividade (adicionando o fragmento {@link 782 android.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 pea para o item selecionado 787 na 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 usurio clicar em um item de lista 792 e o layout original <em>no</em> incluir a vista {@code R.id.details} (a que 793 {@code DetailsFragment} pertence), o aplicativo iniciar a atividade {@code DetailsActivity} 794 para exibir o contedo do item.</p> 795 796 <p>A seguir h {@code DetailsActivity}, que simplesmente embute {@code DetailsFragment} para exibir 797 o resumo da pea selecionada quando a tela est na orientao de retrato:</p> 798 799 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java 800 details_activity} 801 802 <p>Observe que esta atividade finaliza-se se a configurao for de paisagem, 803 pois a atividade principal pode tomar o controle e exibir {@code DetailsFragment} juntamente com {@code TitlesFragment}. 804 Isto pode acontecer se o usurio iniciar {@code DetailsActivity} enquanto estiver na orientao de retrato, 805 mas alternar para orientao 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), 809 consulte o aplicativo de exemplo API Demos disponvel em <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment"> 810 ApiDemos</a> (disponvel para download em <a href="{@docRoot}resources/samples/get.html">Exemplos de componentes do SDK</a>).</p> 811 812 813