Nota: Programar para Android tem certas semelhanças com o Swing, se você já sabe Swing será mais fácil se adaptar.

Activity

Cada Activity, é uma tela da sua aplicação.

Ele é basicamente um Form onde é possivel adicionar componentes (Views) e programar eventos.

Seu programa iniciará na Activity que for declarada no AndroidManifest.xml como sendo a principal.

Vamos começar a programar algo para entender como funciona.

Abra o Eclipse, crie um novo projeto Android com os seguintes parâmetros

Target: 2.2.
Application name: Todo List
package name: br.teaching.android
Create Activity: TodoListActivity
Min SDK Version: 8

Agora abra o arquivo br/teaching/android/TodoListActivity.java e vamos dar uma olhada no que tem nele.

package br.teaching.android;

import android.app.Activity;
import android.os.Bundle;

public class TodoListActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 }
}

Esse é o código default gerado automaticamente de um programa Hello World para Android.

Como funciona?

public class TodoListActivity extends Activity{

Todas telas da nossa aplicação devem estender Activity para rodar, o Android a usa para o lifecycle.

@Override
public void onCreate(Bundle savedInstanceState)

O método onCreate é invocado quando é solicitado à sua tela, antes que seja exibida. É aqui que registramos os listeners para os eventos, adicionamos componentes, modificamos outros e etc..

super.onCreate(savedInstance);

O Android realiza algumas operações que não nos afetam diretamente na programação a não ser o fato de que se não for invocado um android.app.SuperNotCalledException vai ser lançado.

setContentView(R.layout.main);

Aqui está a magica para colocar os componentes na tela, existe um arquivo chamado main.xml dentro da pasta res/layout, e nós usamos R.layout.main para referir a ele, o setContentView vai ler esse XML, inflá-lo e carregá-lo na tela.

Layout via XML

Vamos agora dar uma olhada no arquivo main.xml abra-o, se for aberto pelo modo ‘Graphical Layout’, clique na aba chamada ‘main.xml’ para mostrar como texto, e ele será o seguinte.

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

Nós criamos o layout da tela via XML, colocando as tags em hierarquia. Nesse caso estamos usando o LinearLayout que ocupa a tela inteira (fill_parent, fill_parent) com um TextView que ocupa toda largura dentro do Layout (fill_parent) mas ocupa só o necessario em altura (wrap_content).

Existem três valores possiveis para os atributos android:layout_(width/heigth):

