Mostrando postagens com marcador Dicas. Mostrar todas as postagens
Mostrando postagens com marcador Dicas. Mostrar todas as postagens

terça-feira, 19 de agosto de 2014

Cuidado ao falar com especialistas

Olá povo,

O texto abaixo é do excelente livro "O Programador Pragmático: De aprendiz a mestre" (Cap.1, pág.39). Nesse trecho, os autores descrevem como devemos agir ao entrarmos em contato com especialistas. Sua publicação original é de 1999, mas seus conceitos são certamente válidos até hoje, entretanto tive a ousadia de fazer alguns mínimos ajustes.

"Com a adoção global da internet, os especialistas se tornam tão acessíveis quanto nossa tecla Enter. Portanto, como encontrar um e fazê-lo conversar com você? Conhecemos alguns truques simples:

  • Saiba exatamente o que quer perguntar e seja tão específico quanto puder.
  • Formule sua pergunta cuidadosa e polidamente. Lembre-se de que você está pedindo um favor; não dê a impressão de que está exigindo uma resposta.
  • Uma vez que tiver formulado sua pergunta, pare e pense novamente. Selecione algumas palavras-chave e pesquise na web no Google.
  • Decida se quer perguntar pública ou privadamente. Grupos de notícias Fóruns de discussão e o stack overflow são ótimos pontos de encontro de especialistas em qualquer tópico, mas algumas pessoas não gostam de perguntar publicamente tomam cuidado devido a natureza pública desses grupos. Alternativamente, você sempre pode mandar um email direto para o especialista. De uma forma ou de outra, use uma linha de assunto significativa ("Preciso de ajuda!!!" não é suficiente).
  • Sente-se e tenha paciência. As pessoas são ocupadas e pode demorar dias para chegar uma resposta específica.

Para concluir, não deixe de agradecer qualquer pessoa que lhe responder. E se encontrar pessoas fazendo perguntas que você pode responder, desempenhe seu papel e participe."

4br4ç05,
nglauber


terça-feira, 11 de março de 2014

Dicas de Android 10

Olá povo,

Mais um post da série "Dicas de Android". Aproveitem!

Dica 1. Densidades de tela no Android e seus DPIs.
Atualmente temos dispositivos Android de diversos tamanhos e com qualidade de tela diferentes. É importante sabermos a tabela abaixo para usar imagens adequadamente para cada um deles.
DensidadeDots per inchProporção
LDPI120dpi0.75
MDPI160dpi1.00
HDPI240dpi1.50
XHDPI320dpi2.00
XXHDPI480dpi3.00
XXXHDPI640dpi4.00

Dica 2. Obter as polegadas de um aparelho. Dica de Maurício Taumaturgo.
public double getInch(Activity act) {
  DisplayMetrics displayMetrics = new DisplayMetrics();
  act.getWindowManager().getDefaultDisplay()
    .getMetrics(displayMetrics);

  double x = Math.pow(
    displayMetrics.widthPixels/displayMetrics.xdpi,2);
  double y = Math.pow(
    displayMetrics.heightPixels/displayMetrics.ydpi,2);
  double screenInch = Math.sqrt(x+y);
  return screenInch; 
}

Dica 3. HTML no TextView. Dica de Diego Nascimento (aluno do TECDAM)
O Android suporta algumas tags HTML dentro do componente TextView. Mas se quisermos carregar as imagens da tag <img /> usamos a classe ImageGetter.
TextView tvText = (TextView) findViewById(R.id.text);
final String textoEmHtml = 
  "<html><body>Html em "
  + "<b>Negrito</b> e <i>Itálico</i>"
  + "<img src='mario.png' />"
  + "Mais um texto qualquer"
  + "<img src='luigi.png' />"
  + " texto depois da imagem</body></html>";

ImageGetter imgGetter = new ImageGetter() {
  public Drawable getDrawable(String source) {
    BitmapDrawable drawable = null;
    try {
      Bitmap bmp = BitmapFactory.decodeStream(
        getAssets().open(source));

      drawable = new BitmapDrawable(
        getResources(), bmp);

      drawable.setBounds(
        0, 0, bmp.getWidth(), bmp.getHeight());

    } catch (IOException e) {
      e.printStackTrace();
    }
    return drawable;
  }
};

meuTextView.setText(
  Html.fromHtml(textoEmHtml, imgGetter, null));

Dica 4. Customizando ActionBar
A ActionBar é utilizada como padrão navegacional do Android. Entretanto, customiza-la para com as cores da sua aplicação requer um certo esforço. Para minizar esse trabalho, é possível gerar os arquivos de recurso para personalizar a ActionBar através do site Android ActionBar Style Generator.

Dica 5. EditText com imeOptions e inpuType
A propriedade inputType do EditText indica qual o formato do teclado virtual mais adequado para a caixa de texto, enquanto a propriedade imeOptions indica o botão de ação do teclado.
<EditText
  android:id="@+id/editText1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:inputType="textEmailAddress"
  android:imeOptions="actionDone" />
final EditText edtEmail = 
  (EditText)findViewById(R.id.editText1);
edtEmail.setOnEditorActionListener(
  new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(
      TextView v, int actionId, KeyEvent event) {

      if (v == edtEmail && 
        EditorInfo.IME_ACTION_DONE == actionId) {

        String email = edtEmail.getText().toString();
        if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()){
          edtEmail.setError("Email inválido!");
        }
        return true;
      }
      return false;
    }
});
Dica 6. Carregando HTML com CSS e JavaScript no WebView
Se você for carregar um arquivo HTML que está dentro do seu APK, e esse arquivo usa arquivos de CSS e JavaScript, aconselho coloca-los na pasta assets do seu projeto e carregá-los da seguinte forma:
mWebView = (WebView) v.findViewById(R.id.webView1);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.loadDataWithBaseURL(
  "file:///android_asset/", 
  "Meu Html que usa CSS e JS",
   "text/html", "UTF-8", null);

