segunda-feira, 4 de junho de 2012

Android: Dicas 7

Olá povo,

Depois de um bom tempo, um novo post da série "Dicas de Android". Espero que gostem ;)

1. Aplicando um background para toda a aplicação

Primeiro precisamos criar uma extensão do estilo que está sendo utilizado na aplicação. Você pode fazer isso criando o arquivo styles.xml na pasta values e deixando-o conforme abaixo:
<resources>
  <style name="MeuTemaPersonalizado"
  android:parent="@android:style/Theme.Black.NoTitleBar">
  <item name="android:windowBackground">
    @drawable/sua_imagem_de_bg
  </item>
  </style>
</resources>

Depois, é só utilizar o estilo criado na tag
<application
  android:icon="@drawable/ic_launcher"
  android:label="@string/app_name"
  android:theme="@style/MeuTemaPersonalizado">

2. Deixando os nomes dos parâmetros corretos no Eclipse

No Eclipse, clique com o botão direito sobre o projeto e selecione Properties. No lado esquerdo, selecione Java Build Path, e em seguida, selecione a aba Libraries. Aqui você deve expandir a versão do Android que você está utilizando (2.3.3 por exemplo), e depois expandir o android.jar. Serão exibidos alguns subitens, entre eles, o Javadoc location. Basta clicar em Edit... e informar o local onde está a documentação do Android (até a pasta docs/reference). Depois é só clicar em Validate e pronto! Agora o Javadoc aparecerá no editor e nas classes/interfaces do Android que você herdar/implementar.


3. Bloqueando a Home key
Desde sempre dizia que não dava para bloquear a Home até que meu colega Rodrigo Barbosa precisou fazer isso e resolveu compartilhar aqui no blog. Basta colocar o método abaixo na sua Activity.
@Override 
public void onAttachedToWindow() {
  this.getWindow().setType(
    WindowManager.LayoutParams.TYPE_KEYGUARD); 
  super.onAttachedToWindow(); 
}

4. Lendo XML com a Biblioteca Simple XML 
Apesar de ser adepto do "Do it yourself", algumas pessoas preferem as facilidades das bibliotecas. Recebi essa dica de Rafael Cavalcanti, que me indicou a Simple XML Serialization que facilita a leitura de arquivos XML. Ele converte automaticamente os elementos do arquivo XML em Objetos e Atributos de uma classe utilizando apenas anotações.
Abaixo um tutorial no próprio site do desenvolvedor:
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

Mas para não deixar de mostrar alguma coisa aqui... Baixe o JAR da biblioteca e adicione ao Build Path do projeto.
@Root
class Carros {
  @ElementList(inline=true)
  public  List<Carro> list;
}

@Root
class Carro {
  @Element
  public String nome;
  @Element
  public String desc;
  @Element
  public String url_info;
  @Element
  public String url_foto;
}

Para ler esse XML do livro do Ricardo Lecheta era só fazer isso...

URL url = new URL(
  "http://livroandroid.com.br/"+
  "livro/carros/carros_esportivos.xml");

HttpURLConnection conexao = (HttpURLConnection) 
  url.openConnection();

Serializer serializer = new Persister();
Carros example = serializer.read(
  Carros.class, conexao.getInputStream());

for (Carro carro : example.list) {
  Log.d("NGVL", "Carro:" + carro.nome);
}


5. Personalizando Links do Android
A classe TextView tem a propriedade AutoLink (android:autoLink) que cria detecta links automaticamente no texto que está sendo exibido. Esses links podem abrir o navegador, cliente de email e o discador do aparelho. Mas e se quisermos fazer um link para abrir uma Activity nossa?
A classe Linkify permite criar links baseados em uma expressão regular.
TextView txt1 = (TextView)findViewById(R.id.textView1);
txt1.setText("Testando esse CEP 55555-4444");
// Zip code dos EUA
Pattern pattern = Pattern.compile(
  "\\d{5}([\\-]\\d{4})?");

String scheme = "glauber://";
Linkify.addLinks(txt1, pattern, scheme);
Notem que foi passado o esquema glauber:// Para fazer com que uma Activity nossa responda a chamadas a esse "protocolo" é só adicionar uma na declaração da Activity no AndroidManifest.xml
<activity
  android:name="ActivityQueSeraChamada"
  android:label="@string/app_name" >
  <intent-filter>            
    <action 
       android:name="android.intent.action.VIEW"/>
    <category 
      android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="glauber"/>
  </intent-filter>
</activity>
Para obter o valor do link clicado, basta usar getIntent().getDataString(). Isso retornará "glauber://55555-4444"

6. TableLayout e a propriedade layout_span
Estava querendo fazer um exemplo de TableLayout similar ao abaixo na minha última aula do TECDAM:
Uma característica do TableLayout é que cada linha é uma TableRow e cada coluna é um componente, que no caso acima, são TextViews, EditText e Checkboxes. Eu utilizei para a segunda coluna, a propriedade android:stretch_columns que informa quais colunas devem ser esticadas.
Porém, se você observar, a linha de cima tem 2 colunas, enquanto que a de baixo tem 3, foi aí que achei a propriedade android:layout_span (que é bem similar a do HTML) e informa quanto uma coluna irá expandir e criar uma nova coluna. Vejam como ficou o código do layout acima.
<?xml version="1.0" encoding="utf-8"?>
<TableLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  android:stretchColumns="1,2" >

  <TableRow>
    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Nome" />

    <EditText
      android:id="@+id/editText1"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_span="2" />
  </TableRow>

  <TableRow>
    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Avisos por:" />

    <CheckBox
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Email" />

    <CheckBox
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Telefone" />
  </TableRow>
</TableLayout>


É isso pessoal, qualquer dúvida, deixem seus comentários.

4br4ç05,
nglauber

Nenhum comentário: