segunda-feira, 11 de janeiro de 2010

Android: Passando objetos em Intents

Olá povo,

Algumas pessoas me perguntaram como passar objetos entre telas no Android ao invés de passar apenas primitivos. Um exemplo típico é uma tela que lista algum tipo de informação e quando algum item dessa lista é selecionado, o objeto da classe referente aquela informação deveria ser passado para uma tela de detalhes do mesmo.

Para resolver isso, eu passava para a tela de detalhamento apenas um identificador do objeto (um código, por exemplo) e lá eu fazia uma consulta ao controlador que me retornava o objeto desejado.

Essa é uma abordagem boa, e até aconselho. Mas quem quiser mesmo passar obejtos entre telas podemos utilizar a interface android.os.Parcelable. A classe que implementar essa interface pode ser adicionada a uma Intent.

Vamos fazer um pequeno exemplo aqui criando uma classe Cliente com dois atributos (código e nome) e ela implementará a interface Parcelable.
import android.os.Parcel;
import android.os.Parcelable;

public class Cliente implements Parcelable {
 private int codigo;
 private String nome;

 public Cliente(int codigo, String nome) {
   this.codigo = codigo;
   this.nome = nome;
 }

 private Cliente(Parcel p){
   codigo = from.readInt();
   nome = from.readString();
 }

 public static final Parcelable.Creator<Cliente>
   CREATOR = new Parcelable.Creator<Cliente>() {

   public Cliente createFromParcel(Parcel in) {
     return new Cliente(in);
   }

   public Cliente[] newArray(int size) {
     return new Cliente[size];
   }
 };

 public int getCodigo() {
   return codigo;
 }

 public void setCodigo(int codigo) {
   this.codigo = codigo;
 }

 public String getNome() {
   return nome;
 }

 public void setNome(String nome) {
   this.nome = nome;
 }

 @Override
 public int describeContents() {
   return 0;
 }

 @Override
 public void writeToParcel(Parcel dest, int flags) {
   dest.writeInt(codigo);
   dest.writeString(nome); 
 }
}
Vejam que a classe Cliente implementa a interface Parcelable que tem dois métodos que devem ser implementados: writeToParcel e describeContents. O primeiro método serve para serializar as informações da classe, já o segundo é um inteiro qualquer que identifica a classe :)

A segunda coisa importante a destacar é o atributo estático CREATOR que é do tipo Parcelable.Creator. Segundo a própria documentação, todas as classes que desejem implementar Parcelable devem ter essa variável. É ela que cria os objetos a partir de um Parcel, classe que a grosso modo, junta as funcionalidades de um DataInputStream e DataOutputStream para serializar e deserializar objetos. Veja que ela chama o construtor privado de Cliente que recebe um Parcel que nos permite ler dados dele e passando para os atributos.
Agora vamos ver como passar nosso objeto via Intent:
Cliente cliente = new Cliente(1, "Glauber");

Intent it = new Intent(this, Teste2Activity.class);
   
it.putExtra("cliente", cliente);
   
startActivity(it);
E para ler o conteúdo é tão simples quando enviar:
Cliente c = 
  getIntent().getExtras().getParcelable("cliente");

EDITADO em 08/08/2012:
Achei uma maneira muuuito mais simples (porém mais lenta em tempo de execução) de fazer a passagem de objetos entre Activities. Basta fazer com que eles implementem a interface java.io.Serializable.
public class Pessoa implements Serializable {
  // Seus atributos, gets e sets ...
}
Dessa forma você pode passar os objetos da classe Pessoa para outras activities via Intent normalmente, inclusive adicionando-os a listas (a classe ArrayList é serializada).
 
ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
pessoas.add(new Pessoa(1, "Glauber"));
pessoas.add(new Pessoa(2, "Nelson"));
        
Intent it = new Intent(this, Tela2Activity.class);
// passando a lista
it.putExtra("pessoas", pessoas); 
// passando um objeto
it.putExtra("pessoa", pessoas.get(0)); 
startActivity(it);


E pra recuperar:
Pessoa pessoa = 
  (Pessoa) getIntent().getSerializableExtra("pessoa");

ArrayList<Pessoa> pessoas = (ArrayList<Pessoa>) 
  getIntent().getSerializableExtra("pessoas");
  
System.out.println("Pessoa: "+ pessoa.getNome());
System.out.println(
  "Pessoas: "+ pessoas.get(0).getNome());

4br4ç05,
nglauber

sábado, 2 de janeiro de 2010

Mac OS X Leopard no PC

Olá povo,

Desde 2005 quando Apple começou a utilizar a plataforma Intel em seus computadores o projeto OSX86 criou o Hackintosh, que consiste na alteração do sistema operacional da Apple para executar em PCs comuns. Isso se deve ao fato de que o hardware, diferentemente do que era no passado é bem similar ao do PC convencional.

Hoje, o que impede que um PC execute o Mac OS X vendido pela Apple é o fato de o sistema operacional ser homologado para um hardware específico, ou seja, ele não tem os drivers do hardware de vários modelos/fabricantes que são utilizados em um PC comum. Já o Hackintosh disponibiliza os drivers e o kernel que permitem essa execução em um PC comum. Assim como o Linux, o Hackintosh também tem distribuições, as mais conhecidas são a iATKOS, iDeneb, Kalyway e Leo4All.

Nesse post, vou mostrar como eu instalei o hackintosh no meu notebook, e falar dos problemas que tive e tenho. Quero deixar claro aos que quiserem se aventurar que você deve conhecer bem a marca e o modelo de cada componente do seu hardware e que o uma distribuição pode ser melhor para um tipo de hardware do que para outro.