4br4ç05,
nglauber

sexta-feira, 22 de março de 2013

iOS: Dicas 3

Olá povo,

Quem está começando com o desenvolvimento iOS pode ficar um pouco perdido com a quantidade de novos recursos que aparecem a cada versão, principalmente se estiver usando livros e/ou cursos "antigos" (1 ano atrás é antigo sim :). Tendo em vista esse cenário, Stuart Hall deu as seguintes dicas pra quem estiver começando agora com programação para os dispositivos da Apple.

Esse post foi enviado para mim por Eric Cavalcanti e é praticamente uma tradução desse post aqui.

Use ARC!
ARC é incrível, ele remove muito da complexidade de gerenciamento de memória que tínhamos de lidar anteriormente. Apesar de ser importante entender o gerenciamento de memória, o ARC torna sua vida muito mais fácil.
Desenvolvedores mais experientes relutam em usá-lo, pois querem ter esse controle da alocação e liberação de memória. Mas como muitas bibliotecas populares passaram a usar ARC, não "bata o pé" e aproveite os benefícios do ARC.

Use Blocks
Blocos são impressionantes, o código fica menor e mais claro. Várias partes da API da própria Apple já usam esse recurso. Se você não conhece blocks, dê uma olhada nesse post aqui.
Há momentos em que os delegates/protocols ou NSNotifications fazem sentido, mas os blocks devem ser sua primeira opção.

Esqueça as Threads! Use GDC.
Não sei quem disse essa frase, mas ela é a mais pura verdade:
"A programmer had a problem, so he used threads, then he had two"

O GCD (Grand Central Dispatch) tornou a vida muito mais fácil, podemos fazer uma requisição em segundo plano para não travar a UI e depois podemos atualizá-la:
dispatch_async(
  dispatch_get_global_queue(
    DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
      ^(void) {
        // Código em background
        dispatch_async(dispatch_get_main_queue(), 
          ^(void) {
             // Atualize a UI
           }
        );
      }
);

Singletons com GDC
Como o Objective-C não tem o conceito de construtores, podemos usar o GDC para criar singletons.
+ (MinhaClasse *)sharedInstance {
  static MinhaClasse *_shared = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _shared = [[MinhaClasse alloc] init];
  });   
  return _shared;
}

StoryBoards são para protótipos
Na minha opinião os benefícios dos Storyboards não compensam, principalmente se você estiver fazendo mais que um projeto básico. Essa é a minha opinião, algumas pessoas amam Storyboards.
Para trabalhar em projetos com uma equipe de desenvolvimento, imagine você precise fazer merge de código de um StoryBoard usando SVN (ou até mesmo GIT). Pode ser traumático!

Internacionalize sua aplicação
Tenha em mente que sua aplicação poderá rodar em todos os países do mundo. Então prepare-a para rodar em vários idiomas. Eu fiz um vídeo que mostra como fazer internacionalização no iOS aqui.

Analise!
O menu Product > Analize exibe possíveis problemas no seu código. Achei ele muito bacana, principalmente em projetos médio/grandes.

Ame o StackOverflow
Há um monte de ótimos desenvolvedores iOS no Stack Overflow, e as chances de que eles tenham resolvido o seu problema são bem grandes. Por favor, procure antes de fazer uma pergunta, a maioria já foi respondida.

4br4ç05,
nglauber


sexta-feira, 22 de fevereiro de 2013

Android: Dicas 8

Olá povo,

Mais um post da série "Dicas de Android", aproveitem! E como sempre, qualquer dúvida ou sugestão deixem seus comentários.

Dica 1 - Crash Report

