Mostrando postagens com marcador Dominando o Android. Mostrar todas as postagens
Mostrando postagens com marcador Dominando o Android. Mostrar todas as postagens

sexta-feira, 12 de fevereiro de 2016

Dominando o Android 2 edição: correções e melhorias

Olá povo,

Quem me vê no dia a dia, sabe que eu ando com um exemplar do meu livro o tempo todo. Além de utiliza-lo como forma de consulta, eu saio anotando nele:
  • as novidades em APIs que saíram após o lançamento do livro; 
  • novos tópicos para colocar em versões futuras; 
  • e obviamente erros que os leitores vão reportando. 
Na primeira edição, o exemplar que eu andava foi muito útil para melhorar a segunda edição, mas quase que eu perco o livro quando ele caiu em uma poça d'água! o.O
Por isso resolvi compartilhar com vocês minhas anotações, assim vocês já vão sabendo o que está errado, o que já mudou em termos de API, e o que pode mudar para a próxima ;) A medida que for achando mais problemas, vou atualizando esse post.
Ah! Antes que vocês perguntem, não tem nenhuma previsão para a próxima edição. Mas provavelmente o que vai acontecer é eu começar a trabalhar no livro após o Google I/O desse ano que vai acontecer entre 18 e 20 de maio.
Segue abaixo o que eu anotei até agora. Eu dividi em duas categorias: melhorias e erros.

Melhorias

Capítulo 0 / Pág. 29 - essa seção deve receber uma atualização com as novidades do emulador 2.0.
http://tools.android.com/tech-docs/emulator

Capítulo 3 - vou adicionar mais uma seção nesse capítulo falando dos layouts percentuais PercentFrameLayout e PercentRelativeLayout que eu falei nesse post aqui.

Capítulo 4 / Pág. 132 - esqueci de falar de uma propriedade bacana do TextInpuLayout que mostra a quantidade de caracteres digitados.
http://developer.android.com/reference/android/support/design/widget/TextInputLayout.html#setCounterEnabled(boolean)
<android.support.design.widget.TextInputLayout
    ...
    app:counterEnabled="true">
    <EditText
        ...
        android:maxLength="100"/>

Capítulo 4 / Pág. 163 - esqueci de mencionar que o método performFiltering() é executado em uma thread separada, enquanto que o método publishResults() é executado na UI thread.

Capítulo 6 / Pág. 254 - deveria ter criado um estilo para a Toolbar.

Capítulo 7 / Pág. 297 - era para ter enfatizado que, se uma classe implementar OnPreferenceChangeListener, caso uma SharedPreference seja modificada em qualquer ponto da aplicação, essa classe será notificada (obviamente se ela estiver instanciada).

Capítulo 7 / Pág. 310 - o trecho do método onClick() deveria estar em negrito.

Capítulo 7 / Pág. 325 - deveria estar realizando as operação com o ContentProvider utilizando a classe AsyncQueryHandler como falei nesse post aqui.

Capítulo 10 / Pág. 388 - substituir a enum Status por annotations como falei nesse post.

Capítulo 14 / Pág. 473 - no método onMessageReceived(), checar se from.equals(senderId) e se !data.isEmpty().

Capítulo 15 / Pág. 519 - o método getMap() tornou-se obsoleto (deprecated), em seu lugar, deve-se usar o método getMapAsync().
https://developers.google.com/android/reference/com/google/android/gms/maps/SupportMapFragment.html#getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)

Capítulo 15 / Pág. 551 - podemos enviar localização fictícia com o emulador 2.0 do Android ou com o Genymotion.

Capítulo 20 - Falar sobre TransitionManager. Depois de ver essa palestra do Lúcio Maciel, me arrependi de não ter colocado esse assunto nesse capítulo.
https://www.youtube.com/watch?v=GKjPf0NI9ps

Capítulo 23 - Muitos fundamentos interessantes que são mostrados no treinamento de Gradle do Udacity seriam interessantes de colocar no livro. Principalmente linha de comando.
https://www.udacity.com/course/gradle-for-android-and-java--ud867

Capítulo 26 / Pág. 843 - Colocar alguns detalhes interessantes no uso da RecyclerView que eu coloquei nesse post.

Capítulo 26 / Pág. 891 - A biblioteca Otto foi recentemente marcada como deprecated em favor do RxJava e RxAndroid. Mas não se preocupem, o Otto continua funcionando. Uma outra opção seria usar o EventBus.

Capítulo 27 - Colocar um exemplo de DataBinding com listas.
http://developer.android.com/intl/pt-br/tools/data-binding/guide.html


Erros

Capítulo 1 / Pág. 39 e 49 - Quando falo das pasta res/mipmap eu menciono quatro pastas, quando na verdade são 5.

Capítulo 2 / Página 81 - Ao girar a activity sem selecionar um estado, o texto do botão fica em branco. Para contornar isso, basta colocar o código a seguir no onCreate.

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    if (savedInstanceState != null) {
        estado = savedInstanceState.getString(STATE_ESTADO);
        if (estado != null) botaoEstado.setText(estado);
    }
}

Capítulo 3 / Pág. 110 - a biblioteca de compatibilidade do GridLayout é melhor do que a versão nativa, pois ela teve vários bugs corrigidos.
http://developer.android.com/tools/support-library/features.html#v7-gridlayout
Basta adicionar a dependência no build.gradle.
compile 'com.android.support:gridlayout-v7:+'
E no layout modificar para
<android.support.v7.widget.GridLayout ...

Capítulo 5 / Pág. 170 - a figura 5.6 está errada... ela deveria estar mostrando as marcações na ferramenta draw9patch. Ao invés disso está mostrando o GIMP :P

Capítulo 6 / Pág. 212 - No último parágrafo, a primeira frase deve ser "... o parâmetro savedInstanceState é igual a nulo, ..."

Capítulo 6 / Pág. 255 - o exemplo está com problema na Toolbar quando rodamos a aplicação no KitKat. A correção do bug já está no GitHub nesse commit aqui. E eu fiz até um vídeo explicando a solução :)

Capítulo 10 / Pág. 385 - na definição da tabela Hotel, o campo "estrelas" deve usar o tipo DECIMAL(2,1). Essa modificação já está no GitHub.
https://github.com/nglauber/dominando_android2/blob/master/server/hotel_service/webservice.php

Capítulo 14 / Pág. 511 - no último parágrafo, falei que após o realizar o login com a conta do Google, uma boa opção seria utilizar o ID da conta e enviar para o seu serviço web. Mas a solução recomendada pelo Google é o uso do Token.
http://android-developers.blogspot.com.br/2016/01/using-google-sign-in-with-your-server.html

Capítulo 24 / Pág. 764 - a figura 24.8 ficou "estranha".

Capítulo 25 / Pág. 839 - esse foi o pior erro do livro. Ficou faltando praticamente uma página.
Notei que um trecho grande do capítulo 26 (1ª impressão) acabou ficando de fora do livro. Creio que foi no momento da diagramação do livro na editora. Na página 839, no segundo parágrafo, após o texto "... que estamos executando." deveria vir o texto abaixo:

Biblioteca 1: ButterKnife
O ButterKnife (http://jakewharton.github.io/butterknife/) é um biblioteca desenvolvida por Jake Wharton (Google Developer Expert de Android) que facilita a atribuição de views à classes sem precisar utilizar o método findViewById(int).
Vejamos o exemplo a seguir:
public class MainActivity extends Activity {
  @Bind(R.id.txtTitulo) TextView mTxtTitulo;
  @Bind(R.id.edtNome) EditText mEdtNome;
  @Bind(R.id.listview) ListView mListPessoas;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    // Pronto! Pode usar os atributos!
  }
}
Perceba que anotamos os atributos da classe que representam componentes no arquivo de layout com a anotação @Bind(int) passando o id do componente. No método onCreate(Bundle) inicializamos esses atributos simplemente invocando ButterKnife.bind(this). O ButterKnife também funciona em Fragments e Adapters como veremos mais adiante. Essa biblioteca ainda possui outros recursos interessantes como definir evento de clique em botões.
@OnClick(R.id.botao1)
public void onClickBotao1(View view) {
}

@OnClick(R.id.botao2)
public void onClickBotao2() {
}
Perceba que no evento de clique do segundo botão, não colocamos o parâmetro, pois para a biblioteca ele é opcional. Vamos utilizar o ButterKnife em nosso aplicativo. Para isso, adicione a dependência no build.gradle.
dependencies {
    …
    compile 'com.jakewharton:butterknife:7.0.1'
}

Biblioteca 2: OkHttp
No capítulo 8 vimos como acessar um servidor web utilizando a classe HttpUrlConnection. Ela funciona muito bem, o único incoveniente é quando precisamos ler o retorno do servidor,

x.x.x.x.x.x.x.x.x.x.x

Peço desculpas pelo inconveniente, mas pelos menos agora vocês vão entender porque o texto está maluco :)
------------------

Quero deixar meu muito obrigado a todos os leitores que reportam os erros encontrados no livro. E se você adquiriu ou livro, não se esqueça de se cadastrar no grupo de discussão da segunda edição do "Dominando o Android".

4br4ç05,
nglauber

quinta-feira, 5 de março de 2015

Dominando o Android: Atualização 3

Olá povo,

Seguem mais algumas sugestões de melhorias enviadas pelos leitores do livro.

Capítulo 2
Página 61. Ao clicar no botão de aplicativos recentes, os métodos onPause e onStop são chamados. E não apenas o onPause como falei no texto! A documentação é bem clara sobre isso... Burrice minha :(

Capítulo 4
Página 116. Ficaria mais claro se eu tivesse colocado "os parâmetros before e after dizem o tamanho anterior e atual da String digitada". Pois quando o usuário digita um caractere, a variável after possui o valor 1, e quando ele apaga o valor é 0. Entretanto, se ele copiar um texto qualquer (de 12 caracteres, por exemplo) de um outro lugar do sistema e tentar colar nessa caixa de texto, after terá o valor 12. O mesmo acontece se ele selecionar 5 caracteres da caixa de texto (dando um clique longo e marcando o texto) e recortar, então o valor da variável before será 5.

Capítulo 5
Página 164. Na parte que diz: "Crie o arquivo meu.html dentro da pasta app/src/assets do projeto". O local correto é  app/src/main/assets.

Página 182. Na parte que diz: "Primeiro obtivemos as propriedades personalizadas (...) passando como parâmetro o R.styleable.JogoDaVelha, que definimos no strings.xml.", o correto é o arquivo styles.xml.

Capítulo 6
Página 226. O namespace do XML do arquivo de menu é xmlns:app="http://schemas.android.com/apk/res-auto" ao invés de
xmlns:app="http://schemas.android.com/apk/res/android".

Na mesma página, no primeiro parágrafo, ao invés de startActionMode, lê-se startSupportActionMode.

Página 232. A propriedade android:orientation é desnecessária no FrameLayout.

Página 241. Faltou o import da classe android.support.v7.widget.Toolbar. Cuidado para não usar android.widget.Toolbar.

Muito obrigado mais uma vez ao pessoal que está reportando os erros!  Vocês não sabem o quanto estão me ajudando.
A medida que forem encontradas mais erratas, vou colocando aqui.

4br4ç05,
nglauber

sexta-feira, 30 de janeiro de 2015

Dominando o Android: Atualização 2

Olá povo,

Em atenção as pessoas que compraram meu livro, estou reportando os erros que o pessoal está encontrando. Sendo assim, segue abaixo mais algumas atualizações sobre o livro. Quem quiser acompanhar e reportar erratas pode participar do grupo de discussão sobre o livro.

Capítulo 1

Página 43. A pasta values-v11-mcc724-mnc31 informada não funcionaria pois teria que ser respeitada a ordem de avaliação dos recursos. O nome correto seria values-mcc724-mnc31-v11.
Obrigado Douglas Drumond!

Página 46. A propriedade densityDpi da classe Configuration só está disponível na API Level 17 (Android 4.2). E as propriedades screenHeightDp e screenWidthDp na API Level 13 (Android 3.2). Uma alternativa para obter esses valores é utilizar a classe DisplayMetrics.
Obrigado Tatiani Lima!

Capítulo 4

Página 113: No lugar de setEditorActionListener(OnEditorActionListener), usar setOnEditorActionListener(OnEditorActionListener).
Valeu Jorge Felipe (por essa e outras).

Página 134. Na seção "Cabeçalho e Rodapé", no lugar de setListAdapter(Adapter) lê-se listView.setAdapter(Adapter).

Página 136: Na seção "EmptyView", quando fui fazer esse exemplo, ele era inicialmente com uma ListActivity.
public class MainActivity extends ListActivity {
  ...
  public void onCreate(Bundle savedInstanceState){
    setContentView(R.layout.activity_main);
    listView = getListView();
    ...
  }
  ...
}
Com isso, o exemplo funciona corretamente, porque internamente a classe ListActivity define a propriedade emptyView da ListView. Entretanto, no Lollipop, por padrão, a  ListActivity não exibe a ActionBar (barra de título da parte superior), então resolvi herdar de ActionBarActivity. E com isso, esqueci de adicionar a seguinte linha:
listView.setEmptyView(findViewById(android.R.id.empty));

Essa correção já está disponível no GitHub.
Obrigado Vitor Albuquerque!

Capítulo 5

Página 155: No segundo parágrafo, no lugar de android:text, seria android:textColor.

Página 159: Remover propriedade android:background dos botões, uma vez que ela foi definida no arquivos values/styles.xml.

Capítulo 6

Página 195: No único parágrafo, no lugar de equipe, seria hotel.

Geral

Em vários exemplos estou utilizando o valor fill_parent ao invés do match_parent. Entretanto o segundo é o recomendado desde a API Level 8 (Android 2.2). Mas se você observar, o valor das constantes internamente é o mesmo. Então na prática, não faz diferença nenhuma, ele só foi renomeado. Mas, por precaução, utilize match_parent.

--

Bem pessoal! Por enquanto é isso. Desculpem o transtorno, mas é que não houve revisão técnica pois encareceria o livro. Essa incubência ficou para vocês e eu agradeço bastante essa colaboração.

À medida que forem achando alguma coisa, por gentileza reportem no grupo. Vai ajudar a mim e a outros leitores.

4br4ç05,
nglauber

quarta-feira, 21 de janeiro de 2015

Dominando o Android com 20% de desconto!!!

Olá povo,

O meu livro "Dominando o Android" estava até ontem (20/01/2015) com desconto de 25% no site da Novatec. Mas se você perdeu essa oportunidade, não se preocupe!

Adquira o livro com desconto de 20% utilizando o código "GLAUBER"!

Vê se não perde essa chance hein!

4br4ç05,
nglauber

terça-feira, 13 de janeiro de 2015

Dominando o Android - Atualização 1 - Capítulo 14

Olá pessoal,

Acho que com o livro as atualizações aqui do blog ficarão mais frequentes. Pelo menos é o que eu espero. Vou fazer o possível para colocar as correções/atualizações aqui através de mini-posts falando rapidamente sobre a mudança e o por quê.

Para quem não sabe, o código-fonte dos exemplos do livro estão disponíveis no meu gitHub (https://github.com/nglauber/dominando_android). E lá vocês vão ver dois branchs master e master_updates. O código que estiver com algum bug, eu vou corrigir e colocar no branch master e o que for atualização ficará no branch master_updates.
Também criei um grupo de discussão (http://groups.google.com.br/d/forum/livro-dominando-o-android) que todos podem se inscrever.

Recebi hoje uma avaliação do livro que informava que o mesmo "tinha uma falha grave" e "estava desatualizado" porque eu não estou utilizando API do Google Play Services 6.5. E que uma classe (a LocationClient) que eu usava no exemplo não existia.

Não sei se todos sabem, mas o processo de finalização de um livro requer algumas etapas que demandam tempo: revisão ortográfica, diagramação, checar figuras, referências, tempo de impressão na gráfica, etc.  A versão 6.5 do Google Play Services foi anunciada no dia 17/11/2014, mas só foi disponibilizada para os desenvolvedores dia 08/12/2014. Época que o livro já estava com a editora em processo de finalização e impressão. Sendo assim, não pude atualizar o capítulo 14 (Mapas e Localização) a tempo. Sendo assim, peço desculpas pelo meu livro ter ficado desatualizado, por conta de alguns dias... :(
Mas quero reiterar que o código apresentado no livro funciona perfeitamente do jeito que ele se encontra.

--

Pedido de desculpas feito, vamos ao que mudou! As alterações feitas em relação ao exemplo do livro estão nesse commit aqui no branch master_updates, uma vez que é uma atualização da nova API e não uma correção de um erro do livro.

Conforme o comentário do leitor, a classe com.google.android.gms.location.LocationClient não existe mais. Mas seus métodos foram distribuídos em outras classes.
  • Na classe GeofenceReceiver, os eventos de Geofence podem ser tratados com a classe GeofencingEvent.
  • Na classe MainActivity, muito do que era feito com a LocationClient passou a ser responsabilidade da GoogleApiClient, inclusive os eventos de conexão (ConnectionCallbacks e OnConnectionFailedListener).
  • Ainda na MainActivity para obter a localização atual passamos a utilizar a classe LocationServices.FusedLocationApi. Bem como para requisitar atualizações sobre mudança na localização.
  • E finalmente, para adicionar um Geofence, usamos a classe LocationServices.GeofencingApi.
Isso é um resumo pessoal. Quem quiser mais informações sobre essa nova API, recomendo esses links:



Qualquer dúvida, sugestão ou crítica serão muito bem-vindas.

4br4ç05,
nglauber

sexta-feira, 9 de janeiro de 2015

Entrevista para o blog da Novatec

Oi povo,

Segue abaixo a entrevista que dei para o blog da novatec.

Nelson contou um pouco de sua história profissional e o trabalho com tecnologias móveis. Confira a entrevista e conheça um pouco mais sobre o autor:
Como foi seu início na computação?
Comecei em 2000 fazendo cursos isolados de Delphi e ASP. Em seguida, fiz alguns sistemas comerciais para algumas empresas em Caruaru onde nasci. Em 2002, me mudei para Recife para fazer o curso técnico de desenvolvimento de software no Ibratec (atual Unibratec) e felizmente uma semana após me mudar, consegui um emprego na área. Inicialmente trabalhei com ASP alguns meses, depois 3 anos com Delphi. Em 2006 entrei no CESAR para trabalhar com jogos para celulares Java ME, e em 2009 iniciei os estudos com Android por causa do projeto em que estava trabalhando. Desde então, estou ligado a tecnologias móveis, inclusive meu mestrado foi dedicado a esse tema.
Por que decidiu escrever sobre o Android?
Quando iniciei meus estudos sobre Android em 2009, tive dificuldade em achar material disponível na Internet, pois o Android ainda estava começando. Então decidi compartilhar com outros desenvolvedores o que estava aprendendo escrevendo posts para o meu blog e publicando artigos para revistas especializadas. Outro fator motivador foram aulas de Android que ministro nos cursos de graduação e pós-graduação. Muitos alunos me fazem questionamentos durante as aulas e que na maioria das vezes está disponível no blog ou em algum artigo que eu tinha escrito. Então resolvi juntar esses conteúdos, atualizá-los e transformá-los em um livro. E com isso, ajudar aos meus alunos e quem quer aprender Android de uma maneira geral.
Autor Nelson Glauber
Que benefícios e responsabilidades o título de primeiro Developer Expert de Android da América Latina te trouxe? Como isso afetou sua vida profissional?
Para mim, o maior benefício é o reconhecimento do trabalho por parte do próprio Google. Esse programa além de reconhecer o profissional pelo seu conhecimento, valoriza o trabalho de divulgação da plataforma na qual ele foi nomeado. Mas graças a esse título, tive o prazer de participar do Google I/O (conferência mundial dos desenvolvedores Google) em San Francisco e conhecer HQ da Google em Mountain View.
Outra coisa fantástica é a quantidade de desenvolvedores que conheci durante os eventos que participei. Pessoas de toda parte do Brasil e do mundo envolvidas com tecnologias Google e que trabalham no próprio Google. Inclusive o prefácio do livro foi escrito por dois Googlers daqui do Brasil.
A responsabilidade é basicamente continuar o trabalho com o Android, ministrando aulas, palestras, escrevendo artigos, compartilhando código, etc. O problema é que um GDE precisa ter muito mais cuidado com o que ele diz ou escreve, pois passa a ter um peso bem maior.
Nelson Glauber
Qual o principal conselho que você dá para quem quer entrar no mercado de desenvolvimento mobile?
Desenvolver aplicações para dispositivos móveis é muito divertido, mas sem sombra de dúvida, desafiador. Então a primeira coisa é gostar da área, depois é se dedicar aos estudos. Caso não possua experiência em programação ainda, deve primeiro consolidar os conceitos básicos de computação e programação, para depois dedicar-se à programação mobile. E posso garantir que o resultado de tanto esforço é bem gratificante, pois ver o fruto do seu trabalho na palma da sua mão e sendo utilizado por pessoas do mundo todo é muito bacana.
Acredita que é uma área que ainda tem muito a crescer?
Sem dúvida! A venda de smartphones cresce ano após ano e cada vez mais queremos mais serviços nos nossos telefones. Consequentemente a demanda por pessoas especializadas no assunto aumenta. E é importante ressaltar que mobile não se restringe mais a smartphones e tablets, agora temos os dispositivos vestíveis como os relógios inteligentes com Android Wear que abordo em dois capítulos do livro.
Autor Nelson Glauber - Dominando o Android
Pretende escrever outros livros?
A princípio não tenho nada em mente, pois escrever um livro requer meses de dedicação e como atualmente trabalho durante o dia e ministro aulas à noite, fica um pouquinho difícil. Então vamos aguardar a reação dos leitores ao “Dominando o Android”, e caso a receptividade seja boa, quem sabe?

4br4ç05,
nglauber

quarta-feira, 3 de dezembro de 2014

Livro "Dominando o Android"

Olá povo,

É com uma enorme satisfação, que após meses de trabalho, estou lançando meu livro pela editora Novatec entitulado Dominando o Android: do básico ao avançado.
Este livro é destinado a estudantes e profissionais de desenvolvimento de software que querem aprender a desenvolver aplicativos para a plataforma Android. Dominando o Android aborda desde os conceitos mais básicos até as técnicas mais avançadas no desenvolvimento de aplicativos para plataforma mobile do Google.
Por meio de exemplos práticos e didáticos você aprenderá:
  • Criar aplicativos para smartphones e tablets Android.
  • Conhecer os principais componentes para construir interfaces gráficas elegantes e compatíveis com diversos tamanhos e densidades de tela.
  • Persistir dados locais com SQLite e no cartão de memória do aparelho.
  • Acessar web services para enviar e receber dados.
  • Utilizar serviços do Google, tais como: Maps, Cloud Messaging, YouTube, Google+ e AdMob. 
  • Trabalhar com serviços, broadcast receivers, notificações e app widgets.
  • Deixar sua aplicação mais divertida usando animações e recursos multimídia. 
  • Criar aplicativos para os relógios inteligentes (smartwatches) com Android Wear.
  • Saber as principais novidades do Android 5.0 Lollipop. 
Ao final, o leitor estará pronto para projetar e desenvolver seus próprios aplicativos e publicá-los no Google Play.

A capa do livro foi feita pelo meu grande amigo Leo Macedo e o prefácio foi escrito por José Papo e Neto Marin do Google Brasil. Conto ainda com a participação ilustre do meu amigo Marcelo Quinta no capítulo sobre Google Play.

O lançamento do livro [ocorreu dia 14/01/2015]  ainda não está 100% definido, mas provavelmente será na segunda semana de janeiro/2015. Quando tiver mais novidades, posto aqui.

Os interessados, entrem no site da Novatec e vejam como adquirir o seu :)

O código-fonte está disponível no GitHub e se quiser tirar dúvidas sobre o livro, inscreva-se aqui.

4br4ç05,
nglauber