• Nenhum resultado encontrado

a aPi de Fragmentos

No documento Java 122 (páginas 53-55)

Android a partir da versão 3.x (Honeycomb). Apesar disso, está disponível uma biblioteca de compatibilidade (android-support-v4) que permite que alguns recursos presentes no Honeycomb – entre eles, fragmentos – sejam suportados nas versões do Android 2.x para smartphones.

Neste contexto, o intuito deste artigo é apresentar as principais funcionalidades dessa API por meio de exemplos práticos, onde serão expostas suas vantagens e desvantagens. Além disso, também será apresentado ao leitor o ciclo de vida de um fragmento, o uso da biblioteca de compatibilidade e como manipular fragmentos dina- micamente. Ao final, será desenvolvida uma aplicação de leitura de notícias via RSS que utiliza os principais conceitos de fragmentos.

a aPi de Fragmentos

Um fragmento é um componente reutilizável que auxilia os programadores na criação de layouts para dispositivos com ta- manhos de tela variados. Ele representa uma parte da interface gráfica em uma Activity que tem seu próprio ciclo de vida, recebe seus próprios eventos de entrada e pode ser adicionado ou removido enquanto a Activity está em execução.

Para utilizar um fragmento é preciso criar uma classe que estenda android.app.Fragment ou uma de suas subclasses, como ListFragment, DialogFragment ou PreferenceFragment. A Tabela 1 descreve essas classes.

Com o intuito de demonstrar o uso de fragmentos na prática, criaremos uma aplicação de teste que exibe uma mensagem utilizando fragmentos e outra mensagem sem usar esse recurso. Para isso, codificamos a classe MeuFrament, que estende de

Fragment. Veja o código desta classe na Listagem 1.

Conforme indicado na Listagem 1, devemos reimplementar o método onCreateView(). Este método é responsável por carregar o layout que será exibido na tela. Ele recebe como parâmetro, entre outros, um objeto do tipo LaytoutInflater, que transforma um layout definido em XML em uma classe

View, procedimento feito pelo método inflate(), que possui

Classe Descrição

Fragment Classe padrão usada para estender o comportamento de um fragmento.

ListFragment Representa um fragmento que possui uma lista de elementos com métodos para gerenciar a exibição, rolagem e lidar com os eventos de clique em cada elemento.

DialogFragment Fragmento que exibe uma caixa de diálogo sobreposta à Activity corrente. Nela podemos definir um título, uma mensagem e botões de interação com o usuário.

PreferenceFragment Fragmento usado para armazenar e acessar dados de configuração de uma aplicação. Com isso os aplicativos podem manter esses dados mesmo depois de fechados.

Tabela 1. Principais classes da API de Fragmentos

Listagem 1. Exemplo de uma subclasse de Fragment

01. package labs.org.br; 02. 03. import org.cesar.br.R; 04. import android.app.Fragment; 05. import android.os.Bundle; 06. import android.view.LayoutInflater; 07. import android.view.View; 08. import android.view.ViewGroup; 09.

10. public class MeuFragment extends Fragment { 11.

12. @Override

13. public View onCreateView(LayoutInflater inflater, ViewGroup container, 14. Bundle savedInstanceState) {

15. return inflater.inflate(R.layout.exemplo_fragmento, container, false); 16. }

17. }

Listagem 2. Exemplo do arquivo de layout que será carregado pelo fragmento.

<?xml version=”1.0” encoding=”utf-8”?> <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” > <TextView android:layout_width=”match_parent” android:layout_height=”wrap_content” android:text=”@string/fragmento_str” /> </LinearLayout>

Listagem 3. Associando um fragmento a uma Activity.

<?xml version=”1.0” encoding=”utf-8”?> <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” > <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”@string/activity_str” /> <fragment android:name=”labs.org.br.ExemploFragmento” android:id=”@+id/fragment” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </LinearLayout>

1. O identificador do layout que será usado;

2. Um objeto do tipo ViewGroup, que será o pai da View que está sendo gerada;

3. Um parâmetro booleano que, se true, indica que a View carre- gada deve ser associada ao ViewGroup.

Como pode ser observado, um dos parâmetros do método infla-

te() é o identificador do layout que será carregado pelo fragmento.

Esse identificador aponta para um arquivo XML onde o layout é especificado. A Listagem 2 apresenta um exemplo de como esse arquivo é definido.

Como podemos observar, a Listagem 2 possui um layout que exibe um texto na tela do dispositivo quando a aplicação é carregada.

Até agora criamos um fragmento e definimos o seu layout. O próximo passo consiste em adicioná-lo à activity. Para isso, devemos declarar o fragmento no arquivo de layout da activity, como ilustra a Listagem 3.

A tag <fragment> é usada para declarar um fragmento dentro de um arquivo de layout. Ela possui os atributos name, id e tag, descritos na Tabela 2.

name Especifica a classe Fragment que será instanciada e incorporada ao layout. id Identifica o fragmento por meio de um identificador numérico gerado pelo Android. tag Identifica o fragmento por meio de um identificador em formato de String.

Tabela 2. Atributos da tag <fragment>

No exemplo demonstrado na Listagem 3, percebemos que por meio do atributo name instanciamos a classe de fragmento da

Listagem 1 e exibimos o seu conteúdo junto com o layout da

Activity. Vale lembrar que cada fragmento possui um identificador único definido pelo atributo id ou tag. Podemos empregar qual- quer um dos dois para obter a instância do fragmento que está em uso, sendo que o último recebe como parâmetro um texto e o primeiro um número. Assim, usa-se o método getFragmentMana-

ger() para obter o objeto da classe FragmentManager e, por meio

dos seus métodos findFragmentById() e findFragmentByTag(), recuperar a instância do fragmento que se pretende encontrar. A Listagem 4 mostra como podemos acessar MeuFragment.

A linha 6 recupera a instância do fragmento por meio do método

findFragmentById(), que recebe como parâmetro o identificador

do fragmento procurado. No exemplo, o identificador do fragmen- to foi definido pelo atributo id na Listagem 3.

Depois de elaborar o layout da activity contendo o fragmento, precisamos adicioná-lo à activity por meio do método setCon-

tentView(). Isso pode ser feito criando uma classe que estende

de Activity e sobrescrevendo o método onCreate(), como pode ser observado na Listagem 5.

É no layout passado por parâmetro para o método setContent-

View() que definimos por meio da tag <fragment> qual frag-

mento será utilizado pela nossa Activity. Com isso finalizamos o nosso primeiro exemplo. Ao executá-lo, o resultado deve ser semelhante ao apresentado na Figura 1.

Figura 1. Aplicação exemplo mostrando os textos definidos na Activity e no Fragmento

Listagem 4. Acessando um fragmento de dentro de uma Activity.

1. @Override

2. public void onCreate(Bundle savedInstanceState) { 3. super.onCreate(savedInstanceState); 4. setContentView(R.layout.main); 5.

6. MeuFragment meuFragment = (MeuFragment) getFragmentManager(). findFragmentById(R.id.fragment);

7. }

Listagem 5. Criando uma classe que estende Activity.

01. package labs.org.br; 02. 03. import org.cesar.br.R; 04. 05. import android.app.Activity; 06. import android.os.Bundle; 07.

08. public class MinhaActivity extends Activity { 09. @Override

10. public void onCreate(Bundle savedInstanceState) { 11. super.onCreate(savedInstanceState);

12. setContentView(R.layout.main); 13. }

14. }

No documento Java 122 (páginas 53-55)

Documentos relacionados