Essa dica veio de Charles Alves do Curso de Android EAD do CESAR.edu. É possível enviar relatórios de erro da sua aplicação para onde o desenvolvedor desejar através do ACRA (https://github.com/ACRA/acra), por padrão, ele envia para um formulário no google docs.

Dica 2 - Verificar recursos do aparelho.

Através da classe PackageManager podemos verificar se um aparelho conta com um determinado recurso de hardware, como câmera, wi-fi, etc.

PackageManager pm = getPackageManager();
boolean temCamera = 
  pm.hasSystemFeature(
    PackageManager.FEATURE_CAMERA);
boolean temWiFiDirect = 
  pm.hasSystemFeature(
    PackageManager.FEATURE_WIFI_DIRECT);
boolean temScreenPortrait = 
  pm.hasSystemFeature(
    PackageManager.FEATURE_SCREEN_PORTRAIT);

Dica 3 - Mockups pra Android (Dica de Eric Cavalcanti)

Uma ótima ferramenta de prototipagem para Android é o Pencil (http://pencil.evolus.vn). Vale a pena conferir.

Dica 4 - Obtendo o tamanho da tela
Muitas vezes é necessário obter o tamanho da tela. Podemos fazer isso através da classe Display. Ela é retornada pela classe WindowManager que é um serviço do sistema.

Display display = ((WindowManager) 
  getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth();  
int height = display.getHeight();

Dica 5 - Rotação do Emulador 2.3
Um "problema" que eu sempre tinha no emulador do 2.3, era que quando eu girava o emulador para landscape e voltava para portrait, o mesmo continuava em landscape. Para contornar isso, acesse a opção Menu/Settings/Screen e desabilite a opção Autorotate.

Dica 6 - Invertendo os itens da ListView
Podemos fazer com que os itens de uma ListView começem de baixo, basta usar a propriedade android:stackFromBottom="true".

Dica 7 - PopupWindow
Só suportado no Android 3.0 (API Level 11)
public void showPopup(View v) {
    PopupMenu popup = new PopupMenu(this, v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.actions, popup.getMenu());
    popup.show();
}

Dica 8 - Exibir um vídeo
Dica de Tiago Gomes, aluno da Unibratec. Tocar vídeo da pasta res/raw

VideoView video = (VideoView) 
  findViewById(R.id.videoView1);
Uri uri = Uri.parse("android.resource://" + 
  getPackageName() + "/raw/arquivo_video");
video.setVideoURI(uri);
video.requestFocus();
video.start();

Dica 9 - API para gráficos de "pizza"
Dúvida de Rodrigo Bezerra. Eu nunca usei, mas aparentemente funciona :)
http://www.achartengine.org/

4br4ç05,
nglauber

sexta-feira, 15 de fevereiro de 2013

iOS: Dicas 2

Olá povo,

Esse post vai em homenagem a minha turma do Curso de iOS à distância que ministrei no CESAR.edu. Foram deles as dúvidas abaixo que resolvi compartilhar com vocês.

Dica 1 - Adicionando UITableView ao UIAlertView
Podemos adicionar qualquer UIView dentro de um UIAlertView. Basta usar o método addSubView e posicioná-la da maneira que deseja. O que achei "feio" aqui é que para determinar o tamanho do alert setamos o texto dele com "\n". Poderíamos utilizar o método initWithFrame, mas achei o código ainda mais complexo (embora mais preciso em termos de tamanho).

UITableView *table = 
  [[UITableView alloc] 
    initWithFrame:CGRectMake(10, 50, 265, 100)];    
table.dataSource = self;
table.delegate = self;
    
UIAlertView *alert = [[UIAlertView alloc] 
  initWithTitle:@"Escolha uma opção"
  message:@"\n\n\n\n\n" 
  delegate:self 
  cancelButtonTitle:@"OK" 
  otherButtonTitles:nil, nil];
    
[alert addSubview:table];
alert.autoresizesSubviews = YES;
[alert show];

Tem uma opção interessante aqui também.

Dica 2 - Desabilitando um segmento do UISegmentedControl
Essa foi simples de achar, mas na aula passou desapercebido.

[_meuSegmentedControl 
  setEnabled:NO forSegmentAtIndex:0];

Dica 3 - Definir o badge da aplicação
O badge nada mais é do que o número que aparece em cima do ícone da aplicação, por exemplo quanto temos chamadas não atendidas e/ou mensagens recebidas.

[[UIApplication sharedApplication] 
  setApplicationIconBadgeNumber:12];

Dica 4 - Adicionar View ao teclado
Ao invés de criar a view no código, você pode adicionar a mesma no XIB da tela e setar a propriedade inputAccessoryView. Para exemplificar, adicionei uma Toolbar ao XIB e crie um IBOutlet para ela.
@interface NGViewController : UIViewController
@property (weak, nonatomic) 
  IBOutlet UITextField *txtSobrenome;
@property (weak, nonatomic) 
  IBOutlet UIToolbar *minhaBarra;
@end
Depois é só colocar isso no viewDidLoad
[_txtSobrenome setInputAccessoryView:_minhaBarra];


Dica 5 - Ocultar teclado virtual
Sempre xingava o iOS por ter que ocultar o teclado via código. Mas achei a melhor maneira para ocultar o teclado. É só usar o método touchesBegan:withEvent da classe UIRespoder (super classe de UIView e UIViewController)  e chamar o método endEditing da UIView.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
Independente da quantidade de UITextFields, o teclado vai sempre desaparecer.

Dicas 6 - Obtendo a orientação
Uma das melhores maneiras de obter a orientação do dispositivo é a abaixo:

// Verifica se é portrait ou portrait upsidedown
if (UIDeviceOrientationIsPortrait(
      [[UIApplication sharedApplication] 
        statusBarOrientation])){
}

Essa abordagem resolve alguns problemas que já tive. Por exemplo, quando o telefone está sobre a mesa, o método [[UIDevice currentDevice]orientation] retorna a orientação UIDeviceOrientationFaceUp (com o display para cima), enquanto que o método acima retorna a orientação da barra de status do aparelho e não do aparelho em si.

Qualquer dúvida (ou sugestão), deixem seus comentários,

4br4ç05
nglauber

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

segunda-feira, 13 de fevereiro de 2012

Android: Dicas 6

Olá povo,

Mais um post da série "Dicas de Android". Deixem suas sugestões para os próximos posts.

1 Instalar APK a partir da sua aplicação.
File apk = new File(
  Environment.getExternalStorageDirectory() + 
  "/Copas.apk");
Intent it = new Intent(Intent.ACTION_VIEW);
it.setDataAndType(Uri.fromFile(apk),
  "application/vnd.android.package-archive");
startActivity(it);

O código acima, carrega um arquivo (Copas.apk) que está na raiz do cartão de memória e dispara uma Intent que perguntará se o usuário deseja instalar a aplicação. Ao confirmar, a aplicação será instalada.

2. Criando arquivos no cartão de memória.
O código abaixo mostra como criar um diretório no cartão de memória do aparelho e depois cria um arquivo nesse diretório.
File meuDir = new File(
  context.getExternalFilesDir(null), "meuDir");
if (!meuDir.exists()) {
  meuDir.mkdir();
}

try {
 File arquivoTxt = new File(meuDir, "arquivo.txt");
 if (!arquivoTxt.exists()) {
   arquivoTxt.createNewFile();
 }
 FileOutputStream fos =
   new FileOutputStream(arquivoTxt);

 fos.write("Exemplo".getBytes());
 fos.close();
   
} catch (IOException e) {
 e.printStackTrace();
}


Adicione a permissão no AndroidManifest.xml
<uses-permission
 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Vale salientar que o código acima criará um diretório com o nome do pacote da aplicação na pasta Android que está na raiz do cartão de memória. Outro detalhe importante é que o arquivo será excluído caso a aplicação seja desinstalada.

3. Texto sublinhado ou strike no TextView
No editor visual do Android podemos alterar a propriedade android:textStyle para bold ou italic. Mas para o strike (como isso) ou sublinhado (como isso). Precisamos utilizar o código abaixo.
textView.setPaintFlags(
  textView.getPaintFlags() | 
  Paint.STRIKE_THRU_TEXT_FLAG);

O código acima, coloca o textView como strike. Para usar sublinhado, use a constante UNDERLINE_TEXT_FLAG da classe Paint.
Crédito dessa dica para Alvaro Cavalcanti.

4. Voltando para tela inicial da Activity
Digamos que você tem as Activities A, B, C e D. E da tela D você quer voltar pra A, faça o seguinte:
Intent it = new Intent(this, A.class);
it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(it);

Essa chamada fará com que a Activity "A" seja re-criada, ou seja, o onCreate da mesma será chamado novamente. Para evitar isso, coloque no manifest, na declaração abaixo:
<activity
  android:name=".A"
  android:label="Primeira Activity"
  android:launchMode="singleTop"/>

Com isso, o método onNewIntent será chamado (ao invés do onCreate) e você poderá fazer algum tratamento lá baseado na nova Intent que está chegando.

5. Aumentando a memória disponível para aplicação
Estava trabalhando em uma aplicação Android para tablets que estava dando OutOfMemoryError. Após algumas investigações checamos que estávamos alocando muitas imagens, mas estávamos desalocando todas, ou seja, aparentemente tudo certo. Então nos deparamos com a propriedade abaixo:
<application
  android:largeHeap="true"
  ...>

Sem muita documentação, a propriedade acima, aumenta a memória da Dalvik (máquina virtual do Android) reservada para a aplicação, e para nós, funcionou.
Créditos para Andréa Santos (apesar dela não querer compartilhar informações) :D

6. Evitando cast no findViewById
Todo mundo que fez mais que um HelloWorld com Android, sabe que para obter a referência de um componente declarado em um arquivo de layout utiliza-se o método findViewById. Mas como esse método retorna um objeto da classe View (que é a superclasse de todos os componente visuais do Android) temos que fazer o cast para o componente desejado como abaixo:
Button b = (Button)findViewById(R.id.meuBotao);

Mas existe uma maneira de evitar esse cast utilizando o recurso de Generics do Java. Basta declarar o método abaixo na sua Activity.
@SuppressWarnings("unchecked")
private <T>T getViewById(int id){
  return (T)findViewById(id);
}

E para utilizar:
Button b = getViewById(R.id.meuBotao);

Economizamos aí alguns caracteres :) Créditos para Gustavo Pinto e José André Henrique.

Dúvidas ou sugestões? Deixem seus comentários.

4br4ç05,
nglauber

quinta-feira, 20 de outubro de 2011

Android: Dicas 5

Olá povo,

Esse é mais um post da série de dicas de Android. Aproveitem e deixem seus comentários :)

