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.9" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.9" // 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 comDialogFragmentpara ver mais detalhes. PreferenceFragmentCompat- Exibe uma hierarquia de
objetos
Preferencecomo uma lista. Você pode usarPreferenceFragmentCompatpara 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"
andr>oid: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) < addExampleFragment>(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.