  • match_parent – O componente irá ocupar todo o espaço disponivel;
  • fill_parent – Igual ao match_parent, mas esse valor foi depreciado e pode-se usar match_parent no lugar;
  • wrap_content – O componente ocupara apenas o tamanho necessario que ele precise para exibir seu conteudo corretamente;

Repare também que o atributo android:text tem o valor “@string/hello”, essa String está declarada em res/values/strings, e é possivel usar esses valores pelo nome do tipo (@strings/) e nome do valor “hello”.

Esse XML representa a tela que vimos ao rodar o programa, apenas um TextView dentro de um Layout.

Para obter a referencia dos componentes via programação e também dentro do XML, precisamos declarar um id para eles no atributo android:id, o valor usado é no padrão “@+id/<idcomponente>”, usamos o @+id para adicionar um novo valor, e o id será o descrito em <idcomponente>. Para usarmos dentro do XML como referencia em outro componente usamos “@id/idcomponente”, programaticamente usamos a classe R.

Como exemplo vamos modificar esse XML para transformar nosso programa em uma lista de coisas a fazer (TodoList). Vamos alterar o layout e colocar alguns componentes na tela.
O layout da nossa tela será um EditText seguido de um Button com uma ListView embaixo.

Usarei o RelativeLayout que é um LayoutManager onde é possivel colocar os componentes em posição relativa aos outros, como acima, abaixo, à direita, à esquerda, alinhado e etc.. informamos isso com as tags android:layout_<direção>=”<id-anchor>”.

O exemplo modificado:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<EditText android:id="@+id/text" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="@string/hello" />
	<Button android:id="@+id/button" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="Adicionar"
		android:layout_toRightOf="@id/text" />
	<ListView android:id="@+id/listView" android:layout_width="fill_parent"
		android:choiceMode="singleChoice" android:layout_height="fill_parent"
		android:layout_below="@id/text" />
</RelativeLayout>

Rodando novamente o programa veremos o resultado do nosso novo layout.

A nossa tela está pronta, agora falta um pouco de ações para ela.
Voltamos ao arquivo TodoListActivity.java.

Trabalhando com os componentes no código

Após setContentView(R.layout.main) podemos acessar os componentes da nossa tela pelo método findViewById(int id), e o id é o que colocamos nos componentes pelo atributo android:id, que são acessiveis pela classe R.

O seguinte código pega nossas três Views como objetos.

EditText text = (EditText) findViewById(R.id.text);
Button button = (Button) findViewById(R.id.button);
ListView list = (ListView) findViewById(R.id.listView);

Com objetos em mão, podemos começar a trabalhar com eles.

Para os dados aparecerem na lista é necessario um Adapter de uma lista de Strings como modelo de dados.

List data = new ArrayList();
ArrayAdapter adapter = new ArrayAdapter(
 getApplicationContext(), android.R.layout.simple_list_item_1,
 data);
 list.setAdapter(adapter);

No Android temos eventos como OnTouchListener, OnClickListener, OnLongClickListener e alguns outros que serão estudados mais a fundo em outros artigos.
Agora podemos criar um evento que ao clicar no botão o texto seja exibido na ListView.

button.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 // O método getText() da classe EditText retorna um Editable, e
 // não uma String ele também implementa CharSequence e por costume
 // uso toString só pra retornar uma String normal.
 String txt = text.getText().toString();
 data.add(txt);
 adapter.notifyDataSetChanged();
 }
 });

Depois disso o próprio Android ira se encarregar de exibir a aplicação, ele vai exibir seu contentView na tela.

Clicando no botao com algum texto teremos algo parecido com isso.

Layout via código

Existem duas formas para criar o layout e adicionar os componentes em uma tela, via XML ou programaticamente.

O código para a mesma tela, com um LayoutManager diferente escrita no código seria o seguinte.

EditText text = new EditText(this);
 ListView list = new ListView(this);
 Button button = new Button(this);
 // Via codigo também é possivel acessar as Strings que estão em
 // resources, o seguinte é o mesmo que o atributo
 // android:text="@string/hello"
 text.setText(R.string.hello);
 button.setText("Adicionar");

 LinearLayout layout = new LinearLayout(this);
 layout.setOrientation(LinearLayout.HORIZONTAL);

 LinearLayout top = new LinearLayout(this);
 layout.setOrientation(LinearLayout.VERTICAL);

 top.addView(text, new LayoutParams(
 RelativeLayout.LayoutParams.MATCH_PARENT,
 RelativeLayout.LayoutParams.WRAP_CONTENT));
 top.addView(button, new LayoutParams(
 RelativeLayout.LayoutParams.WRAP_CONTENT,
 RelativeLayout.LayoutParams.WRAP_CONTENT));

 layout.addView(top, new LayoutParams(
 RelativeLayout.LayoutParams.WRAP_CONTENT,
 RelativeLayout.LayoutParams.WRAP_CONTENT));
 layout.addView(list, new LayoutParams(
 RelativeLayout.LayoutParams.MATCH_PARENT,
 RelativeLayout.LayoutParams.MATCH_PARENT));

 setContentView(layout);

Como não é muito pratico, vou continuar os proximos exemplos usando XML, que além de ser recomendado é mais fácil de ser escrito e lido.

Código fonte dos exemplos

O código completo da aplicação está no repositorio do GitHub, é possivel ver pelo site ou ainda baixar o código completo, explore.