Dica 1 - Alterando a fonte dos componentes
O Android, por padrão, tem apenas 3 fontes que podem ser utilizadas nos componentes visuais: sans, serif e monospace. Para utilizar cada uma delas, basta atribuir o valor desejado à propriedade android:typeface. Mas se quiser utilizar uma nova fonte, basta adicionar o arquivo *.ttf na pasta assets e carregá-la utilizando o código abaixo.
Typeface typeface =
Typeface.createFromAsset(getAssets(), "Aliens.ttf");

TextView txt = (TextView)findViewById(R.id.textView1);
txt.setTypeface(typeface);

Infelizmente, não achei uma forma de setar essa fonte no XML. Se alguém souber, deixe um comentário. Ah! A fonte que usei nesse exemplo foi baixada do site http://www.webpagepublicity.com/free-fonts.html.

Dica 2 - Converter DIP (Density Independent Pixel) para Pixel
Após ministrar duas aulas seguidas (em turmas diferentes) sobre Views personalizadas no Android, uma dúvida frequente foi como converter DIP para PX (pixel). Isso é especialmente útil para que a View rode corretamente em diferentes densidades de tela (LDPI, MDPI, HDPI e agora XHDPI). Para tal, pode-se utilizar o método applyDimension da classe TypeValue.
Resources r = getResources();
float valorEmDp = 14;
float valorEmPixels = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, valorEmDp,
r.getDisplayMetrics());


Dica 3 - Evitando acumular Toasts
Um "bug" clássico que os engenheiros de teste do projeto em que eu trabalho levantam é sobre a utilização do Toast. Se você chamar o método show() dessa classe várias vezes seguidas, essas mensagens são acumuladas e ficam sendo exibidas sequencialmente. Um recurso que utilizo é criar um método separado, que verificará se já existe um Toast aberto, em caso positivo, ele o cancela para exibir um novo. Para tal, você deve criar um atributo da classe Toast (que abaixo chamo de 'toast') e utilizar o seguinte código:
// Declare o atributo
private static Toast toast;

// Método
public static void showToast(Context ctx, int res){
if (toast != null){
toast.cancel();
toast.setText(res);
} else {
toast = Toast.makeText(ctx, res, Toast.LENGTH_LONG);
}
toast.show();
}


Dica 4 - Definindo onde instalar sua aplicação
A partir da versão 2.2 (Froyo) é possível especificar onde sua aplicação pode ser instalada: cartão de memória ou memória interna. Por padrão, a aplicação será instalada na memória interna, mas você pode utilizar a propriedade android:installLocation da tag <manifest> do AndroidManifest.xml para um dos valores abaixo:
internalOnly - A aplicação só poderá ser instalada na memória interna (valor padrão).
auto - A aplicação é instalada na memória interna, mas poderá ser movida para o cartão de memória posteriormente ou quando a memória interna estiver cheia.
preferExternal - A aplicação deve ser instalada no cartão de memória preferencialmente, mas isso não é garantido.

