Criar um fragmento

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.