Um fragmento representa uma parte modular da interface do usuário em uma atividade. Um fragmento tem ciclo de vida próprio e recebe os próprios eventos de entrada. Você pode adicionar ou remover fragmentos enquanto a atividade contida está em execução.
Este documento descreve como criar um fragmento e incluí-lo em uma atividade.
Configurar o ambiente
Os fragmentos exigem uma dependência na
biblioteca AndroidX Fragment. Você precisa
adicionar o repositório Maven do Google
ao arquivo settings.gradle
do projeto para incluir essa dependência.
Groovy
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Para incluir a biblioteca AndroidX Fragment no projeto, adicione as seguintes
dependências ao arquivo build.gradle
do app:
Groovy
dependencies { def fragment_version = "1.8.5" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.5" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
Criar uma classe de fragmento
Para criar um fragmento, estenda a classe
Fragment
do AndroidX e substitua
os métodos para inserir a lógica do seu app, de modo semelhante a como você criaria
uma classe Activity
. Para criar um fragmento
mínimo que defina o próprio layout, forneça o recurso de layout do fragmento
para o construtor base, conforme mostrado no exemplo a seguir:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
A biblioteca Fragment também oferece classes base de fragmentos mais especializados:
DialogFragment
- Exibe uma caixa de diálogo flutuante. Usar essa classe para criar uma caixa de diálogo é uma boa
alternativa para o uso dos métodos auxiliares de caixa de diálogo na
classe
Activity
, já que os fragmentos processam automaticamente a criação e a limpeza daDialog
. Consulte Como exibir caixas de diálogo comDialogFragment
para ver mais detalhes. PreferenceFragmentCompat
- Exibe uma hierarquia de
objetos
Preference
como uma lista. Você pode usarPreferenceFragmentCompat
para criar uma tela de configurações para o app.
Adicionar um fragmento a uma atividade
Geralmente, o fragmento precisa ser incorporado a uma FragmentActivity
do AndroidX para
contribuir com parte da IU para o layout dessa atividade. FragmentActivity
é a classe base de
AppCompatActivity
.
Portanto, caso você já tenha subclasses AppCompatActivity
para oferecer compatibilidade com versões anteriores
no seu app, não será necessário mudar a classe base
de atividades.
É possível adicionar seu fragmento à hierarquia de visualização da atividade
definindo o fragmento no arquivo de layout da atividade ou definindo um
contêiner de fragmento no arquivo de layout da atividade e, em seguida,
adicionando o fragmento de maneira programática pela atividade. Em ambos os casos,
é necessário adicionar uma
FragmentContainerView
que defina o local em que o fragmento será colocado na
hierarquia de visualização da atividade. É altamente recomendável usar uma
FragmentContainerView
como o contêiner de fragmentos, já que
FragmentContainerView
inclui correções específicas de fragmentos que outros grupos de visualização, como FrameLayout
, não oferecem.
Adicionar um fragmento por XML
Para adicionar um fragmento de maneira declarativa ao XML do layout da atividade, use um
elemento FragmentContainerView
.
Veja um exemplo de layout de atividade que contém uma única
FragmentContainerView
:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
O atributo android:name
especifica o nome da classe do Fragment
a
ser instanciado. Quando o layout da atividade é inflado, o fragmento especificado
é instanciado,
onInflate()
é chamado no fragmento recém-instanciado e uma FragmentTransaction
é criada para adicionar o fragmento ao FragmentManager
.
Adicionar um fragmento de forma programática
Para adicionar um fragmento ao layout da atividade de forma programática, o layout
precisa incluir uma FragmentContainerView
para servir como contêiner de fragmento,
conforme mostrado no exemplo a seguir:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Ao contrário da abordagem XML, aqui o atributo android:name
não é usado na FragmentContainerView
.
Portanto, nenhum fragmento específico é instanciado
automaticamente. Em vez disso,
uma FragmentTransaction
é usada para instanciar um fragmento e adicioná-lo ao layout da atividade.
Enquanto a atividade está em execução, você pode fazer transações de fragmentos, como
adicionar, remover ou substituir um fragmento. Na FragmentActivity
, é possível
receber uma instância do
FragmentManager
, que pode ser usada para criar uma FragmentTransaction
. Em seguida, instancie o
fragmento no método onCreate()
da atividade usando
FragmentTransaction.add()
e
transmitindo o ID de ViewGroup
do contêiner no layout e a classe de
fragmento que você quer adicionar. Em seguida, confirme a transação, como mostrado no
exemplo a seguir.
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, null) .commit(); } } }
No exemplo anterior, a transação do fragmento só é criada
quando savedInstanceState
é null
. Isso garante que o fragmento
seja adicionado somente uma vez, quando a atividade é criada. Quando uma
mudança de configuração ocorre e a atividade é recriada,
savedInstanceState
deixa de ser null
e o fragmento não precisa
ser adicionado novamente, já que ele é automaticamente restaurado
do savedInstanceState
.
Caso o fragmento exija alguns dados iniciais, os argumentos poderão ser transmitidos para o fragmento, fornecendo um Bundle
na chamada de FragmentTransaction.add()
, conforme mostrado abaixo:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val bundle = bundleOf("some_int" to 0) supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view, args = bundle) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = new Bundle(); bundle.putInt("some_int", 0); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, bundle) .commit(); } } }
Os argumentos Bundle
podem ser recuperados do fragmento
chamando
requireArguments()
,
e os métodos getter de Bundle
adequados podem ser usados para recuperar
cada argumento.
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val someInt = requireArguments().getInt("some_int") ... } }
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { int someInt = requireArguments().getInt("some_int"); ... } }
Veja também
As transações de fragmentos e FragmentManager
são abordados mais detalhadamente
no Guia do gerenciador de fragmentos.