Exemplo:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
... >


Dica 5: Ativar/Acender a tela do aparelho
Neste post eu mostrei como criar notificações no Android. Um recurso que pode ser utilizado juntamente com as notificações é acender/ligar a tela do aparelho. Para fazer isso, deve-se utilizar a classe PowerManager.

// Obtém a instância do PowerManager
PowerManager pm = (PowerManager)c.getSystemService(
Context.POWER_SERVICE);

// Liga o display do aparelho
WakeLock wakeLock = pm.newWakeLock(
// Liga a tela
PowerManager.SCREEN_DIM_WAKE_LOCK |
// Após liberar a tela para apagar,
// mantém a tela ligada por um pouco
// mais de tempo
PowerManager.ON_AFTER_RELEASE,
// Tag para debug
"tag_para_debug");

// Liga a tela por 10 segundos
wakeLock.acquire(10000);


Para usar o código acima, deve-se adicionar a permissão WAKE_LOCK no AndroidManifest.xml.
<uses-permission name="android.permission.WAKE_LOCK"/>


Dica 6: debug.keystore expirou

Essa dica foi enviada pelo meu colega Ricardo Gilson.
Toda aplicação Android é assinada para ser instalada no dispositivo, por padrão, ela é assinada com uma assinatura de debug através do arquivo debug.keystore que fica na subpasta ".android" no diretório do usuário (C:\Users\usuario\.android ou /Users/usuario/.android). Depois de um certo tempo sem utilizar a máquina, a mensagem abaixo pode ser exibida ao tentar rodar uma aplicação:

Error generating final archive: Debug Certificate expired on 24/09/2011.

Para resolver o problema é só apagar o arquivo debug.keystore, dar um clean no projeto do Eclipse (menu Project > Clean) e tentar rodar novamente.

Dica 7: Habilite a aceleração de Hardware (por Fernado Fragoso)
Habilitar a aceleração de hardware quando necessitar de manipulação de imagens, adicionar na tag application do AndroidManifest.xml.

android:hardwareAccelerated="true"

Faz uma diferença gigantesca! Valeu Fernando!

Por hoje é só, qualquer dúvida ou sugestão, deixem seus comentários.

4br4ç05,
nglauber

sexta-feira, 7 de outubro de 2011

20 dicas para programadores

Olá povo,

Conviver com pessoas mais experientes é uma coisa muito boa, pois você pode explorar o know-how dessas pessoas e crescer profissionalmente (e às vezes pessoalmente). Eu tenho a satisfação de ter trabalhado, tido aulas e ter sido orientando por Luiz Eugênio Fernandes Tenório (left), um excelente profissional de desenvolvimento de software (senão o melhor que conheço).
Em 21 de agosto de 2007, ele me mandou um email com um texto de Jonathan Danylko que a muito tempo queria postar aqui no blog. É um conjunto de boas práticas, que um desenvolvedor de software pode seguir para melhorar a produtividade e a qualidade do seu trabalho. Adotei uma boa parte dessas dicas, e notei bons resultados através de feedbacks de gestores e colegas de trabalho. E por causa disso, resolvi compartilhar com vocês.

O texto abaixo é uma tradução/adaptação minha (vixe!) do texto original em inglês disponível aqui.

  1. Defina quanto tempo você acha que deve gastar para resolver um problema. Já vi programadores sentarem na frente de um monitor por oito horas para resolver um problema e nada. Defina uma tabela de tempo para si mesmo de 1 hora, 30 minutos, ou até mesmo 15 minutos. Se você não conseguir descobrir uma solução para seu problema dentro de seu prazo, peça ajuda ou pesquise seu problema na Internet em vez de tentar ser um super-coder.
  2. As linguagens são similares. Com o tempo, você entenderá como uma linguagem funciona, então você vai notar semelhanças com outras linguagens. A linguagem que você escolher deve: te fornecer um nível de "conforto" adequado, a capacidade de produzir código eficiente (e limpo), e acima de tudo, se adequar ao projeto e vice-versa.
  3. Não exagere nos padrões de projeto. Pense duas vezes antes de usá-los, se houver uma solução mais simples (e que funcione), use-a. Um problema que necessita de um padrão de projeto como solução, será identificado naturalmente (obviamente depois de um certo tempo de experiência).
  4. Sempre faça backup do código. Quando eu era mais novo, por uma falha no disco rígido, perdi um monte de código, e me senti horrível por causa do que tinha acontecido. A única vez que você não fizer backup dos dados, pode ser o momento onde você tem um prazo restrito com um cliente, e eles precisam do que você estava fazendo para amanhã. Controle de código fonte/versão (CVS, SVN, GIT,...) também se aplica aqui.
  5. Você não é o melhor em programação. Aceite isso. Eu sempre pensei que eu sabia muito sobre programação, mas sempre há alguém lá fora (ou do seu lado), melhor que você. Sempre! Aprenda com eles.
  6. Aprenda a aprender mais. Como número cinco explicou, eu sempre tive à mão uma revista ou livro sobre computadores/programação  (pergunte aos meus amigos, eles vão confirmar). Verdade, há muita tecnologia lá fora, e manter-se com ela é um trabalho em tempo integral. E se você tem uma maneira inteligente de receber novidades, você vai aprender sobre novas tecnologias a cada dia.
  7. Mudanças são constantes. Seu conhecimento de tecnologia e/ou programação deve ser semelhante à forma como você trata investimentos: Diversifique. Não fique muito confortável com uma tecnologia particular. Se não houver suporte suficiente para aquela linguagem ou tecnologia, é bom você pode começar a atualizar o seu currículo imediatamente, e começar o seu período de treinamento. Minha regra geral: Conheça pelo menos duas ou três linguagens, assim, se uma morre, você tem outra para trabalhar enquanto você estuda uma nova para colocar no lugar.
  8. Ajude os novatos. Oriente os desenvolvedores iniciantes sobre as boas técnicas de programação. Você nunca sabe... mas você pode ganhar pontos com isso, e vai se sentir mais confiante de ter, pessoalmente, treinado e preparado uma pessoa para seu próximo trabalho.
  9. Simplifique o algoritmo. Codifique como um demônio, mas quando estiver tudo pronto, volte para otimizá-lo. Uma pequena melhoria no código aqui e ali, e você terá uma manutenção de código mais feliz no longo prazo.
  10. Documente seu código. Se a documentação é uma API de Web Service ou uma simples classe, documente do mesmo jeito. Eu tenho sido acusado de excesso de comentários no meu código, e isso é algo que eu me orgulho. Leva apenas um segundo para adicionar uma linha de comentário adicional para cada 3 linhas de código.
  11. Teste, teste e teste. Eu sou um fã de testes de caixa preta. Quando sua rotina é concluída, o seu período de "selo de aprovação" começa. Se você tem um departamento de Quality Assurance, você pode estar falando mais para eles do que para seu gerente de projeto sobre os erros em seu código. Se você não testar seu código completamente, você pode desenvolver mais que código, e possivelmente uma má reputação.
  12. Celebre todo sucesso. Se um programador feliz te pedir para vir ver sua obra extraordinária de código, mesmo que você já tenha visto um trecho de código como esse mais de 100 vezes em suas experiências, comemore o sucesso desse desenvolvedor.
  13. Faça revisão de código frequentes. Em projetos e pessoalmente. Na empresa, você sempre terá as revisões de código de quão bem você codificou alguma coisa. Não olhar para isso como pessoas crucificando o seu estilo de codificação. Pense nisso como uma crítica construtiva. Quando estiver na revisão, pergunte: "Como eu poderia ter feito melhor?" Isto irá acelerar o seu aprendizado e torná-lo um programador melhor.
  14. Relembre seu código antigo. Existem duas maneiras de olhar para código antigo: "Eu não posso acreditar que eu escrevi este código" e "Eu não posso acreditar que eu escrevi este código." A primeira afirmação é muitas vezes de nojo e perguntando como você pode melhorá-lo. Você ficaria surpreso como um código antigo pode ser ressuscitado em uma rotina possível e melhor, ou até mesmo um produto inteiro. A segunda declaração é de espanto e realização. Desenvolvedores têm suas conquistas de código, aquelas que eles concluíram e todos tomaram conhecimento.
  15. Humor é necessário. Em meus 20 anos de desenvolvimento, eu nunca conheci um programador que não tem um senso de humor decente. Na verdade, nesta indústria, é uma exigência.
  16. Cuidado com o programador sabe-tudo, programador possessivo e o programador inexperiente. O programador sabe-tudo tenta relegar você em vez de trabalhar como um membro da equipe. O programador possessivo cria o código e não quer partilhar com ninguém. E o programador inexperientes pede ajuda constantemente (a cada dez minutos) ao ponto que o código desenvolvido é seu, não dele.
  17. Jamais um projeto será simples. Se alguém precisa de um site de 3 páginas com o Microsoft Access no início, ele acaba se tornando um site de 15 páginas com o SQL Server, um fórum e um CMS personalizado (Content Management System).
  18. Nunca tome nada como garantido. Se você levar em um projeto simples, você pode pensar que uma determinada seção será fácil de concluir. Não pense, mesmo por um momento. Ao menos que você tenha uma classe, componente, ou um pedaço de código já codificados, testado exaustivamente e em produção. A partir de um projeto existente, não pense que será fácil.
  19. Software nunca está acabado. Um colega programador me disse uma vez que o software nunca está acabado, está "temporariamente concluído". Bons conselhos. Se o cliente ainda está usando um programa que você escreveu e tem resistido ao teste do tempo, existem boas chances de você ainda estar atualizando-o, o que não é uma coisa ruim. Mantém seu emprego.
  20. A paciência é definitivamente uma virtude. Quando os clientes, amigos ou membros da família usar um PC, ficam frustrados e partem para bater no computador. Eu continuo dizendo a todos: "você está controlando o computador, não o contrário". Você precisa ter um certo nível de paciência para programar computadores. Tão logo os programadores entendem o que fizeram de errado, eles dizem: "Ah, é por isso que estava acontecendo isso".


Qualquer sugestão, deixem seus comentários.

4br4ç05,
nglauber

sexta-feira, 2 de setembro de 2011

Android: Dicas 4

Olá povo,

Segue mais um POST da série "dicas de Android".

Dica 1 - Obter o espaço disponível no aparelho

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
long ocupedBlocks =
stat.getBlockCount() - availableBlocks;

String s1 = Formatter.formatFileSize(
this, availableBlocks * blockSize);
String s2 = Formatter.formatFileSize(
this, ocupedBlocks * blockSize);
System.out.println("---------------");
System.out.println("s = "+ s1);
System.out.println("s = "+ s2);

Dica 2 - Teclado Virtual Sobre o Layout
Ao exibir o teclado virtual, o Android automaticamente redimensiona a tela do aparelho para exibir todos os elementos. Então se você tiver, por exemplo uma barra com botões na parte inferior, eles irão aparecer imediatamente em cima do teclado virtual. Para evitar isso, basta colocar a seguinte configuração na declaração da sua Activity no AndroidManifest.xml.

<activity
android:name=".ui.MainActivity"
android:windowSoftInputMode="adjustPan"
/>

Dica 3 - Evitando abrir a mesma atividade 2 vezes
Os engenheiros de teste com frequência tentam "destruir" a aplicação de algum jeito :) E um bem comum é clicar rapidamente em um botão. Se esse botão chamar uma Activity serão abertas duas em sequência. Para evitar isso, basta colocar a seguinte configuração na declaração da sua Activity no AndroidManifest.xml.


