O ciclo de vida do fragmento Android
hoje vamos aprender sobre o ciclo de vida do fragmento Android e implementar uma única classe de atividade consistindo de dois fragmentos na aplicação android.
o fragmento Android
Fragment
classe no Android é usado para construir Interfaces de utilizador dinâmicas. O fragmento deve ser usado dentro da atividade. Uma grande vantagem dos fragmentos é que simplifica a tarefa de criar UI para vários tamanhos de tela. Uma atividade pode conter qualquer número de fragmentos.
Um fragmento Android não é por si só uma subclasse de visão que a maioria dos outros componentes UI são. Em vez disso, um fragmento tem uma vista dentro dele. É esta visão que é eventualmente exibida dentro da atividade na qual o fragmento vive.
porque um fragmento android não é uma vista, adicioná-lo a uma atividade parece um pouco diferente do que adicionar uma vista (por exemplo, TextView). Um fragmento é adicionado a um grupo de visualização dentro da actividade. A vista do fragmento é mostrada dentro deste grupo de visualização.
O diagrama seguinte mostra o que acontece quando um fragmento é adicionado a uma actividade:
primeiro a actividade obtém uma referência ao fragmento. Em seguida, obtém uma referência ao grupo de visualização que a vista do fragmento será renderizada dentro. Em seguida, a atividade adiciona o fragmento. O fragmento então cria sua visão e retorna à atividade. A vista é então inserida no Pai do grupo de visualização, e o fragmento está vivo.
ciclo de vida de fragmentos
ciclo de vida de fragmentos de Android é ilustrado abaixo da imagem.
abaixo estão os métodos do ciclo de vida dos fragmentos.
- : este método será chamado Primeiro, mesmo antes do oncreato(), informando-nos que o seu fragmento foi ligado a uma actividade. Passou-lhe a actividade que irá hospedar o seu fragmento
-
onCreateView()
: O sistema chama este callback quando é hora do fragmento desenhar sua UI pela primeira vez. Para desenhar uma UI para o fragmento, um componente de vista deve ser devolvido a partir deste método que é a raiz do layout do fragmento. Podemos retornar nulo se o fragmento não fornecer um UI -
onViewCreated()
: isto será chamado após onCreateView(). Isto é particularmente útil ao herdar a implementação onCreateView (), mas precisamos de configurar as vistas resultantes, como com uma ListFragment e quando configurar um adaptador -
onActivityCreated()
:Este será chamado após o oncreato() e o oncreview(), para indicar que o oncreato da atividade() foi concluído. Se há algo que é necessário para ser inicializado no fragmento que depende a actividade do onCreate (), tendo concluído o seu trabalho, então onActivityCreated() pode ser usado para a inicialização de trabalho -
onStart()
: onStart() o método é chamado uma vez que o fragmento se torna visível -
onPause()
: O sistema chama este método como o primeiro indício de que o usuário está deixando o fragmento. Este é geralmente o lugar onde você deve confirmar qualquer alteração que deve ser mantida para além da sessão atual do usuário -
onStop()
: Fragmento vai ser parado, chamando onStop() -
onDestroyView()
: É chamado antes de onDestroy(). Este é o equivalente ao onCreateView() onde montamos a IU. Se há coisas que são necessárias para serem limpas especificamente para a IU, então essa lógica pode ser colocada em onDestroyView () -
onDestroy()
: onDestroy() chamado para fazer a limpeza final do Estado do fragmento, mas não garantido para ser chamado pela plataforma Android. -
onDetach()
: é chamado depois de onDestroy(), para notificar que o fragmento foi dissociado de sua atividade de hospedagem
Classes de fragmentos Android
fragmentos foram adicionados à API Android em favo mel(API 11).
-
android.app.Fragment
: A classe base para todas as fragmento de definições -
android.app.FragmentManager
: A classe para interagir com objetos de fragmentos dentro de uma atividade -
android.app.FragmentTransaction
: a classe para executar um conjunto atômico de operações de fragmentos
ao usar uma biblioteca de pacotes de compatibilidade fornecida pela Google, as seguintes classes são usadas para implementação.
-
android.support.v4.app.FragmentActivity
: A classe base para todas as atividades utilizando compatibilidade baseado no fragmento (e carregador) características android.support.v4.app.Fragment
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
Android Fragmento onCreateView()
Aqui um fragmento de exemplo usando onCreateView() para a sua implementação:
public class SampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_sample, parentViewGroup, false); return rootView; }}
onCreateView()
método obtém uma LayoutInflater, um ViewGroup e um Pacote como parâmetros.
LayoutInflater
é um componente que pode criar uma instância de visualização baseada em arquivos XML de layout. Como você pode ver, o exemplo realmente faz isso chamando layout.inflate()
.
inflate()
o método toma três parâmetros: o id de um ficheiro XML de layout (dentro da disposição R.), um grupo de visualização pai no qual a Vista do fragmento deve ser inserida, e um terceiro booleano a dizer se a Vista do fragmento como inflada do ficheiro XML de layout deve ser inserida no grupo de visualização pai. Neste caso, vamos passar falso porque a vista será anexada ao grupo de visualização pai em outro lugar, por algum do Código Android que chamamos. Quando passar o false como último parâmetro a inflar(), o grupo de visualização pai ainda é usado para calcular a disposição da janela inflada, por isso não poderá passar o null como grupo de visualização pai .
ViewGroup
parâmetro de onCreateView() é o grupo de visualização principal no qual a Vista do fragmento deve ser inserida. Este é um grupo de visualização dentro da atividade que irá “hospedar” o fragmento.
Bundle
parâmetro de onCreateView() é um pacote no qual o fragmento pode salvar dados, assim como em uma atividade.
Android Fragment Example
Android fragments example project comprises of a single activity holding two fragments: TextFragment and MenuFragment respectively.
Android Fragment Example Code
The MainActivity
holds the two fragments TextFragment
and MenuFragment
. Então vamos começar com a definição de fragmentos xml de layout
activity_main.xml
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="1.0"> <fragment android:layout_height="match_parent" android:layout_width="match_parent" class="journaldev.com.fragments.fragments.MenuFragment" android:id="@+id/fragment" android:layout_weight="0.5"/> <fragment android:layout_width="match_parent" android:layout_height="match_parent" class="journaldev.com.fragments.fragments.TextFragment" android:id="@+id/fragment2" android:layout_weight="0.5"/></LinearLayout>
Como podemos ver os arquivos de classe dos fragmentos que fazem parte desta atividade são definidos como classe=”journaldev.com.fragmentos.fragmentos.TextFragment”
O fragmento de classes e seus esquemas são definidos como mostrado nos trechos abaixo.
package journaldev.com.fragments.fragments;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import journaldev.com.fragments.R;public class TextFragment extends Fragment { TextView text,vers; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.text_fragment, container, false); text= (TextView) view.findViewById(R.id.AndroidOs); vers= (TextView)view.findViewById(R.id.Version); return view; } public void change(String txt, String txt1){ text.setText(txt); vers.setText(txt1); }}
text_fragment.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:gravity="center" android:background="#5ba4e5" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40px" android:textColor="#ffffff" android:layout_gravity="center" android:id="@+id/AndroidOs"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="#ffffff" android:textSize="30px" android:id="@+id/Version"/></LinearLayout>
o texto é composto por textos com o nome e o número da versão android.
package journaldev.com.fragments.fragments;import android.app.ListFragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import journaldev.com.fragments.R;public class MenuFragment extends ListFragment { String AndroidOS = new String { "Cupcake","Donut","Eclair","Froyo","Gingerbread","Honeycomb","Ice Cream SandWich","Jelly Bean","KitKat" }; String Version = new String{"1.5","1.6","2.0-2.1","2.2","2.3","3.0-3.2","4.0","4.1-4.3","4.4"}; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.list_fragment, container, false); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, AndroidOS); setListAdapter(adapter); return view; } @Override public void onListItemClick(ListView l, View v, int position, long id) { TextFragment txt = (TextFragment)getFragmentManager().findFragmentById(R.id.fragment2); txt.change(AndroidOS,"Version : "+Version); getListView().setSelector(android.R.color.holo_blue_dark); }}
list_fragment.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@android:id/list" /></LinearLayout>
O MenuFragment apresenta um ListView. Como podemos ver aqui, a disposição da ListView é por omissão simple_ list_ item_1 em oposição à disposição personalizada que criamos para a ListView no artigo anterior.
A MainActivity invoca o setContentView do método de onCreate, só isso. Os fragmentos são chamados a partir do arquivo xml.
alternativamente, podemos adicionar os fragmentos da classe de actividade usando FragmentManager
como mostrado no excerto abaixo:
getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();
Aqui o id fragmentParentViewGroup pertence o FrameLayout mostrado abaixo:
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:id="@+id/fragmentParentViewGroup" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity" tools:ignore="MergeRootFrame" />
Android Fragmento Exemplo de Aplicação
Abaixo mostra a saída produzida pelo nosso projeto, você pode ver que os dois fragmentos estão presentes aqui e quando você selecionar qualquer uma delas no lado esquerdo do fragmento, obtém dados preenchidos no lado direito do fragmento.
pode obter o projecto final do fragmento android a partir de abaixo da ligação.