Monthly Archives: outubro 2016

XCode 8 e Swift 3

Posted by rlecheta on outubro 23, 2016
iOS, Livros / 14 Comments

Olá pessoal

A 4a ed do livro de iOS foi feita utilizando o XCode 7 com Swift 2.
ios
Recentemente foi lançado o Xcode 8 com suporte ao Swift 3.
Para auxiliar os leitores que compraram a 4ed, este post visa explicar algumas das mudanças e também para dizer que atualizei os fontes no github com os exemplos com Swift 3.
Espero que o fonte ajude quem comprar a 4ed e precisar estudar Swift 3.
Para migrar os projetos da 4ed para Swift 3 foi simples. Eu abri cada projeto no Xcode 8 e o próprio Xcode mostrou o wizard para migrar para o Swift 3. Na maioria das vezes deu certo, e quando não funcionou fiz pequenos ajustes.
A figura abaixo mostra o wizard do XCode 8 durante a migração do Swift 2 para o Swift 3. Ele mostra um preview de cada arquivo, portanto eu recomendo que você leia cuidadosamente cada mudança pois é uma ótima maneira de aprender a nova sintaxe.
9-2
Mas o que mudou?
Algumas coisas foram a sintaxe como mostra esse código abaixo.

Swift 2: UIApplication.sharedApplication().openURL(NSURL(string:url)!)

Swift 3: UIApplication.shared.openURL(URL(string:url)!)

Note que a classe NSURL mudou para apenas URL. Isso acontece também com várias outras classes que tinham o prefixo NS.

A seguir temos outro exemplo de código que está diferente:

Swift 2:

self.window = UIWindow(frame: UIScreen.main.bounds)

self.window!.backgroundColor = UIColor.white

Swift 3:

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

self.window!.backgroundColor = UIColor.whiteColor()

Uma mudança importante foi na forma de declarar os métodos, pois foi adicionado um prefixo “_” opcional no primeiro parâmetro. Digamos que temos uma função soma(n1,n2) com a seguinte declaração.

func soma(n1:Int, n2:Int) -> Int {

   return n1 + n2

}

Par chamar a função você faria algo assim:

let n = soma(n1: 1, n2: 3)

print(n)

Note que é obrigatório informar o primeiro argumento “n1”. Caso você opte por simplificar a chamada e não informar o argumento, basta colocar o “_” antes de declarar o primeiro argumento, assim:

func soma(_ n1:Int, n2:Int) -> Int {

   return n1 + n2

}

Neste caso a chamada ficaria (não precisa informar o n1):

let n = soma(1, n2: 3)

print(n)

Bom, teve várias outras mudanças.. mas o que recomendo é que vocês migrem os projetos de Swift 2 para Swift 3 utilizando este wizard do XCode, pois é um excelente exercício e aprendizado.

Para quem tem a 4ed, recomendo antes estudar no XCode 7, pois assim os exemplos com Swift 2 vão todos funcionar. É possível encontrar versões antigas do XCode procurando no Google por “xcode older versions”. Depois que estudar os códigos do livro com Swift 2, recomendo instalar o XCode 8 e utilizar o wizard de migração para o Swift 3.. Será um bom aprendizado sobre a sintaxe.

É isso pessoal, espero que este rápido post tenha ajudado :-).

Temas no Android: O que fazer se a Action Bar estiver nula.

Posted by rlecheta on outubro 07, 2016
Android, Livro Android, Tutorial / 2 Comments

Olá pessoal, recentemente um leitor da 4a edição do livro de Android veio tirar uma dúvida sobre um erro que acontecia com um exemplo do capítulo 4.

No caso a activity estava herdando de android.app.Activity.


public class AlgumaActivity extends Activity {

... código aqui

// dava erro nessa linha

getActionBar().setDisplayHomeAsUpEnabled(true);

}

O erro reportado foi que dava NullPointer ao acessar a action bar.

OK, mas porque isso acontece?

Na maioria das vezes, se a action bar está nula com certeza é a configuração do tema.

Olhando o styles.xml do meu colega, o tema do projeto estava configurado assim:

a

Vejam que está usando o tema AppCompat, que traz a compatibilidade para várias versões do Android. Este tema substitui os temas Holo, Material, etc e atualmente é recomendado pelo Google. Isso é o esperado mesmo e está correto, pois o Android Studio atualmente gera o projeto desta forma.

O problema é que na época que escrevi a 4a edição do livro, os exemplos eram gerados de outra forma pelo Android Studio, inclusive no github da 4ed está assim:

https://github.com/livroandroid/4ed/blob/master/capitulos/cap04-activity/HelloActivity/app/src/main/res/values/styles.xml

b

Veja que o tema que usei na época da 4ed foi o Holo, que é um específico para Android 3 (API Level 11). Enfim, mas isso está explicado no livro e não quero demorar aqui…

O livro 5a ed que está mais atualizado já traz os exemplos todos com o tema de compatibilidade, portanto este problema acontece apenas nos exemplos da 4 ed, pois o Android Studio mudou a forma de gerar o código dos projetos.

Bom, existem 2 formas de resolver este problema:

1) Caso você queira deixar o código das classes de Activity iguais estavam nos exemplos da 4ed, é preciso alterar o tema do projeto para Holo ou Material, conforme o github da 4ed. Isso é feito alterando o arquivo styles.xml conforme o exemplo que mostrei acima do github.

Basicamente, se o seu tema herda de Holo ou Material, você está usando um tema nativo. Então vc deve sempre usar a android.app.Activity como a activity mãe, e neste caso você pode utilizar o método getActionBar() que retorna a action bar nativa android.app.ActionBar.

Era dessa forma que era feito nos primeiros exemplos da 4 ed. Somente no capítulo de Action Bar que começo a explicar o tema AppCompat de compatibilidade.

2) A segunda forma de resolver, e talvez a recomendada é atualizar o código de todas as Activities para herdar de android.support.v7.app.AppCompatActivity, pois é a activity do tema de compatibilidade. Atualmente o Android Studio gera o projeto com o tema AppCompat, como vimos no styles.xml do meu colega logo no início deste post. Isto indica que o projeto usa o tema de compatibilidade.

Esta configuração de tema atualmente é a indicada. Porém como o fonte da 4ed está antigo, faça as seguintes alterações no código:

  • Altere todas as activities do projeto para herdar de AppCompatActivity.
  • Altere a chamada do método getActionBar() por getSupportActionBar(), pois este último vai retornar a action bar de compatibilidade, que é a classe android.support.v7.app.ActionBar.

Como o Android Studio atualmente gera o projeto com o tema de compatibilidade, na 5ed do livro todos os exemplos já estão assim.

É isso pessoal, este breve post foi só para explicar uma pequena diferença entre a 4ed e a 5ed. Como vimos o Android Studio mudou a forma de gerar os códigos do projeto e isso afetou um pouco, e essas coisas de tema e compatibilidade costumam ser complicadas para quem está estudando Android pela primeira vez :-).

Independente de como estão os códigos-fontes da 4ed e 5ed, estes conceitos é bom conhecer.

Qualquer dúvida perguntem, abs.

Tags: