Escolar Documentos
Profissional Documentos
Cultura Documentos
Módulo básico
m éo
to
en
na e
ei u
tr O q
666
versão 1.0 versão 1.5 versão 1.6 versão 2.0-2.1 versão 2.2-2.2.3 versão 2.3-2.3.7 versão 3.0-3.2.6
Cupcake Donut Eclair Froyo Gingerbread Honeycomb
API 1 API 3 API 4 API 5-7 API 8 API 9-10 API 11-13
- Intents (incluindo - Suporte à - Live wallpapers - Contatos e contas - Mais melhorias na - Velocidade e - Interface
compartilhar) teclados - Dicionário mais - Mensagens SMS e câmera e galeria simplicidade da UI redesenhada
- Multitasking personalizados esperto MMS - Melhor - Entrada de texto - Novo teclado
- Serviços em - Widgets - Melhorias na performance mais intuitiva - Melhorias na
background - Previsão de câmera
- Múltiplas línguas - Selecionar com seleção, cópia e
entrada de texto - Teclado virtual
- Navegador para teclado virtual um toque e cola de textos
- Calendário - Digitação por voz copiar/colar - Novas opções de
- Bluetooth - Melhor consumo conectividade
bateria - Suporte à
- Sensores para processadores
jogos multicore
- NFC - Actionbar
- Consumo de persistente
bateria por app
Linha do tempo Fonte: Android History, 7 de novembro de 2016
versão 4.0-4.0.4 versão 4.1-4.3.1 versão 4.4-4.4.4 versão 5.0-5.1.1 versão 6.0-6.0.1 versão 7.0
Ice Cream Sandwich Jelly Bean Kit Kat Lollipop Marshmallow Nougat
API 14-15 API 16-18 API 19-20 API 21-22 API 23 API 24
- Refinamento da UI - Maior velocidade - Novas possibilidades - Material Design - Permissões em tempo - Notificações
(unificada para todos - OpenGL ES 3.0 NFC - Maior desempenho de execução melhoradas e
dispositivos) - > conectividade BT - Framework para - Notificações mais - Configuração de facilidades na UI
- Preview do app (em - Perfis restritos impressão visíveis, acessíveis e autobackup para apps - Troca rápida e
recentes) - Sensores e localização - Novo framework configuráveis - Mais ações ao multi-janelas
- Perfis otimizados armazenamento - OpenGL ES 3.1 selecionar um texto - Picture-in-Picture
- Novos recursos da - Suporte à interno - Maior conectividade - Melhor performance - Suporte à API Vulkan
câmera internacionalização - Impactos visuais - Câmera com captura do uso de bateria - Melhora no uso de
- Pastas na homescreen - Acessibilidade e (modo de tela cheia, RAW ou YUV - Melhor conversação bateria
- Auto sincronização de automação da UI nova área de - Perfil pessoal e de com seus apps - Mais rapidez na
favoritos - Maior segurança notificações) trabalho - USB Tipo C instalação de apps
- Notificações - Mais segurança, - Compartilhamento e - Direct Share - Atualização de apps
interativas acessibilidade e captura de tela durante utilização
internacionalização
Estatísticas
Gingerbread
Marshmallow
Jelly Bean
2.2 Froyo 8 0,1%
2.3.3 10 1,3%
Gingerbread
2.3.7
4.0.3 15 1,3%
Ice Cream Sandwich
4.0.4
4.1.x 16 4,9%
4.3 18 2,0%
Prós:
De simples implementação, não apresenta
problemas de conectividade ou preocupação com
implementação de estratégias de cache
avançadas.
Contras:
Para quaisquer atualizações de informações no
aplicativo é necessário lançar uma nova versão.
Arquiteturas Mobile
Arquitetura Online Distribuída
Parte das informações e recursos estão no
aplicativo, outra parte são obtidas de um servidor
ou sistema através de webservices.
Prós:
Versões do aplicativo em diferentes plataformas
obtém informações de um ponto em comum, mas
mantém boa usabilidade por conta do seu lado
nativo. Média complexidade de implementação.
Contras:
Depende de conexão com a Internet e não possui
uma estratégia de cache muito elaborada. Delays.
O aplicativo compartilha camadas de integração com outros sistemas e concorre com outros clientes.
Prós:
Informação sempre disponível, independente de existir conexão com a Internet. A sincronização das
informações não é perceptível para o usuário.
Contras:
Alta complexidade de implementação.
Arquiteturas Mobile: Arquitetura Corporativa (Enterprise)
Mobile First
O que é?
RAM limitada
Bateria Fragmentação
de dispositivos
Conexão de dados
intermitente, largura Baixo poder de
de banda pequena, processamento
alta latência
O Processo de Projeto de Desenvolvimento Mobile
Workshop de Projeto
- Foco em estabelecer um entendimento compartilhado por todo time do que
é o produto
- Cenários e storyboards
Prototipação
- Wireframes com post-its
- Entender fluxo das informações (Diagrama da Arquitetura da Informação)
- Testar esta navegação junto ao cliente (ex. POP app)
O Processo de Projeto de Desenvolvimento Mobile
Projeto Visual
- Protótipo de alta fidelidade (é necessário?)
- Guidelines
- Android Design
- iOS Human Interface Guidelines
- Mobile UX
O Processo de Projeto de Desenvolvimento Mobile
- Criação de recursos
- Testes e homologação
- Como disponibilizar?
- Testes de usabilidade
- Publicação
UX
Experiência do Usuário, do inglês user experience (UX), é definida pela norma
ISO 9241-210 como:
Estratégia de
Conteúdo
Pesquisa com o
Usuário
Usabilidade
Design da
Interação
Arquitetura da
Design Informação
Visual
Mobile UX - Por quê é importante?
- A experiência importa mais para o usuário pois o dispositivo
móvel é mais importante pra ele (do que um PC)
UX / UI Ruim 42%
Travamentos 48%
Objetivo
- Horizontal: exibe a interface como um todo, podendo ser mais genérica
- Vertical: exibe uma parte da interface, com maior detalhamento
Fidelidade
- Alta Fidelidade: maior proximidade com a interface final do sistema
- Baixa Fidelidade: envolve materiais que não se assemelham com a
interface do sistema
Prototipação - Técnicas
Prototipação em papel
- Feita com poucos recursos, junto ao
cliente ou com o time para validar ideias
e interface
DAI (exemplo)
Prototipação - Técnicas
Sketch
- Técnica de mais baixa fidelidade. Ideação.
Wireframe
- Apresenta a estrutura e conteúdo da interface. Os
elementos são representados por variações similares.
Desejável Desejável
MVP é isto!
Utilizável Utilizável
Confiável Confiável
Funcional Funcional
1 ano 2 anos
Design Patterns e Anti-patterns
Design Pattern (Padrão de Projeto) é uma solução geral reutilizável para um
problema que ocorre com frequência dentro de um determinado contexto no
projeto de software.
OPCIONAL
Depois, configurar na IDE em File > Settings > Version Control > Git e
verificar que o Path to Git executable esteja correto (clique em Test).
Adicionalmente, instalar o plugin em File > Settings > Plugins indo na opção
Browse repositories… e instalando o plugin .ignore.
commit push
pull fetch
Ufa!
Agora vamos
criar nosso
projeto
Criando um novo projeto com Android Studio
Ao abrir o Android Studio pela primeira vez, vemos algumas opções, entre estas
temos Start a new Android Studio Project
Configuração
Application name > Como o nome diz, é o nome da sua aplicação (ex:
Facebook, Gmail, Instagram), no nosso caso Android Básico
Target SDK significa qual versão você dará suporte (geralmente se escolhe a
última versão estável disponível).
Compile SDK é a versão que será utilizada para compilar o aplicativo, sendo
altamente recomendado compilar com a última versão disponível.
Activity name > É o nome da nossa primeira Activity, pode ser renomeada
(refatorada) posteriormente
Layout name > Se a opção Generate Layout File estiver marcada, o nome do
layout gerado e que será associado à Activity deve ser informado aqui,
também pode ser renomeado posteriormente
barra de
ferramentas
janela de
edição
janelas de
ferramentas
monitores
e logcat
barra de
status
Processo de compilação
Gradle
Gradle Byte code
ADB
Projeto Instalar no
Build Resources Sign
Android dispositivo
Manifest
APK
Android Debug Bridge - ADB
O ADB é uma ferramenta da linha de comando que permite a conexão com
emuladores ou dispositivos conectados.
daemon
cliente e servidor
Fonte: Android Debug Bridge | Android Developers
Android Debug Bridge - ADB
Comandos úteis
adb devices > Exibe a lista de dispositivos conectados e com permissão
autorizada
AndroidManifest.xml
Pastas estrutura
/src
/main
/java
/res
/androidTest
Estrutura do projeto - Resources
Pasta /res contendo as subpastas:
/anim
arquivos xml que são compilados em objetos animados
/color
arquivos xml que descrevem cores
/drawable
pastas de imagens (PNG, JPG ou GIF), arquivos de imagem 9-patch, e
arquivos xml que descrevem formas ou objetos que contém múltiplos estados
(normal, pressed ou focused) separados por densidades
Estrutura do projeto - Resources
Pasta /res contendo as subpastas:
/mipmap
ícones da aplicação (também separados por densidades)
/layout
arquivos xml que representam parte ou totalidade de uma tela
/menu
arquivos xml que definem menus da aplicação
Estrutura do projeto - Resources
Pasta /res contendo as subpastas:
/raw
arquivos brutos da aplicação, o mesmo que salvar na pasta assets mas com a
forma diferente de acesso na aplicação (uso de R.)
/values
arquivos xml que definem recursos por tipo de elemento XML
/xml
arquivos xml que configuram componentes da aplicação
Estrutura do projeto - Scripts Gradle
Gradle é um sistema de construção automatizado e muito bem integrado com o
Android Studio, através de scripts de linguagem simples
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig { ... } // base para todos os flavors
signingConfigs { ... } // antes de buildTypes para os buildTypes "enxergar"
buildTypes { ... }
productFlavors { ... } // suporta as mesmas propriedades de buildTypes (sobreescreve)
productFlavors {
free {
buildConfigField "boolean", "IS_PRO", "false"
}
pro {
buildConfigField "boolean", "IS_PRO", "true"
}
}
Toda tela possui uma UI associada (layout inflado), e essa UI pode conter views
(componentes e outros layouts), menus, caixas de diálogo.
Também pode navegar para outra Activity (ou outras), o que significa abrir
uma nova tela.
Fundo Frente
Fundo Frente
Fundo Frente
Fundo Frente
A Activity é destruída e recriada cada vez que o usuário girar a tela ou a tela é
redimensionada (ex: quando exibe o teclado).
android:configChanges="orientation|screenSize"
Um Fragment é como uma seção modular de uma atividade, que tem o próprio
ciclo de vida, recebe os próprios eventos de entrada e que pode ser adicionado
ou removido com a atividade em execução (uma espécie de "sub-atividade" que
pode ser reutilizada em diferentes atividades).
Níveis de log:
Log.e(TAG, “error”) sempre capturado e útil quando algo ruim acontece
Log.w(TAG, “warning”) sempre capturado e útil quando algo que você não espera acontece
Log.i(TAG, “info”) sempre capturado e útil para resultados de operações
Log.d(TAG, “debug”) apenas em modo de depuração e útil para variáveis
Log.v(TAG, “verbose”) sempre capturado e exibido e não utilizar em versão de produção
ImageView
Existem diversas Views e o desenvolvedor pode
usar ou criar views personalizadas
Space
(extendendo).
EditText
TextView
Uma ViewGroup é uma View especializada, View Button
sendo sua definição: um contêiner invisível que
ProgressBar
consegue organizar filhos Views. GridLayout
RecyclerView
Componentes UI Componentes não podem conter outros componentes dentro.
Atributos úteis
View > É um retângulo plano. layout_width > largura, medida em dp ou utilizando o
máximo possível do pai ao qual está inserido
(match_parent) ou o mínimo possível do conteúdo interno
Código View (wrap_content)
<View
android:layout_width="match_parent"
layout_height > altura, com as mesmas possibilidades da
android:layout_height="100dp" largura
android:background="#FFA000"
android:visibility="visible" background > informa qual o tipo de drawable que será
android:id="@+id/view_amarela" />
exibido como fonte do ImageView
*Aapt (Android Asset Packaging Tool) permite visualizar, criar e atualizar arquivos Zip-compatíveis (zip,
jar, apk). Também permite compilar recursos em binários. É a base de construção para aplicações
Android.
Como acessar um recurso pelo id?
Código Java
Usando um número inteiro estático de uma subclasse de sua classe R, como:
No XML
Usando uma sintaxe XML especial que também corresponde ao ID de recurso
definido em sua classe R, como:
@+id/nome > serve para associar um nome ao componente, ele cria uma entrada
na classe R.
Atributos úteis
Button > Botão com label de texto onClick > informe um método em sua Activity que
responderá à um clique no botão. Esse método deve
ter a seguinte assinatura public void
nomeDoMetodo(View view) {}
Código Button
<Button
android:id="@+id/button" Resultado Button
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clique aqui" />
Componentes UI Componentes não podem conter outros componentes dentro.
Button > Botão com label de texto e imagem (utilizar drawable como atributo e em qual posição)
<Button
Resultado Button com drawable
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:drawableLeft="@android:drawable/ic_delete"
android:text="Não clique aqui" />
Atributos úteis
TextView > Exibe um texto, inclusive podendo text > O texto que será exibido
exibir conteúdo HTML (diretamente de arquivo de
recursos ou programaticamente) lines > Faz o TextView ser exatamente da altura das
linhas informadas
Código TextView
ellipsize > Quando informado, quebra o texto até
<TextView o tamanho máximo da view
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
textSize > O tamanho da fonte, usado com a
android:gravity="center_horizontal" medida sp
android:text="Curso Android\nMódulo Básico"
android:textAppearance="?android:textAppearanceLarge" textColor > A cor da fonte, em HEXA ou recurso
android:textColor="#FBC02D"
android:textStyle="bold" />
textStyle > O estilo do texto (negrito, itálico...)
Atributos úteis
hint > Texto que é exibido de dica quando o campo
EditText > É um campo de texto que você está vazio
pode digitar
inputType > Tipo de dado que será permitido ao
usuário informar, pode trabalhar com múltiplos tipos
ao utilizar PIPE | (exemplo: textMultiLine|number)
Código EditText
Código ImageView
<ImageView Resultado
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/logo_serpro" />
AH! É só
colocar as
imagens na
pasta RES,
não é?
Resolução de tela
Existem milhares de novos aparelhos sendo lançados por ano e cada aparelho
possui um tipo de resolução de tela (e tamanho de tela, em polegadas).
Scaleable Pixels (sp) tem a mesma função do que dp, só que para fontes.
Telas de alta densidade possuem mais pixels por polegada do que telas de baixa
densidade.
Código Checkbox
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content" Resultado Checkbox
android:layout_height="wrap_content"
android:text="Aceito receber spam"
android:textAppearance="?android:textAppearanceMedium" />
Componentes UI Componentes não podem conter outros componentes dentro.
Atributos úteis
Switch > Interruptor ligado/desligado que pode switchPadding > Espaço mínimo entre o
ser deslizado ou apenas tocado para troca de Switch e o texto
estado.
switchMinWidth > Largura mínima
Código Switch
<Switch
android:id="@+id/backup_switch" Resultado Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Fazer backup de arquivos inúteis"
android:textAppearance="?android:textAppearanceSmall" />
Componentes UI Componentes não podem conter outros componentes dentro.
Código Spinner
Código SeekBar
Resultado SeekBar
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="20" />
Componentes UI Componentes não podem conter outros componentes dentro.
RadioButton
Permite ao usuário selecionar apenas um item em
um grupo de RadioButtons.
Código RadioButton
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton
android:layout_width="wrap_content" Resultado RadioButton
android:layout_height="wrap_content"
android:text="Com certeza"
android:textAppearance="?android:textAppearanceMedium" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NUNCA!"
android:textAppearance="?android:textAppearanceMedium" />
</RadioGroup>
Componentes UI Componentes não podem conter outros componentes dentro.
<RatingBar
android:id="@+id/rating_bar"
style="?android:attr/ratingBarStyle"
android:layout_width="wrap_content" Resultado RatingBar
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:numStars="5"
android:rating="3.5"
android:stepSize="0.5" />
Componentes UI Componentes não podem conter outros componentes dentro.
SearchView
Campo de busca que ao informar o termo (ou termos) exibe uma lista que permite clicar em um item ou
resultado.
<SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:iconifiedByDefault="false"
android:queryHint="Nome do legume" />
(ViewGroup). </LinearLayout>
</ScrollView>
ScrollView somente suporta rolagem
vertical. Para rolagem horizontal,
utilize HorizontalScrollView.
LinearLayout(android.widget.LinearLayout)
VERTICAL HORIZONTAL
LinearLayout(android.widget.LinearLayout)
Código LinearLayout Resultado
<View
android:layout_width="match_parent"
android:layout_height="128dp"
android:background="#d32f2f" />
<View
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_marginTop="16dp"
android:background="#7B1FA2" />
<View
android:layout_width="match_parent"
android:layout_height="128dp"
android:layout_marginTop="16dp"
android:background="#FBC02D" />
</LinearLayout>
LinearLayout(android.widget.LinearLayout)
Weight
LinearLayout suporta o valor de weight individualmente para os filhos,
utilizando-se do atributo android:layout_weight.
Como esse valor será distribuído entre os filhos, será calculado automaticamente
usando-se os dados do dispositivo, para isso, o valor deve ser 0dp variando
conforme o tipo de orientação:
VERTICAL HORIZONTAL
height=”0dp” width=”0dp”
LinearLayout - Weight(android.widget.LinearLayout)
Código LinearLayout - weight Resultado
Os filhos (views) são posicionados em uma pilha, um sobre o outro. Cada filho é
alinhado como referência aos limites do frame (canto superior esquerdo).
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/verde" />
<View
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/amarelo" />
<View
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="bottom"
android:background="@color/roxo" />
</FrameLayout>
Mas agora que eu já criei
mais do que um layout,
como eu faço para
exibir uma nova tela
no meu aplicativo?
startActivity() e Intent
Para iniciar uma nova activity utilizamos o método
Activity.startActivity(intent).
Assim é possível trafegar dados que podem ser necessários para a execução das
tarefas/ações que são iniciadas com startActivity().
Existem métodos específicos para enviar extras e para recuperar extras, um para
cada tipo básico (como boolean, int, string).
textViewClicavel.setOnClickListener(new View.OnClickListener() {
@Override
PrimeiraActivity
public void onClick(View v){
Intent intent = new Intent(PrimeiraActivity.this, SegundaActivity.class);
startActivity(intent);
}
}); intent
Intents implícitas
Não nomeiam nenhum componente específico, mas declaram uma ação geral a
realizar, o que permite que um componente de outro aplicativo a trate.
s
! nho o
Ei amigo, pega Esta é somente escol
ha Eu te os!
Me filtr
Esta mensagem! pra mim! Não posso te
ajudar, cara...
Preciso de uma
câmera!
Intent
Intent filter
Para anunciar quais intents implícitas o seu aplicativo pode receber, utiliza-se
um ou mais intent filters. Cada intent filter especifica o tipo de
intenções aceito com base na action e category. Você pode consultar quais os
tipos existentes clicando aqui.
<activity android:name=".CompartilharActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
RelativeLayout(android.widget.RelativeLayout)
Parent bottom Alinha a borda inferior do filho à borda inferior do pai android:layout_alignParentBottom
Parent left Alinha a borda esquerda do filho à borda esquerda do pai android:layout_alignParentLeft
Parent right Alinha a borda direita do filho à borda direita do pai android:layout_alignParentRight
Parent top Alinha a borda superior do filho à borda superior do pai android:layout_alignParentTop
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<View
android:id="@+id/view_1"
android:layout_width="60dp"
android:layout_height="80dp"
android:background="#E64A19" />
<View
android:id="@+id/view_2"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginLeft="16dp"
android:layout_toRightOf="@+id/view_1"
android:background="#AFB42B" />
<View
android:id="@+id/view_3"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_below="@+id/view_2"
android:layout_marginTop="16dp"
android:background="#0288D1" />
</RelativeLayout>
GridLayout
É um viewgroup que divide a tela em linhas e colunas
Resultado gridlayout.xml
(grid retangular)
Código layout: gridlayout.xml
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#CE93D8"
android:columnCount="5"
android:orientation="horizontal"
android:rowCount="4">
...
<TextView
style="@style/Widget.AppCompat.Button.Borderless"
android:gravity="center"
android:minHeight="60dp"
android:minWidth="60dp"
android:text="/"
android:textColor="#689F38"
android:textSize="30sp" />
…
</GridLayout>
Toast
É uma forma simples de feedback sobre uma operação em um pequeno popup
que some automaticamente após um tempo.
Não é possível colocar interações sobre um Toast, para isso,
utilize a nova forma: Snackbar.
Toast.makeText(
this, // contexto
"Toast demorado", //texto
Toast.LENGTH_LONG //duração
).show(); //não se esqueça de exibir o Toast!
Tipos de menu
Menu de opções e barra de ação
Coleção principal de itens de menu para uma atividade (deve-se colocar ações
que tem impacto global no aplicativo).
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(MenuItem item) {
MenuInflater inflater = getMenuInflater(); switch (item.getItemId()) {
inflater.inflate(R.menu.menu_principal, menu); case R.id.locais:
return super.onCreateOptionsMenu(menu); // tratar clique em locais
} return true;
case R.id.config:
// tratar clique em config
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Dialogs
São pequenas janelas (não ocupam a tela toda) onde o
usuário toma uma decisão ou insere informações
adicionais.
alertDialogBuilder.setTitle("DESTRUIÇÃO DO MUNDO");
alertDialogBuilder
.setMessage("Deseja prosseguir?")
.setCancelable(false)
.setPositiveButton("Com certeza",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
[…]
}
})
.setNegativeButton("Talvez amanhã",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel(); // fecha o dialog
}
});
Passo 1
Criação de um layout específico para o dialog, lembre-se que é possível utilizar
qualquer layout, não apenas o do exemplo (do próximo slide).
Passo 2
Utilizar a classe Dialog para a criação desse CustomDialog, inflando o layout
novo e definindo as ações do dialog (ações referentes ao dialog e ações
referentes a buttons que possam existir).
Código CustomDialog
Drawables XML são usados para descrever shapes (cor, borda, gradiente), state,
transitions e mais. Drawables também podem ser escritos programaticamente.
Código state_drawable_1.xml
Código ListView
</ListView>
NUNCA utilizar ScrollView com ListView, porque o ListView sabe como realizar seu próprio
rolamento. Mais importante, ao fazer isso todas as importantes otimizações em uma ListView para
trabalhar com listas extensas são perdidas, fazendo com que a ListView exiba a lista TODA de itens
para preencher o espaço infinito provido pela ScrollView.
ArrayAdapter
Exibe cada item através de um TextView (método toString()).
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.teste_listview);
listView.setAdapter(adapter);
}
}
CustomAdapter Código layout: pessoa_item.xml
bidimensional.
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.pessoa_grid_item, parent, false);
}
return convertView;
}
}
GridView
Código MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview_layout);
gridView.setAdapter(adapter);
}
}
Shared Preferences
Utilizado para gravar um conjunto pequeno de valores-chave.
putString(“NOME”, “Marcelo”)
CHAVE VALOR
Shared
NOME Marcelo Preferences
Código preferences.xml
Código ConfiguracoesActivity.java
Na Main Thread (UI Thread) ocorrem todos os eventos de input e output, por isso
deve-se evitar longas operações.
onPreExecute()
onPostExecute(Result)
AsyncTask(android.os.AsyncTask)
Código DownloadFilesTask TIPOS GENÉRICOS
{
public class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length; Params, o tipo dos parâmetros que
long totalSize = 0; serão enviados para a task.
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100)); Progress, o tipo das unidades de
if (isCancelled()) break; progresso publicadas durante a
}
return totalSize; execução em background.
}
//Cria um objeto de pilha de tarefas artificial (back stack) para a Activity iniciada
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(TratamentoNotificaoActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0, //Código de requisição
PendingIntent.FLAG_UPDATE_CURRENT //Flags
);
Passo 1
Definir um modelo de domínio/modelo de entidades.
gatos
_id : integer
nome : text
data_nascimento : text
cor_pelo : text
peso : real
tamanho : integer
Banco de dados
Passo 2
Definir uma classe de contrato, que é o contêiner das constantes que definem
nomes para URIs, tabelas e colunas.
A classe de contrato permite usar as mesmas constantes em outras classes no
mesmo pacote.
Também permite que você altere o nome da coluna em um local e que a
mudança se propague pelos seus códigos.
Este passo é opcional, apesar de altamente recomendado.
Esta declaração básica é utilizada em seu Helper, o próximo slide contém o restante
das informações.
Banco de dados
Código exemplo de SQLiteOpenHelper utilizando a estrutura básica do slide anterior
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
Gato gato = new Gato();
gato.id = cursor.getInt(cursor.getColumnIndex(GatoContract.GatosEntry._ID));
gato.nome = cursor.getString(cursor.getColumnIndex(GatoContract.GatosEntry.COLUMN_NOME));
gato.dataNascimento = cursor.getString(cursor.getColumnIndex(GatoContract.GatosEntry.COLUMN_DATA_NASCIMENTO));
gato.corPelo = cursor.getString(cursor.getColumnIndex(GatoContract.GatosEntry.COLUMN_COR_PELO));
gato.peso = cursor.getDouble(cursor.getColumnIndex(GatoContract.GatosEntry.COLUMN_PESO));
gato.tamanho = cursor.getInt(cursor.getColumnIndex(GatoContract.GatosEntry.COLUMN_TAMANHO));
gatosList.add(gato);
}
}
banco de dados
// Cria um novo mapa de valores para serem inseridos no banco
ContentValues values = new ContentValues();
values.put(GatoContract.GatosEntry.COLUMN_NOME, gato.nome);
values.put(GatoContract.GatosEntry.COLUMN_DATA_NASCIMENTO,
Coloque dados no gato.dataNascimento);
values.put(GatoContract.GatosEntry.COLUMN_COR_PELO, gato.corPelo);
banco de dados values.put(GatoContract.GatosEntry.COLUMN_PESO, gato.peso);
transmitindo um values.put(GatoContract.GatosEntry.COLUMN_TAMANHO, gato.tamanho);
objeto ContentValues // Insere a nova linha, retornando a chave primária dessa nova linha
return db.insert(
para o método GatoContract.GatosEntry.TABLE_NAME,
GatoContract.GatosEntry.COLUMN_NULL,
insert(). values);
}
Banco de dados
Excluir
Código exclusão de informação do banco de dados
Atualizar
public void atualizarEvento(Gato gato, long id) {
GatosDbHelper dbHelper = new GatosDbHelper(this);
- Contrato > uma classe Java qualquer que simplesmente define constantes
necessárias pelos clientes que precisam utilizar o provider .
- ContentResolver > uma parte da biblioteca Android que usa serviços a nível
de sistema para identificar o ContentProvider que esteja registrado como o
gerenciador de um conjunto de dados correspondente de uma URI específica.
O ContentResolver encaminha as requisições ao ContentProvider.
- ContentProvider > gerencia o conjunto de dados, fornecendo aos clientes
uma visão consistente dos dados e gerenciando o acesso aos mesmos.
- ContentObserver > é uma API que suporta um sistema de notificações
baseadas em URIs, que torna possível que os clientes descubram mudanças
em um conjunto de dados.
Uso de recursos do dispositivo
Para a utilização de recursos do dispositivo (como câmera, GPS, gravar dados no
armazenamento…) devemos informar no AndroidManifest qual a
permission/feature que nosso aplicativo está solicitando.
Permissions:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Features (previne que celulares que não possuem a feature instalem seu app):
<uses-feature android:name="android.hardware.camera" />
Dependendo dos recursos utilizados no seu aplicativo, pode ser necessário gerar
chaves e tokens de permissão para cada um destes recursos. Por exemplo, para
o Google Maps.
Assinatura
O Android exige que todos os APKs sejam assinados digitalmente com um
certificado antes de serem instalados.
A diminuição dos recursos existe como um plugin para o Gradle, que remove
recursos não utilizados do seu pacote, incluindo recursos não utilizados em
bibliotecas importadas.
Ofuscação e encolhimento
Abaixo há uma explicação dos atributos para encolhimento e ofuscação que
devem ser inseridos no seu arquivo build.gradle.
* Obrigatório
Fabric
O Fabric é a suíte modularizada criada pela empresa Twitter com ferramentas de
apoio aos desenvolvedores mobile.
- Crashlytics
- Beta
- Answers
- Twitter
- MoPub
Crashlytics
Pode ser considerado o núcleo da suíte Fabric, tem como objetivo prover
estabilidade aos aplicativos. Fazem parte do Crashlytics o Beta e o Answers.
Principais recursos
- Captura detalhes do erro e do dispositivo no qual
o erro aconteceu
- Envia ao desenvolvedor um e-mail ou notificação
com pistas da linha de código aonde o erro
aconteceu, mesmo com o aplicativo ofuscado
- Armazena estatísticas dos últimos 365 dias
- Identifica quando um erro já corrigido "regressa"
em uma nova versão do aplicativo
- Após consertar o erro, o desenvolvedor pode
marcá-lo como "closed"
Crashlytics - Beta
Facilita o processo de distribuição de versões de testes e de homologação dos
aplicativos.
Principais recursos
- Cadastro de testadores e homologadores,
individualmente ou em grupos
- Não "queima" versões do aplicativo
- Distribui novas versões apenas para os usuários
selecionados. Estas permissões podem ser
alteradas ou revogadas a qualquer momento
- Notifica os usuários quando uma nova versão
está disponível no Beta
- Versões históricas via App Beta
- Armazena estatísticas dos testes de cada versão
Crashlytics - Answers
Provê dados analíticos em tempo real ou através de informações coletadas nos
últimos 365 dias pelo aplicativo.
Principais recursos
- Usuários utilizando o app no momento
- Consolidações diversas como: quantidades de
instalações no dia, de usuários ativos no dia, de
usuários livres de bugs e de sessões de usuários
- Dashboard com gráficos intuitivos
- Detalhamento dos dados consolidados
- Funcionalidades mais utilizadas
- Cadastro de logs e eventos personalizados
Twitter Kit
Kit que facilita a integração de um aplicativo aos serviços do microblog social
Twitter. Pode ser utilizado para promover o crescimento da sua base de
usuários.
Principais recursos
- Acesso a API Rest do Twitter (tweets, favoritos,
buscas, listas de tweets e coleções)
- Exibição de Tweets de uma determinada hashtag
- Exibição de linhas do tempo
- Logar com conta do Twitter (OAuth)
- TweetComposer que permite escrever tweets
adicionando fotos ou vídeos de maneira simples
MoPub
Simplifica a integração de publicidades (ads) em um aplicativo adicionando
recursos de monetização ao aplicativo.
Principais recursos:
- Agrega diversos serviços de publicidade em um
único lugar (mediação)
- Suporte melhor que o do Google (Admob)
- Alguns recursos de publicidade utilizam
componentes nativos para não comprometer a
experiência do usuário
Apêndice I:
Bibliotecas de Compatibilidade
Support Library
Bibliotecas de compatibilidade
As bibliotecas de compatibilidade do Android oferecem:
Existem muitas bibliotecas e nos slides a seguir estão apenas algumas das mais
usadas
v4
Para: Android 1.6 (API 4) e superior
Localização: <sdk>/extras/android/support/v4/
Dependência: compile 'com.android.support:support-v4:23.3.0'
cardview <sdk>/extras/android/support/v7/cardview/
Adiciona suporte para a utilização do widget CardView.
gridlayout <sdk>/extras/android/support/v7/gridlayout/
Suporte para a classe GridLayout, que permite organizar a UI com um grid de células retangulares.
mediarouter <sdk>/extras/android/support/v7/mediarouter/
Provê meios de controlar a exibição de canais de mídia e stream do dispositivo para telas externas,
autofalantes e outros dispositivos de destino.
v7
Para: Android 2.1 (API 7) e superior
Localização: <sdk>/extras/android/support/v7/
Dependência: compile 'com.android.support:<NOME_PACOTE>-v7:23.3.0'
recyclerview <sdk>/extras/android/support/v7/recyclerview/
Adiciona a classe RecyclerView.
preference <sdk>/extras/android/support/v7/preference/
Provê APIs para suportar diferentes objetos de preferências, como CheckBoxPreference e ListPreference
Annotation Localização: <sdk>/extras/android/support/annotations/
Dependência: compile 'com.android.support:support-annotations:23.3.0'
Porque evitar
Exigir cadastro antes de poder utilizar o app =
usuário apaga o app.
Dica
Utilizar login social ao invés deste anti-padrão
(Google, Facebook, Twitter, dentre outros fornecem
este tipo de serviço)
ANTI
EULA (End User Lisence Agreement)
P TTERN
Categoria Exemplo
Welcome Experience
Porque evitar
Além de não serem requeridos, notadamente
ninguém os lê.
Tutorial
PATTERN
Categoria Exemplo
Welcome Experience
Como funciona
Durante as boas vindas, o usuário recebe uma
pequena lição de como usar o app.
Como funciona
A tela inicial atua como uma área que apresenta links
e ícones para as funcionalidades primárias do app.
Como funciona
Quando o usuário abre o aplicativo, ele recebe um
instantâneo das informações mais relevantes que ele
precisa saber.
Como funciona
A tela inicial exibe uma ou mais marcações ou
mensagens na linha de tempo do usuário no app.
Como funciona
Quando uma interface é desenhada para ficar similar
à sua contraparte do mundo real.
Como funciona
Quando a tela inicial carrega, são exibidos alguns
itens atualizados e categorias de itens de interesse
do usuário.
Como funciona
Quando a tela carrega, ela exibe um mapa da área da
localização do usuário e exibe pontos de interesse
do usuário relacionados ao aplicativo.
Como funciona
Ao deslizar de fora da tela (esquerda) para o centro,
um menu de opções é exibido para o usuário. É
comum que o drawer também seja exibido no ícone
hamburguer.
Como funciona
Quando as necessidades dos seus usuários excedem
as capacidades do seu app, você precisa navegar para
um app diferente que complete a tarefa para o
usuário.
Como funciona
Quando o usuário toca em ações, um menu pop-up
com mais ações é aberto para revelar mais opções
para este usuário.
Porque evitar
Você não deve desperdiçar o tempo do usuário. Caso
o usuário se sinta perdido ao procurar a informação
no pogosticking, ele irá desinstalar o app.
Toolbar
PATTERN
Categoria Exemplo
Tools
Como funciona
A barra de ferramentas é uma das formas mais
comuns de provês ações específicas de uma tela.
Como funciona
Apresenta ações específicas para um objeto ou
tarefa.
Como funciona
Após o usuário tocar no botão de busca (lupa), a
caixa de pesquisa é expandida e num segundo toque
a busca é realizada.
Como funciona
Após o usuário entrar com alguns caracteres no
campo de busca, o app exibe uma "camada" com
sugestões de palavras para o usuário, que decide
escolher uma das sugestões ou continuar digitando.
Como funciona
Implementa o Auto-Suggest uma palavra por vez,
através de uma espécie de navegação por
palavras-chave.
Como funciona
Após uma busca ser efetuada, os resultados são
exibidos na mesma tela ou em uma tela dedicada.
Porque evitar
Na mente da maioria das pessoas, busca é uma
atividade iterativa e há pouca distinção entre
palavras-chave, filtros e opções de ordenação. Todas
são ferramentas para encontrar o que elas precisam.
Pull to Refresh
PATTERN
Categoria Exemplo
Search
Como funciona
O usuário é apresentado a uma longa lista de
atualizações, tipicamente ordenada por tempo: mais
recentes primeiro. Quando ele quer atualizar a lista,
ele simplesmente a puxa para baixo.
Como funciona
Abas no topo da tela permitem que o usuário
alternem entre views ou apliquem opções de
filtragem e ordenação.
Como funciona
Os resultados podem ser acessados de duas formas:
através de uma busca simples ou através de uma
busca avançada com mais opções.
Como funciona
Acontece algum erro de validação ou navegação no
app e o usuário é informado acerca do problema.
Como funciona
Provê uma confirmação quando uma ação é tomada.
Porque evitar
O usuário sabe o que está fazendo. Mensagens de
confirmação desnecessárias só o perturbam.
Dica
Ofereça opções de desfazer para ações arriscadas.
System Status
PATTERN
Categoria Exemplo
Feedback and Affordance
Como funciona
Mostra para o usuário indicadores de carregamento
e processamento.
Como funciona
Torna visível quando os elementos da UI são tocáveis.
Como funciona
Torna reconhecível quando uma interação de deslizar
está disponível no app.
Como funciona
Permite que o usuário arraste componentes de UI ou
delimite áreas com um toque de arrastar.
Porque evitar
Gera desconforto aos usuários da plataforma original
pois prejudica o reconhecimento dos elementos de
UI e comprometem a usabilidade dos apps.
Social Registration
PATTERN
Categoria Exemplo
Social Patterns
Como funciona
Quando um app solicita que o usuário permita que
este aplicativo utilize suas credenciais de uma rede
social para se autenticar.
Como funciona
Uso de elementos de jogos em um não-jogo.
Porque evitar
Irritam o usuário causando frustração.
Did You Mean?
PATTERN
Categoria Exemplo
Avoiding Missing and Undersirable Results
Como funciona
O usuário informa uma palavra-chave que não é
reconhecida na pesquisa, mas o sistema oferece um
conjunto de substituições semelhantes à entrada
original.
Como funciona
Quando um determinado campo aceita apenas um
tipo específico de dados, como um e-mail, número de
telefone, ou CEP, o aplicativo pode oferecer o tipo
correto de teclado.
Como funciona
O usuário inicia uma busca utilizando caracteres,
mas o sistema efetua uma busca dinâmica e retorna
entidades atômicas (ou discretas) como resultado.
Como funciona
O dado informado pelo usuário é validado em um
servidor de maneira assíncrona, retornando os estados
de falha ou conformidade e a UI precisa ser atualizada.
Como funciona
No Android o padrão de posicionamento dos botões
em um formulário ou caixa de diálogo é Cancel / OK
e não OK / Cancel.
Como funciona
Quando o formulário é apresentado ao usuário e seus
labels aparecem acima dos campos de entrada.
Como funciona
Quando um formulário precisa ser preenchido o
dispositivo móvel usa seus recursos físicos (sensores de
voz, gestos, acelerômetro, localização, imagens, vídeo e
luz ambiente) como forma de entrada de dados.
Prós
Ebook de preço acessível para kindle.
Contras
Não existe versão impressa.
Mobile e UX
Descrição
Livro sobre prototipação mobile de alta fidelidade.
Prós
Linguagem clara e objetiva, com várias dicas específicas
para a prototipação mobile com uma ferramenta
poderosa, o Axure.
Contras
O Axure é uma ferramenta cara, e está disponível apenas
para Windows e Mac OS X.
Mobile e UX
Descrição
Livro sobre padrões de projeto para mobile.
Prós
Com qualidade visual impecável, este livro não se restringe
apenas a Android, mas também apresenta design patterns
para iOS e Windows Phone, inclusive apresentando
diferenças aplicáveis a cada plataforma.
Contras
Pré Material Design, suas imagens estão começando a ficar
desatualizadas.
Android
Descrição
Livro bastante abrangente de Android.
Prós
Livro bastante completo e, de longe, o melhor livro de
Android já escrito. Equilibra muito bem teoria e prática
com exercícios muito interessantes. Uma atualização está
"no forno" (para maio de 2017).
Contras
Está desatualizado.
Android
Descrição
Livro abrangente de Android de autor brasileiro.
Prós
É um livro muito bom, mesmo sendo em português. Não é
um livro superficial.
Contras
Não chega a Android avançado apesar do subtítulo.
Algumas explicações do livro deixam a desejar.
Android
Descrição
Livro de padrões de projeto Android.
Prós
Antes de adentrar nos padrões, o livro apresenta nuances
do paradigma mobile e técnicas de desenvolvimento.
Contras
A versão em português traduz os nomes dos padrões.
Catálogo completo porém desatualizado. Alguns padrões
e anti-padrões não existem mais.
Android
Descrição
Livro de implementação de interface para não designers.
Prós
Fala a língua do desenvolvedor, e não a do designer
gráfico. Com ele um programador de backend consegue
fazer um projeto de UI mais que simplesmente aceitável.
Foco em Material Design. Qualidade e acabamento
primorosos.
Contras
Não é muito extenso, com isto alguns detalhes não são
explorados.
Android
Descrição
Livro de implementação de interface para aplicativos
nativos Android responsivos em smartphones e tablets.
Prós
Livro com linguagem clara e objetiva e visual bem cuidado,
com exemplos coloridos e fonte agradável. Foca em layout
mas também apresenta alguns design patterns.
Contras
Não é um livro muito grande e o preço acaba sendo alto
em relação ao seu conteúdo.
Android
Descrição
Ebook sobre bancos de dados Android.
Prós
Dá uma visão geral da persistência em banco de dados
android. Ebook bastante barato e fácil de "terminar".
Contras
Parece um compilado de um blog. Livro curto e com
conceitos abordados muito superficialmente.
Android
Descrição
Livro avançado de bancos de dados Android. Indicado para
desenvolvedores experientes na plataforma.
Prós
Explica cada mecanismo envolvido e necessário para uma
arquitetura android enterprise.
Contras
Não muito extenso, alguns conceitos não são bem
explicados. Alguns exemplos não são intuitivos.