Um fragmento é como uma seção modular de uma atividade, que tem o próprio ciclo de vida, recebe os próprios eventos de entrada e que pode ser adicionado ou removido com a atividade em execução (uma espécie de "subatividade" que pode ser reutilizada em diferentes atividades). Essa lição mostra como ampliar a classe Fragment
usando a Biblioteca de Suporte para que o app permaneça compatível com dispositivos que têm versões de sistema antigas, como o Android 1.6.
Em vez de configurar seus componentes dependentes nos métodos de ciclo de vida do seu fragmento, crie um componente com reconhecimento de ciclo de vida. O componente pode processar qualquer configuração ou desmontagem necessária à medida que seu fragmento se move ao longo do ciclo de vida. O componente com reconhecimento de ciclo de vida pode ser reutilizado em outros fragmentos e atividades para evitar a duplicação de código e reduzir a quantidade de configuração necessária nos próprios fragmentos/atividades. Para ver mais informações, leia Como gerenciar ciclos de vida com componentes que reconhecem ciclos de vida.
Antes de prosseguir com esta lição, você precisa configurar o projeto Android para usar a Biblioteca de Suporte.
Se você nunca usou a Biblioteca de Suporte, configure o projeto para usar a biblioteca v4 lendo o documento Configuração da Biblioteca de Suporte. No entanto, você também pode incluir a barra de apps nas suas atividades em vez de usar a biblioteca v7 appcompat, que é compatível com Android 2.1 (API de nível 7) e também inclui as APIs Fragment
.
Para ver mais informações sobre como implementar fragmentos, consulte Fragmentos. Saiba mais explorando o exemplo de app relevante.
Criar uma classe de fragmento
Para criar um fragmento, amplie a classe Fragment
e substitua os principais métodos de ciclo de vida para inserir a lógica do seu app, de modo similar ao que usaria para uma classe Activity
.
Uma diferença na criação de um Fragment
é que você deve usar um callback onCreateView()
para definir o layout.
De fato, esse é o único callback necessário para executar um fragmento. Por exemplo, veja um fragmento simples que especifica o próprio layout:
Kotlin
import android.os.Bundle import android.support.v4.app.Fragment import android.view.LayoutInflater import android.view.ViewGroup class ArticleFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View { // Inflate the layout for this fragment return inflater.inflate(R.layout.article_view, container, false) } }
Java
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.ViewGroup; public class ArticleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.article_view, container, false); } }
Exatamente como uma atividade, um fragmento precisa implementar outros callbacks de ciclo de vida que permitem o gerenciamento do estado à medida em que é adicionado ou removido de uma atividade e conforme a atividade passa pelos estágios do ciclo de vida. Por exemplo, quando o método onPause()
da atividade é chamado, os fragmentos na atividade também recebem uma chamada para onPause()
.
Há mais informações sobre o ciclo de vida do fragmento e métodos de callback disponíveis no guia do desenvolvedor de fragmentos.
Adicionar um fragmento a uma atividade usando XML
Ainda que os fragmentos sejam componentes da IU modulares e reutilizáveis, cada instância de uma classe Fragment
precisa ser associada a uma FragmentActivity
pai. Para fazer isso, defina cada fragmento dentro do arquivo XML de layout da atividade.
Observação: FragmentActivity
é uma atividade especial fornecida na Biblioteca de Suporte para processar fragmentos em versões do sistema anteriores à API de nível 11. Se a versão do sistema mais antiga compatível for a API de nível 11, você poderá usar uma Activity
normal.
Veja um exemplo de arquivo de layout que adiciona dois fragmentos a uma atividade quando a tela do dispositivo é considerada “grande” (especificada pelo qualificador large
no nome do diretório).
res/layout-large/news_articles.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment android:name="com.example.android.fragments.HeadlinesFragment" android:id="@+id/headlines_fragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.android.fragments.ArticleFragment" android:id="@+id/article_fragment" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
Dica: para saber mais sobre a criação de layouts para diferentes tamanhos de tela, leia Compatibilidade com diferentes tamanhos de tela.
Depois, aplique o layout à atividade:
Kotlin
import android.os.Bundle import android.support.v4.app.FragmentActivity class MainActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.news_articles) } }
Java
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); } }
Se você estiver usando a biblioteca appcompat v7, sua atividade precisará estender AppCompatActivity
, que é uma subclasse de FragmentActivity
. Para ver mais informações, leia Como adicionar a barra de apps.
Observação: quando um fragmento é adicionado a um layout de atividade pela definição do fragmento no arquivo XML de layout, não é possível remover o fragmento durante a execução. Se você planeja inserir e retirar os fragmentos durante a interação do usuário, adicione o fragmento à atividade quando ela for iniciada pela primeira vez, conforme mostrado em Criar uma IU flexível.