<activity
android:name=".ui.MainActivity"
android:launchMode="singleTop"
/>

Isso faz com que só seja possível apenas uma instância no topo da pilha de atividades.

Dica 4 - Alterando a linha abaixo da TabWidget
Essa dica é um complemento da dica sobre como mudar a imagem das abas da TabWidget. O código abaixo mostra como mudar a linha que fica na parte inferior da TabWidget. Ela tem um aspecto interessante, pois a API só disponibilizou um método "digno" pra isso a partir do Android 2.2, para as versões anteriores, essa operação tem que ser feita via Reflection.


// Esse código deve ser chamado dentro de
// uma TabActivity
TabWidget tabWidget = getTabWidget();

if (android.os.Build.VERSION.SDK_INT >=
android.os.Build.VERSION_CODES.FROYO){
// For Android 2.2
tabWidget.setLeftStripDrawable(
R.drawable.barra_menu);
tabWidget.setRightStripDrawable(
R.drawable.barra_menu);
} else {
// For Android 2.1 or before
try {
Field stripLeft = tabWidget.getClass().
getDeclaredField("mBottomLeftStrip");
Field stripRight = tabWidget.getClass().
getDeclaredField("mBottomRightStrip");

if (!stripLeft.isAccessible())
stripLeft.setAccessible(true);
if (!stripRight.isAccessible())
stripRight.setAccessible(true);

stripLeft.set(tabWidget,
getResources().getDrawable(
R.drawable.barra_menu));

stripRight.set(tabWidget,
getResources().getDrawable(
R.drawable.barra_menu));

} catch (Exception e) {
e.printStackTrace();
}
}

Nesse exemplo, estou usando a API level 8 (Android 2.2) no Eclipse para poder ter acesso aos métodos setLeftStripDrawable e setRightStripDrawable. Porém ele pode ser executado em aparelhos 2.1, que neste caso executará o código via Reflection. Para dar suporte a API 2.1, mesmo desenvolvendo com a 2.2 basta colocar a tag abaixo no AndroidManifest.xml.

<uses-sdk android:minSdkVersion="7" />

Dica 5 - Salvar estado do scroll da ListView
Na aplicação que estou desenvolvendo, sempre estava reatribuindo o Adapter à ListView no onResume da Activity. O problema era que eu clicava em um item da lista lá do final pra edita-lo era aberta a tela pra edição. Quando fechava essa tela, aí abria a tela de detalhes, mas quando voltava pra tela de listagem queria manter a posição do scroll.


// savedIndex e savedY é um atributo int

// Salvar estado
// Esse código coloquei no onPause
savedIndex = getListView().getFirstVisiblePosition();
View v1 = getListView().getChildAt(0);
savedY = (v1 == null) ? 0 : v1.getTop();

// Restaurando estado
// Esse código eu coloquei no onResume
setListAdapter(novoAdapter);
getListView().setSelectionFromTop(savedIndex, savedY);

Dica 6 - Checar se o GPS está habilitado
Existe basicamente duas formas de obter a posição geográfica no Android: por GPS e pela Rede de Dados. Essa configuração fica no menu Configurações > Local > Meu Local. Se sua aplicação usa geolocalização, você deve checar se uma dessas opções está habilitada.

public boolean isEnabled() {
LocationManager lm = (LocationManager)
context.getSystemService(
Context.LOCATION_SERVICE);

return
locationManager.isProviderEnabled(
LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(
LocationManager.NETWORK_PROVIDER);
}
Dica 7 - Problema no GoogleMaps
Essa dica foi mandada pelo meu aluno da LinuxFI, Sávio (Sávio saviojp@gmail.com).
Durante a aula de Mapas eu passei pelo seguinte problema: Mesmo com todas as configurações da API Key e permissões definidas de modo correto, o meu emulador não carregava o mapa. Para solucionar esse problema fiz o seguinte:

Customizei a execução da aplicação no eclipse por meio do Run Configurations/Android Application /na aba Target no campo Additional Emulator Command Line Options, setei o comando: -dns-server 8.8.8.8.

4br4ç05,
nglauber

segunda-feira, 20 de junho de 2011

Android: Dicas 3

Olá povo,

Meus alunos, mesmo após o fim das aulas, não me deixam em paz. E isso é bom ;) Eles ficam mandando dúvidas e soluções para problemas em que eles se deparam no dia-a-dia do desenvolvimento com Android. Sendo assim, lá vai mais uma leva de dicas de Android.

Dica 1 (dúvida de Felipe Bonezi)

A dúvida era como obter o tamanho da tela. Segue abaixo:
Display display = 
getWindowManager().getDefaultDisplay();

int width = display.getWidth();
int height = display.getHeight();


Dica 2 (dica de Bruno Baudel)

Ocultar o teclado virtual programaticamente.
InputMethodManager imm = (InputMethodManager) 
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);


Dica 3 (dica de Felipe Vasconcelos)

Essa é a mais complicada de todas. Como modificar o background das abas de um TabHost. A primeira coisa que devemos ter são as imagens das abas. Se você não diver, crie no XML mesmo :) segue abaixo os XML para aba selecionada e normal, salve-os na pasta res/drawable com os nomes aba_normal.xml e aba_normal.xml.

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<gradient
android:startColor="#000000"
android:endColor="#CCCCCC"
android:angle="90"
android:type="linear" />
<padding
android:left="10dp"
android:top="10dp" />
<corners
android:topLeftRadius="15dp"
android:topRightRadius="15dp" />
</shape>

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<gradient
android:startColor="#000000"
android:endColor="#00FF00"
android:angle="90"
android:type="linear" />
<padding
android:left="10dp"
android:top="10dp" />
<corners
android:topLeftRadius="15dp"
android:topRightRadius="15dp" />
</shape>