Legalidade

Segundo o site Olhar Digital a utilização do Hackintosh não é ilegal. Desde que você tenha comprado uma versão do Mac OS X Original que custa R$79,00.
No entanto quero reiterar que a instalação que fiz foi apenas para fins educacionais e que não me resposabilizo por nada que der errado no seu PC :)

O computador


Requisitos

O primeiro e mais importante deles: PACIÊNCIA. Eu tive que tentar várias vezes até conseguir uma instalação bem sucedida. Então, vá com calma gafanhoto :)

É aconselhável estar com outro computador por perto para tirar as dúvidas e resolver os problemas que você venha a ter.

Utilizei a versão iATKOS 7. Infelizmente não tenho o link, mas baixei via torrent aproximadamente 3.6GB

Após baixar a imagem, grave-a no em um DVD (eu utilizei o Nero) em uma velocidade baixa (2 ou 4x) para evitar problemas de leitura.

O processo

Coloque o DVD no driver.

Configure na BIOS do seu computador para dar o boot pelo driver de DVD.

Quando o computador iniciar, ele pedirá pra pressionar qualquer tecla para iniciar o DVD ou pressionar F8 para mais detalhes. Eu aconselho pressionar F8 e digitar -v e pressionar ENTER isso fará com que o DVD inicie no modo de debug. Assim, caso algum erro ocorra... pesquise na internet como resolver :)

Se tudo correr bem, a interface gráfica será carregada com uma tela cinza com a logo da Apple. Essa tela demora em torno de 3 minutos para desaparecer, depois dela aparecerá uma tela pedindo para clicar no botão pra continuar.

Quando carregar a tela de boas vindas, você precisará criar a partição onde ficará o sistema operacional. Para isso, vá até o menu Utilities | Disc Utilities, lá selecione o seu HD e crie uma partiação Mac OS Extended. Depois de criar a partição, feche o utilitário.

Clique em Continue, abrirá um tela de licença, clique em Agree. Agora o instalador perguntará onde você deseja instalar o OSX, selecione a partição que criamos no passo anterior e clique em continuar.

A tela Install Summary é o passo mais importante. Clique em Customize, nessa tela selecionaremos o que será instalado. Lembrando que isso pode variar de máquina pra máqunia. Abaixo listo o que EU, selecionei (não desmarquei nenhuma opção padrão):
- Bootloader > Chamaleon v2
- X86 Patches > Kernel > 9.7.0 Kernel Vodoo
- Drivers > System > SATA/IDE > VIA SATA/IDE
- Languages > Português > Português
Clique em Done. Voltará para a tela de Install Summary. Clique em Install.

O processo de instalação inciará e demorará cerca de 45 minutos. Quando a barra de progresso chegar ao fim, será exibida uma tela de sucesso e solicitará que o computador seja reinicializado. Quando o computador reiniciar, retire rapidamente o DVD do driver para evitar o boot pelo DVD novamente.

Se tudo correr bem, aparecerá a tela do Chamaleon e o boot do Mac OS iniciará automaticamente. Isso demorará cerca de 2 minutos.

Quando a interface gráfica inciar, para concluir a instalação serão feitas algumas configurações como: localização regional, teclado, se você deseja enviar informações sobre seu Mac (não faça isso :) , seu tipo de conexão com a internet (configure isso depois), informações pessoais (nome, sobrenome, etc), onde você utiliza o Mac, criará a conta (usuário e senha) para acessar o computador, timezone, e por último data e hora.

Se você chegou até aqui, a instalação foi concluída com sucesso e você é um sortudo :)

Abaixo o screenshot do meu Mac :)





Abaixo mais algumas informações...

Problemas Resolvidos

Windows XP e o OS X no mesmo HD em partições diferentes (óbvio): consegui colocando a partição do OS X como a primeira do disco, de outra forma a instalação dava problema ao reiniciar o computador após a instalação.

Dual Boot com o Windows XP: foi simples, bastou instalar o Windows XP em outra partição, depois de ter instalado o Mac OS. Com isso o bootloader do Windows sobrepos o Chamaleon (gerenciador de boot utilizado no OSX86). Depois foi só seguir esse tutorial.

Drivers ausentes: Wireless e Bateria. Não consegui utilizar o driver disponibilizado no site da Realtek. Ao invés disso, baixei um torrent de um CD-PACK com vários drivers, entre eles o driver da minha placa, que funcionou perfeitamente.

A placa de vídeo: a que o OS X detectou suporta apenas a resolução 1024x768. No entanto, seguindo esses links (link1 e link2), dá pra modificar.

Telado ABNT: o teclado do note é o padrão brasileiro, daí eu baixei o Brasileiro.bundle na internet (não lembro de onde) e funcionou. Entretanto a interrogação, que no meu teclado fica entre o Alt e o Ctrl da direita, não funcionou. Daí eu baixei o Spark e criei um atalho para a interrogação.

Problema NÃO Resolvido

Não tive tempo de procurar o driver da placa de rede Wired. É uma SiS, mas não lembro o modelo ao certo.

Programas legais

Para que a mudança pro mundo Mac não seja tão dolorosa, instalei no OSX alguns programas que utilizo com frequência no Windows:

- Eclipse Galileo
- Real VNC
- Microsoft Office
- MSN Messenger
- Android SDK

E por último...

Espero que tenham gostado e que esse post seja últil pra alguém. E se alguém resolver algum dos problemas que citei acima ou tiver alguma sugestão de melhoria mail-me.

4br4ç05,
nglauber