Uma vez definida as imagens, precisamos associa-las ao estado da TabWidget, ou seja, quando a aba estiver selecionada, use a segunda imagem, caso contrário use a primeira. Crie o arquivo aba_selector também na pasta res/drawable.
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
android:drawable="@drawable/aba_selecionada" />
<item
android:state_selected="false"
android:drawable="@drawable/aba_normal" />
</selector>

Depois é só setar o background de cada aba do TabWidget.
TabWidget tabWidget = getTabWidget();
for (int i = 0; i < tabWidget.getChildCount(); i++) {
View v = tabWidget.getChildAt(i);
v.setBackgroundDrawable(
getResources().getDrawable(R.drawable.aba_selector));
}



Dica 4 (dica de Ricardo Gilson)

Sem mais aguentar a linha "TODO" que é adicionada toda vez que criamos algum tipo de bloco ou método no Eclipse, Ricardo foi em busca de como retirá-lo. A solução é ir até o menu Window > Preferences... No lado esquerdo, selecione Java > Code style > Code templates. Ao percorrer a lista é possível observar que o TODO está configurado para várias chamadas:
Method body, Construtor body, Catch....

O jeito é remover a linha do TODO de cada um deles...
// ${todo} Auto-generated catch block.


É isso pessoal, vão mandando suas dicas que eu coloco aqui! :)
Obrigado a todos que contribuíram.

4br4ç05,
nglauber

segunda-feira, 11 de abril de 2011

Android: Dicas 2

Olá povo,

Estar à frente de uma sala de aula me propicia o benefício da "ensinagem" (ensino + apredizagem) onde ao mesmo tempo em que ensino, aprendo bastante com meu alunos. Esse post foi totalmente formado por dúvidas dos meu alunos do TECDAM, e que foram resolvidos por eles próprios. Bom para todos, que aprendemos juntos.

Dica 1 (crédito para Gustavo - olha ele aí - Coutinho)
O Android tem um sistema de i18n (internacionalização) muito bacana, onde basta prover recursos através de notações pré-definidas pelo próprio Android em pastas do projeto. Inclusive falei disso nesse post. Os recursos são selecionados automaticamente de acordo com configurações do aparelho. Mas, e se eu quiser determinar o idioma da aplicação? Segue abaixo o código que força um idioma para nossa aplicação.


String languageToLoad = "es"; // espanhol
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
Resources res = getBaseContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
setContentView(R.layout.main);


Dica 2 (crédito para Rogério Casal, aluno do Unibratec)
Nesse post, mostrei como limitar os caracteres utilizando expressões regulares. Porém, podemos fazer a mesma coisa utilizando a propriedade digits do componente EditText, basta colocar os caracteres que você quer permitir.

Dica 3 (crédito para Augusta "Nariquinha")
É comum colocarmos os identificadores dos componentes adicionados nos arquivos de layout utilizando @+id/idDoComponente. Entretanto, quando ficamos com muitas telas ou quando começamos a importar layouts pode haver uma confusão ou até um conflito com esses identificadores. Uma abordagem legal, seria substituir o "id" por algo mais inteligível como "cadpessoa". Por exemplo a definição do EditText abaixo seria perfeitamente válida:
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+cadpessoa/edtNome"/>

E no código Java, poderíamos acessar esse id usando:
EditText edt = 
(EditText)findViewById(R.cadpessoa.edtNome);


Dica 4 (crédito para Leonardo Santos)
Essa eu não arrumei uma justificativa plausível. Quando fui executar um arquivo MP3 no emulador o código abaixo funcionou perfeitamente.
MediaPlayer player = new MediaPlayer();
player.setDataSource("file:///mnt/sdcard/musica.mp3");
player.prepare();
player.start();

Porém, quando coloquei no telefone não funcionou. O erro "Playing Audio - error: PVMFErrNotSupported (Prepare failed.: status=0x1)" era exibido. Após uma busca rápida no Google, a solução foi simples. Ao invés de passar a String diretamente, é passado um objeto FileDescriptor obtido através de um FileInputStream como abaixo.
MediaPlayer player = new MediaPlayer();
FileInputStream fis =
new FileInputStream("/sdcard/musica.mp3");
player.setDataSource(fis.getFD());
player.prepare();
player.start();

Como disse acima, não sei o porquê do erro.

Dica 5 (crédito para Pedro CC)
Para gerar a chave para utilizar a API do Google Maps no Android é preciso usar a ferramenta keytool que vem no JDK (Java Development Kit). Porém, um problema que acontecia constantemente quando ia gerar essa chave era a mensagem "erro de keytool: java.lang.IllegalArgumentException: unknown format type at". Ou seja, erro sem explicação... Esse problema ocorre aparentemente por conta das configurações regionais. Quando elas estão em português, esse erro acontece, em inglês não.
No Windows, vá até o Painel de Controle, e em Configurações Regionais altere o formato das informações para inglês. No Mac vá até System Preferences, em seguida selecione Language e Text, na aba Formats selecione Inglês. [Editado com o comment de Eric Braga] No Linux, basta setar a variável de ambiente LC_ALL usando (export LC_ALL="en_US").

Dica 6 (crédito para Ricardo Gilson)
Se quiser fazer com que cada atributo de cada tag de um arquivo XML fique em uma linha separada no Eclipse, acesse o menu
Windows>Preferences>XML>XML Files>Editor e marque a opção "Split multiple attributes each on a new line". Depois é só abrir seus arquivos de Layout e pressionar Ctrl+Shift+F para que o arquivo fique bem mais agradável.

Agradeço a todos pelas dicas e se dei os créditos errado ou faltou alguém é só avisar :)

4br4ç05,
nglauber