You are on page 1of 159

Criando um projeto Android

ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Criar um projeto com Eclipse 2. Criar um projeto com as ferramentas de linha de comando

VOC TAMBM DEVE LER


Instalando o SDK Gerenciando Projetos

Um projeto Android contm todos os arquivos que compem o cdigo fonte para o seu aplicativo Android. As ferramentas do SDK do Android se torna mais fcil para iniciar um novo projeto Android com um conjunto de diretrios de projeto padro e arquivos. Esta lio mostra como criar um novo projeto ou usando Eclipse (com o plugin ADT) ou usando as ferramentas do SDK a partir de uma linha de comando. Nota: Voc j deve ter o Android SDK instalado, e se voc estiver usando o Eclipse, voc tambm deve ter o plug-in ADTinstalado (verso 21.0.0 ou superior). Se voc no tiver esses, siga o guia de instalao do SDK Android antes de comear esta lio.

Criar um projeto com Eclipse

1. Clique em Novo

na barra de ferramentas.

2. Na janela que aparece, abra o Android pasta, selecione Projeto Aplicativo para Android e clique em Prxima .

Figura 1. assistente do projeto New Android App no Eclipse.

3. Preencha o formulrio que aparece:

o o o

Nome do aplicativo o nome do aplicativo que aparece para os usurios. Para este projeto, usar "My First App". Nome do Projeto o nome do diretrio do projeto eo nome visvel no Eclipse. Nome do pacote o namespace do pacote para seu aplicativo (seguindo as mesmas regras que os pacotes na linguagem de programao Java). Seu nome de pacote deve ser nico em todos os pacotes instalados no sistema Android. Por esta razo, geralmente melhor se voc usar um nome que comea com o nome de domnio reverso da sua organizao ou entidade editora.Para este projeto, voc pode usar algo como "com.example.myfirstapp". No entanto, voc no pode publicar seu aplicativo no Google Play usando o "com.example" namespace. Mnimo Necessrio SDK a verso menor do Android que o aplicativo suporta, indicado usando o nvel API . Para suportar tantos dispositivos quanto possvel, voc deve definir isso para o menor verso disponvel que permite que seu aplicativo para fornecer seu conjunto de recursos do ncleo. Se alguma caracterstica de sua aplicao s possvel em verses mais recentes do Android e no crtico para o conjunto de recursos do ncleo do aplicativo, voc pode ativar o recurso apenas quando executado nas verses que suportam (como discutido na Coadjuvante diferentes verses da plataforma ). Deixe este conjunto para o valor padro para este projeto. Alvo SDK indica a verso mais recente do Android (tambm usando o nvel API ) com o qual voc j testou com a sua aplicao. medida que novas verses do Android se tornam disponveis, voc deve testar o seu aplicativo na nova verso e atualizar este valor para corresponder ao nvel API mais recente, a fim de tirar proveito dos novos recursos da plataforma.

Com compilar a verso da plataforma com a qual voc ir compilar o seu aplicativo. Por padro, isso definido como a ltima verso do Android disponvel no seu SDK. (Deve ser o Android 4.1 ou superior, se voc no tem essa verso disponvel, voc deve instalar um usando o Gerenciador de SDK ). Voc ainda pode criar seu aplicativo para suportar as verses mais antigas, mas a definio da meta de construo para a verso mais recente permite ativar novos recursos e otimizar seu aplicativo para uma grande experincia de usurio nos dispositivos mais recentes. Tema especifica o Android estilo UI para aplicar para o seu aplicativo. Voc pode deixar isso sozinho.

Clique em Prxima . 4. Na prxima tela para configurar o projeto, deixe as selees padro e clique em Avanar . 5. A prxima tela pode ajudar a criar um cone do lanador para o seu aplicativo. Voc pode personalizar um cone de vrias maneiras ea ferramenta gera um cone para todas as densidades de tela. Antes de publicar o aplicativo, voc deve ter certeza que seu cone atende s especificaes definidas no Iconografia guia de design. Clique em Prxima . 6. Agora voc pode selecionar um modelo de atividade de que para comear a construir sua aplicao. Para este projeto, selecione BlankActivity e clique Prxima . 7. Deixe todos os detalhes para a atividade em seu estado padro e clique em Finish . Seu projeto Android agora est configurado com alguns arquivos padro e voc est pronto para comear a construir o app. Continue para a prxima lio .

Criar um projeto com as ferramentas de linha de comando


Se voc no est usando o Eclipse IDE com o plugin ADT, voc pode ao invs criar seu projeto usando as ferramentas do SDK a partir de uma linha de comando: 1. Altere os diretrios em do o Android do SDK ferramentas / de caminho.

2. Execute:
alvos lista android

Imprime uma lista das plataformas Android disponveis que voc baixou para o seu SDK. Encontrar a plataforma com a qual voc deseja compilar o seu aplicativo. Anote o ID de destino. Recomendamos que voc escolha a verso mais alto possvel. Voc ainda pode criar seu aplicativo para suportar as verses mais antigas, mas a definio da meta de construo para a verso mais recente permite que voc otimize o seu aplicativo para os dispositivos mais recentes. Se voc no v todos os alvos indicados, voc precisa instalar alguns usando a ferramenta Android SDK Manager. Veja Adicionando plataformas e pacotes . 3. Execute:
4. android projeto Criar - <target-id> alvo - o nome MyFirstApp \ 5. - Caminho <path-to-workspace> / MyFirstApp - MainActivity atividade \ 6. - Pacote com.example.myfirstapp

Substitua <target-id> com um ID da lista de alvos (a partir do passo anterior) e substituir <path-toworkspace> com o local em que voc deseja salvar seus projetos Android. Seu projeto Android agora est configurado com vrias configuraes padro e voc est pronto para comear a construir o app. Continue para a prxima lio . Dica: Adicione as plataforma-tools / , bem como as ferramentas / diretrio de seu PATH varivel de ambiente.

Executando o seu App


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Executado em um dispositivo real 2. Executar no Emulator

VOC TAMBM DEVE LER


Usando Dispositivos de Hardware Gerenciamento de dispositivos virtuais Gerenciando Projetos

Se voc seguiu a lio anterior para criar um projeto Android, que inclui um conjunto padro de arquivos de origem "Hello World" que permitem que voc execute imediatamente o app. Como voc executar seu aplicativo depende de duas coisas: se voc tiver um dispositivo Android-powered real e se voc estiver usando o Eclipse. Esta lio mostra como instalar e executar o aplicativo em um dispositivo real e no emulador Android, e em ambos os casos, tanto com as ferramentas de linha de comando Eclipse ou. Antes de executar o aplicativo, voc deve estar ciente de alguns diretrios e arquivos no projeto Android:
AndroidManifest.xml

O arquivo de manifesto descreve as caractersticas fundamentais da aplicao e define cada um de seus componentes. Voc vai aprender sobre vrias declaraes nesse arquivo enquanto voc l mais aulas de treinamento.

Um dos elementos mais importantes seu manifesto deve incluir a <uses-sdk> elemento. Isso declara a compatibilidade do seu aplicativo com diferentes verses do Android usando o Android: minSdkVersion e android: targetSdkVersion atributos. Para o seu primeiro aplicativo, ele deve ser parecido com isto:
<Manifestar xmlns: android = "http://schemas.android.com/apk/res/android" ... > <Uses-sdk android: minSdkVersion = "8" android: targetSdkVersion = "17" /> ... </ Manifest>

Voc deve sempre definir o android: targetSdkVersion o mais alto possvel e testar seu aplicativo na verso plataforma correspondente. Para mais informaes, leia Apoiar diferentes verses da plataforma .
src /

Diretrio para as principais arquivos de origem do seu aplicativo. Por padro, ele inclui uma atividade de classe que executado quando o aplicativo iniciado usando o cone do aplicativo.
res /

Contm vrios sub-diretrios para recursos de aplicativos . Aqui esto apenas alguns exemplos:
drawable-hdpi /

Diretrio para objetos drawable (como bitmaps) que so projetados para telas de alta densidade (hdpi). Outros diretrios drawable contm ativos projetadas para outras densidades de tela.
layout /

Diretrio para arquivos que definem interface de usurio do aplicativo.


valores /

Diretrio para outros arquivos XML que contm um conjunto de recursos, tais como cordas e definies de cores. Quando voc compilar e executar o aplicativo Android padro, o padro Activity classe inicia e carrega um arquivo de layout que diz "Ol Mundo". O resultado no nada excitante, mas importante que voc entenda como executar seu aplicativo antes de voc comear a desenvolver.

Executado em um dispositivo real


Se voc tiver um dispositivo Android-powered real, aqui est como voc pode instalar e executar o aplicativo: 1. Conecte o dispositivo ao computador de desenvolvimento com um cabo USB. Se voc est desenvolvendo no Windows, pode ser necessrio instalar o driver USB apropriado para o seu dispositivo. Para obter ajuda para a instalao dos drivers, consulte o Drivers USB OEM documento. 2. Ativar a depurao USB no seu dispositivo.
o o

Na maioria dos dispositivos rodando Android 3.2 ou mais, voc pode encontrar a opo emConfiguraes> Aplicaes> Desenvolvimento . No Android 4.0 e mais recentes, em Configuraes> Opes do desenvolvedor . Nota: No Android 4.2 e mais recentes, as opes do desenvolvedor est oculta por padro. Para torn-lo disponvel, v para Configuraes> Sobre o telefone e

toque Construir nmero sete vezes. Retorne tela anterior para encontrar opes desenvolvedor . Para executar o aplicativo a partir de Eclipse: 1. Abra um dos arquivos do seu projeto e clique em Executar na barra de ferramentas.

2. No Executar como janela que aparece, selecione Aplicativo para Android e clique em OK . Eclipse instala o aplicativo em seu dispositivo conectado e comea-lo. Ou para executar o aplicativo a partir de uma linha de comando: 1. Altere os diretrios para a raiz do seu projeto Android e executar:
ant debug

2. Certifique-se que o Android SDK platform-tools / diretrio est includo no seu PATH varivel de ambiente, em seguida, execute:
adb install bin / MyFirstApp-debug.apk

3. No seu dispositivo, localize MyFirstActivity e abri-lo. assim que voc compilar e executar o seu aplicativo Android em um dispositivo! Para iniciar o desenvolvimento, continue para a prxima lio .

Executar no Emulator
Se voc estiver usando Eclipse ou a linha de comando, para executar seu aplicativo no emulador, voc precisa primeiro criar um dispositivo virtual Android (AVD). Um AVD uma configurao do dispositivo para o emulador Android que permite modelar diferentes dispositivos.

Figura 1. O Gerente de AVD mostrando alguns dispositivos virtuais.

Para criar um AVD: 1. Lanar o Android Virtual Device Manager: a. Em Eclipse, clique em Android Virtual Device Manager a partir da barra de ferramentas.

b. A partir da linha de comando, altere os diretrios para<sdk> / ferramentas / e executar:


android avd

2. No Gerenciador de dispositivos Android Virtual painel, clique emNovo . 3. Preencha os detalhes para o AVD. D-lhe um nome, um alvo plataforma, um tamanho de carto SD, e uma pele (HVGA o padro). 4. Clique em Criar AVD . 5. Selecione o novo AVD do Android Virtual Device Manager e clique em Iniciar . 6. Aps o emulador inicializado, desbloquear a tela do emulador. Para executar o aplicativo a partir de Eclipse: 1. Abra um dos arquivos do seu projeto e clique em Executar Eclipse instala o aplicativo no seu AVD e comea-lo. Ou para executar o aplicativo a partir da linha de comando: 1. Altere os diretrios para a raiz do seu projeto Android e executar:
ant debug

na barra de ferramentas.

2. No Executar como janela que aparece, selecione Aplicativo para Android e clique em OK .

2. Certifique-se que o Android SDK platform-tools / diretrio est includo no seu PATH varivel de ambiente, em seguida, execute:
adb install bin / MyFirstApp-debug.apk

3. No emulador, localize MyFirstActivity e abri-lo. assim que voc compilar e executar o seu aplicativo Android no emulador! Para iniciar o desenvolvimento, continue para a prxima lio .

Construir uma interface simples


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Criar um layout Linear 2. Adicionar um campo de texto 3. Adicionar recursos de seqncia 4. Adicionar um boto 5. Faa a caixa de entrada Preencha a largura da tela

VOC TAMBM DEVE LER


Layouts

A interface grfica do usurio para um aplicativo Android construdo usando uma hierarquia de Ver e ViewGroupobjetos. Visualizao de objetos so geralmente widgets de interface do usurio, como botes ou campos de texto eViewGroup objetos so vista containers invisveis que definem como os pontos de vista de crianas so colocadas para fora, tais como em uma grade ou uma lista vertical.

Android fornece um vocabulrio XML que corresponde s subclasses de Ver e ViewGroup para que voc possa definir a sua UI em XML usando uma hierarquia de elementos de interface do usurio.

Layouts alternativos
Declarando seu layout UI em XML em vez de cdigo em tempo de execuo til por vrias razes, mas especialmente importante para que voc possa criar diferentes layouts para diferentes tamanhos de tela. Por exemplo, voc pode criar duas verses de um layout e dizer ao sistema para usar um em telas "pequenas" e outra nas telas "grandes". Para mais informaes, consulte a classe sobreApoiar diferentes dispositivos .

Figura 1. Ilustrao de como ViewGroup objetos formam ramos no layout e conter outros Visualizao
de objetos.

Nesta lio, voc vai criar um layout em XML que inclui um campo de texto e um boto. Na aula seguinte, voc vai responder quando o boto pressionado, enviando o contedo do campo de texto para outra atividade.

Criar um layout Linear


Abra o activity_main.xml arquivo da res / layout / diretrio. Nota: Em Eclipse, quando voc abre um arquivo de layout, voc mostrado pela primeira vez o editor de layout grfico. Este um editor que ajuda a criar layouts usando ferramentas WYSIWYG. Para esta lio, voc vai trabalhar diretamente com o XML, ento clique no activity_main.xml guia na parte inferior da tela para abrir o editor de XML. O modelo BlankActivity que voc escolheu quando criou este projeto inclui a activity_main.xml arquivo com um RelativeLayout vista de raiz e um TextView vista da criana. Primeiro, excluir o <TextView> elemento e alterar a <RelativeLayout> elemento para <LinearLayout> . Em seguida, adicione o android: orientao atributo e defini-lo como "horizontal" . O resultado se parece com isso:
<? xml version = "1.0" encoding = "UTF-8" > <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: Ferramentas = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: layout_height = "match_parent" android: orientao = "horizontal" > </ LinearLayout>

LinearLayout um grupo de ponto de vista (uma subclasse de ViewGroup ), que estabelece os pontos de vista da criana em uma orientao vertical ou horizontal, conforme especificado pelo Android: orientao de atributos. O filho de um LinearLayout aparece na tela na ordem em que aparece no XML.

Os outros dois atributos, Android: layout_width e android: layout_height , so necessrios para todas as vises, a fim de especificar o seu tamanho. Porque o LinearLayout a viso raiz no layout, ele deve preencher a rea de tela inteira que est disponvel para o aplicativo, definindo a largura ea altura de "match_parent" . Este valor diz que a viso deve ampliar sua largura ou altura para corresponder a largura ou a altura da vista principal. Para mais informaes sobre propriedades de layout, consulte o layout de guia.

Adicionar um campo de texto


Para criar um campo de texto editvel pelo usurio, adicionar um <EditText> elemento dentro do<LinearLayout> . Como toda Ver objeto, voc deve definir certos atributos XML para especificar o EditText propriedades do objeto. Aqui est como voc deve declar-lo dentro do <LinearLayout> elemento:
<EditText android: id = "@ + id / edit_message" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: dica = "@ string / edit_message" />

Sobre objetos de recurso


Um objeto de recurso simplesmente um nome inteiro nico que associado com um recurso de aplicativo, como um bitmap, arquivo de layout, ou string. Cada recurso possui um objeto de recurso correspondente definido no do seu projeto gen / R.java arquivo.Voc pode usar os nomes de objeto noR classe para se referir aos seus recursos, como quando voc precisa especificar um valor de string para oandroid: dica atributo. Voc tambm pode criar IDs de recursos arbitrrios que voc associa com vista usando o android: id atributo, que permite fazer referncia a esse ponto de vista a partir de outro cdigo. As ferramentas do SDK gerar o R.javacada vez que voc compilar o seu aplicativo. Voc nunca deve modificar este arquivo manualmente. Para mais informaes, leia o manual de Prestao de Recursos .

Sobre estes atributos:


android: id

Isto fornece um identificador exclusivo para a exibio, que pode ser usado para fazer referncia ao objeto de seu cdigo do aplicativo, como para ler e manipular o objeto (voc ver isso na prxima lio). O sinal de arroba ( @ ) necessria quando voc est se referindo a qualquer objeto de recurso do XML. seguido pelo tipo de recurso ( ID neste caso), uma barra, em seguida, o nome do recurso ( edit_message ). The sinal de mais ( + ) antes de o tipo de recurso apenas necessrio quando voc est a definio de um ID recurso para pela primeira vez. Quando voc compilar o aplicativo, as ferramentas do SDK usar o nome de ID para criar uma nova ID do recurso em seu projeto gen / R.java arquivo que se refere

ao EditText elemento. Uma vez que a identificao de recurso declarado uma vez que desta forma, outras referncias para a identificao no necessrio o sinal de mais. Usando o sinal de mais necessrio somente quando a especificao de um novo ID de recurso e no precisava de recursos concretos, tais como cordas ou layouts. Veja o sidebox para obter mais informaes sobre objetos de recurso.
android: layout_width e android: layout_height

Em vez de usar tamanhos especficos para a largura e altura, o "wrap_content" especifica que o valor de exibio deve ser apenas to grande quanto necessrio para ajustar o contedo da vista. Se voc fosse ao invs de usar "match_parent" , ento o EditText elemento que enche o ecr, porque iria coincidir com o tamanho do pai LinearLayout . Para mais informaes, consulte o Layouts guia.
android: dica

Esta uma seqncia de caracteres padro para exibir quando o campo de texto est vazio. Em vez de usar uma string codificada como o valor, o "@ string / edit_message" valor refere-se a um recurso de seqncia definido em um arquivo separado. Porque isso se refere a um recurso concreto (e no apenas um identificador), ele no precisa do sinal. No entanto, porque voc no definiu o recurso de cadeia, no entanto, voc ver um erro do compilador em primeiro lugar. Voc vai corrigir isso na prxima seo, definindo a string. Nota: Este recurso corda tem o mesmo nome que o elemento ID: edit_message . No entanto, as referncias a recursos so sempre por escopo o tipo de recurso (como ID ou corda ), portanto, usando o mesmo nome no causar colises.

Adicionar recursos de seqncia


Quando voc precisa adicionar texto na interface do usurio, voc deve sempre especificar cada corda como um recurso. Cadeia de Caracteres recursos permitem que voc para gerenciar todo o texto UI em um nico local, o que torna-lo mais fcil para localizar e atualizar de texto. Externalizao das cordas tambm permite localizar seu aplicativo para diferentes idiomas, fornecendo definies alternativas para cada recurso string. Por padro, o projeto Android inclui um arquivo de recurso de cadeia em res / valores / strings.xml .Adicionar uma nova seqncia chamado "edit_message" e defina o valor para "Digite uma mensagem." (Voc pode excluir o "hello_world" string). Enquanto voc est neste arquivo, adicione tambm uma string "Send" para o boto em breve voc vai adicionar, chamado "button_send" . O resultado para strings.xml parecido com este:
<? xml version = <resources> <Corda nome <Corda nome <Corda nome <Corda nome <Corda nome </ Resources> "1.0" encoding = "UTF-8" > = = = = = "app_name" > My First App </ string> "edit_message" > Digite uma mensagem </ string> "button_send" > Enviar </ string> "action_settings" > Configuraes </ string> "title_activity_main" > MainActivity </ string>

Para mais informaes sobre o uso de recursos de cadeia para localizar seu aplicativo para outros idiomas, consulte o Suporte de dispositivos diferentes classes.

Adicionar um boto
Agora adicione um <Button> ao layout, imediatamente aps a <EditText> elemento:
<Boto android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "@ string / button_send"

/>

A altura ea largura so definidos como "wrap_content" de modo que o boto to grande quanto necessrio para ajustar o texto do boto. Este boto no precisa do android: id atributo, porque ele no vai ser referenciada a partir do cdigo de atividade.

Faa a caixa de entrada Preencha a largura da tela


A disposio est concebida de modo que tanto o EditarTexto e Boto elementos so somente to grande quanto necessrio para ajustar o seu contedo, como mostrado na figura 2.

Figura 2. The EditText e Boto elementos tm suas larguras definidas para "wrap_content" .
Isso funciona bem para o boto, mas no to bem para o campo de texto, pois o usurio pode digitar algo mais.Ento, seria bom para preencher a largura da tela no utilizada com o campo de texto. Voc pode fazer isso dentro de um LinearLayout com o peso da propriedade, o que voc pode especificar usando o android: layout_weight atributo. O valor do peso um nmero que especifica a quantidade de espao restante cada vista deve consumir, em relao quantidade consumida por vises irmos. Isso funciona mais ou menos como a quantidade de ingredientes de uma receita da bebida: "2 partes de vodka, 1 parte de licor de caf" significa dois teros da bebida vodka. Por exemplo, se d uma exibir um peso de 2 e um outro com peso de 1, a soma 3, ento a primeira vista enche 2/3 do espao remanescente e o segundo ponto de vista enche o resto. Se voc adicionar um terceiro ponto de vista e dar-lhe um peso de 1, ento a primeira vista (com peso 2) agora fica 1/2 o espao restante, enquanto que os dois restantes se cada quarto. O peso padro para todos os pontos de vista 0, ento se voc especificar qualquer valor de peso maior que 0 a apenas um ponto de vista, ento, que a viso preenche o espao que permanece aps todas as opinies so dadas o espao de que necessitam. Assim, para preencher o espao restante em seu layout com o EditTextelemento, dar-lhe um peso de 1 e deixar o boto com nenhum peso.
<EditText android: layout_weight = "1" ... />

A fim de melhorar a eficincia da disposio quando se especificar o peso, deve alterar a largura daEditarTexto para ser zero (0DP). Definir a largura a zero porque melhora o desempenho esquema usando"wrap_content" como a largura requer que o sistema para calcular uma largura que em ltima anlise, porque o valor irrelevante de peso requer outro clculo largura para preencher o espao restante.
<EditText android: layout_weight = "1" android: layout_width = "0DP" ... />

A Figura 3 mostra o resultado quando atribuir todo o peso do EditarTexto elemento.

Figura 3. The EditText Widget dado todo o peso layout, assim preenche o espao restante
no LinearLayout .

Aqui est como o seu arquivo de layout completo agora deve ser:
<? xml version = "1.0" encoding = "UTF-8" > <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: Ferramentas = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: layout_height = "match_parent" android: orientao = "horizontal" > <EditText android: id = "@ + id / edit_message" android: layout_weight = "1" android: layout_width = "0DP" android: layout_height = "wrap_content" android: dica = "@ string / edit_message" /> <Boto android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "@ string / button_send" /> </ LinearLayout>

Este layout aplicado pelo padro Atividade classe que as ferramentas do SDK gerado quando voc criou o projeto, ento agora voc pode executar o aplicativo para ver os resultados:

Em Eclipse, clique em Executar

na barra de ferramentas.

Ou a partir de uma linha de comando, altere os diretrios para a raiz do seu projeto Android e executar:
ant debug adb install bin / MyFirstApp - debug . apk

Continue para a prxima lio para aprender como voc pode responder a pressiona o boto, ler o contedo do campo de texto, iniciar outra atividade, e muito mais.

Comeando outra atividade

ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Responder ao boto Enviar 2. Construir uma Intent 3. Comece a segunda atividade 4. Criar a segunda atividade 5. Receba o Intent 6. Mostrar a Mensagem

VOC TAMBM DEVE LER


Instalando o SDK

Depois de completar a lio anterior , voc tem um aplicativo que mostra uma atividade (uma nica tela), com um campo de texto e um boto. Nesta lio, voc vai adicionar algum cdigo para MainActivity que inicia uma nova atividade quando o usurio clica no boto Enviar.

Responder ao boto Enviar


Para responder a on-evento clique do boto, abrir aactivity_main.xml arquivo de layout e adicionar o android: onClick atributo <Button> elemento:
<Boto android: android: android: android:

layout_width = "wrap_content" layout_height = "wrap_content" text = "@ string / button_send" onClick = "sendMessage" />

O android: onClick valor do atributo, "sendMessage" , o nome de um mtodo em sua atividade que o sistema de chamadas quando o usurio clica no boto. Abra o MainActivity classe (localizados no projeto src / directory) e adicionar o mtodo correspondente:
/ ** Chamado quando o usurio clica no boto Enviar * / pblico vazio sendMessage ( Ver vista ) { / / Faz alguma coisa em resposta ao boto }

Isso requer que voc importar o Ver de classe:


importao android . vista . Ver ;

Dica: Em Eclipse, pressione Ctrl + Shift + O para importar classes em falta (Cmd + Shift + S no Mac). Para que o sistema para corresponder a esse mtodo para o nome do mtodo dado para android: onClick , a assinatura deve ser exatamente como mostrado. Especificamente, o mtodo deve:

Seja pblica Ter um valor de retorno void Ter uma Viso como o nico parmetro (este ser o Ver que foi clicado)

Em seguida, voc vai preencher este mtodo para ler o contedo do campo de texto e entregar o texto para outra atividade.

Construir uma Intent


Uma Inteno um objeto que fornece tempo de execuo de ligao entre os componentes separados (como duas atividades). A Inteno representa "a inteno de fazer alguma coisa." de um aplicativo Voc pode usar as intenes de uma grande variedade de tarefas, mas na maioria das vezes eles so usados para iniciar outra atividade. Dentro do sendMessage () mtodo, crie uma Inteno de iniciar uma atividade chamadaDisplayMessageActivity :
Inteno inteno = new Intent ( este , DisplayMessageActivity . classe );

O construtor usado aqui tem dois parmetros:


Um contexto como seu primeiro parmetro ( este usado porque a atividade de classe uma subclasse de Contexto ) A classe do componente de aplicao para o qual o sistema deve entregar a Inteno (neste caso, a actividade que deve ser iniciado)

O envio de uma inteno de outros aplicativos


A inteno criou nesta lio o que considerado uma inteno explcita , pois a inteno especifica o componente exato aplicativo ao qual deve ser dada a inteno. No entanto, as intenes tambm pode serimplcito , caso em que a intenono especifica do componente desejado, mas permite que qualquer aplicao instalado no dispositivo para responder inteno contanto que satisfaz as especificaes de meta-dados para a aco que est especificadas nas vrias Intenoparmetros. Para mais informaes, consulte a classe sobre Interagindo com outros Apps .

Nota: A referncia a DisplayMessageActivity ir gerar um erro se voc estiver usando uma IDE, como Eclipse, pois a classe ainda no existe. Ignore o erro de agora, voc vai criar a classe em breve. A inteno no s lhe permite iniciar outra atividade, mas pode levar um pacote de dados para a atividade tambm. Dentro dosendMessage () mtodo, use findViewById () para obter oEditText elemento e adicionar seu valor de texto com a inteno:
Inteno inteno = new Intent ( este , DisplayMessageActivity . classe ); EditText EDITTEXT = ( EditText ) findViewById ( R . id . edit_message ); Cordas mensagem = EDITTEXT . getText . () toString (); inteno . putExtra ( EXTRA_MESSAGE , mensagem );

Nota: Voc precisa agora instrues de importao paraandroid.content.Intent e android.widget.EditText .Voc vai definir o EXTRA_MESSAGE constante em um momento.

Uma Inteno pode levar uma coleo de vrios tipos de dados como pares de valores-chave chamado extras . O putExtra () mtodo leva o nome da chave no primeiro parmetro eo valor do segundo parmetro. Para que a prxima atividade para consultar os dados extras, voc deve definir a chave para o adicional de sua inteno atravs de um constante pblico. Ento adicionar o EXTRA_MESSAGE definio para o incio daMainActivity classe:
pblico classe MainActivity estende Activity { pblico final, static Cordas EXTRA_MESSAGE = ... }

"com.example.myfirstapp.MESSAGE" ;

Em geral, uma boa prtica para definir as chaves para extras inteno usando o nome do pacote do seu aplicativo como um prefixo. Isso garante que eles so nicos, no caso do seu aplicativo interage com outros apps.

Comece a segunda atividade


Para iniciar uma atividade, chamar startActivity () e pass-lo a sua inteno . O sistema recebe este chamado e inicia uma instncia da atividade especificada pelo Intent . Com este novo cdigo, a completa sendMessage () mtodo que chamado pelo boto Enviar agora se parece com isto:
/ ** Chamado quando o usurio clica no boto Enviar * / pblico vazio sendMessage ( Ver vista ) { Inteno inteno = new Intent ( este , DisplayMessageActivity . classe ); EditText EDITTEXT = ( EditText ) findViewById ( R . id . edit_message ); Cordas mensagem = EDITTEXT . getText . () toString (); inteno . putExtra ( EXTRA_MESSAGE , mensagem ); startActivity ( inteno ); }

Agora voc precisa criar o DisplayMessageActivity classe para que isso funcione.

Criar a segunda atividade

Figura 1. O novo assistente de atividade em Eclipse.

Para criar uma nova atividade usando Eclipse: 1. Clique em Novo na barra de ferramentas.

2. Na janela que aparece, abra o Androidpasta e selecione Atividade Android .Clique em Prxima . 3. Selecione BlankActivity e clique Prxima. 4. Preencha os dados de atividade:
o o o o o o

Projeto : MyFirstApp Atividade Nome : DisplayMessageActivity Nome de layout : activity_display_message Ttulo : Minha mensagem Pai hierrquica : com.example.myfirstapp.MainActivity Tipo de navegao : Nenhum

Clique em Concluir . Se voc estiver usando uma IDE diferente ou as ferramentas de linha de comando, crie um novo arquivo chamado DisplayMessageActivity.java no projeto src / diretrio, ao lado do originalMainActivity.java arquivo. Abra o DisplayMessageActivity.java arquivo. Se voc usou o Eclipse para criar esta atividade:

A classe j inclui uma implementao do requerido onCreate () mtodo. H tambm uma implementao do onCreateOptionsMenu () mtodo, mas voc no vai precisar dele para este aplicativo para que voc possa remov-lo. H tambm uma implementao de onOptionsItemSelected () que lida com o comportamento para o bar da ao Up comportamento. Mantenha esta do jeito que est.

Porque o ActionBar APIs esto disponveis apenas na FAVO DE MEL (API nvel 11) e superior, voc deve adicionar uma condio ao redor do getActionBar () mtodo para verificar a verso da plataforma atual.Alm disso, voc deve adicionar o @ SuppressLint ("NewApi") tag ao onCreate () mtodo para evitarfiapos erros. O DisplayMessageActivity classe deve agora olhar como este:
pblico classe DisplayMessageActivity estende Activity {

@ SuppressLint ( "NewApi" ) @ Override protegido vazio onCreate ( Bundle savedInstanceState ) { Super . onCreate ( savedInstanceState ); setContentView ( R . disposio . activity_display_message ); / / Certifique-se de que estamos rodando em Honeycomb ou superior para utilizar APIs ActionBar se ( Construir . VERSO . SDK_INT > = Envergadura . VERSION_CODES . FAVO DE MEL ) { / / Mostra o boto na barra de ao. getActionBar . () setDisplayHomeAsUpEnabled ( verdadeiro ); } } @ Override pblico boolean interruptor caso android NavUtils retornar } retornar de } } onOptionsItemSelected ( MenuItem artigo ) ( artigo . getItemId ()) { . R . id . casa : . navigateUpFromSameTask ( este ); verdadeiro ; super . onOptionsItemSelected ( artigo ); {

Se voc usou uma IDE diferente de Eclipse, atualize seu DisplayMessageActivity classe com o cdigo acima. Todas as subclasses de Atividade deve implementar a onCreate () mtodo. O sistema chama isso ao criar uma nova instncia da atividade. Este mtodo o lugar onde voc deve definir o layout da atividade com osetContentView () mtodo e o lugar onde voc deve executar a configurao inicial para os componentes de atividade. Nota: Se voc estiver usando uma IDE diferente de Eclipse, seu projeto no contm oactivity_display_message layout que solicitado pelo setContentView () . Tudo bem, porque voc vai atualizar este mtodo mais tarde e no estar usando esse layout.

Adicionar a corda ttulo


Se voc usou o Eclipse, voc pode pular para a prxima seo , porque o modelo fornece a seqncia de ttulo para a nova atividade. Se voc estiver usando uma IDE diferente de Eclipse, adicionar ttulo da nova atividade para o strings.xmlarquivo:
<resources> ... <Corda nome = "title_activity_display_message" > Minha Mensagem </ string> </ Resources>

Adicion-lo ao manifesto
Todas as atividades devem ser declarados no seu arquivo de manifesto AndroidManifest.xml , usando um<activity> elemento. Quando voc usa as ferramentas do Eclipse para criar a atividade, ele cria uma entrada padro. Se voc estiver usando uma IDE diferente, voc precisa adicionar a entrada de manifestar-se. Deve olhar como este:

<Aplicao ... > ... <Atividade android: name = "com.example.myfirstapp.DisplayMessageActivity" android: label = "@ string / title_activity_display_message" android: parentActivityName = "com.example.myfirstapp.MainActivity" <Meta-dados android: name = "android.support.PARENT_ACTIVITY" android: valor = "com.example.myfirstapp.MainActivity" /> </ Atividade> </ Application>

>

O android: parentActivityName atributo declara o nome da atividade do pai esta atividade dentro da hierarquia lgica do aplicativo. O sistema utiliza esse valor para implementar comportamentos padro de navegao, tais como navegao Up no Android 4.1 (API nvel 16) e superior. Voc pode fornecer os mesmos comportamentos de navegao para as verses mais antigas do Android usando a Biblioteca de Apoio e adicionando o <meta-data> elemento, como mostrado aqui. Nota: O seu SDK Android j deve incluir a mais recente Biblioteca de suporte Android. includo com o pacote ADT, mas se voc estiver usando uma IDE diferente, voc deve t-lo instalado durante os Adicionando Plataformas e Pacotes passo. Ao usar os modelos em Eclipse, a Biblioteca de Apoio automaticamente adicionado ao seu projeto de aplicativo (voc pode ver o arquivo JAR da biblioteca listada em Dependncias Android ). Se voc no estiver usando o Eclipse, voc precisa adicionar manualmente a biblioteca para o seu projeto de seguir o guia para a criao da Biblioteca de Apoio , em seguida, voltar aqui. Se voc est desenvolvendo com o Eclipse, voc pode executar o aplicativo agora, mas no acontece muita coisa. Clicando no boto Enviar comea a segunda atividade, mas ele usa um layout padro "Ol, mundo", previsto pelo modelo. Em breve voc vai atualizar a atividade a vez exibir uma visualizao de texto personalizado, por isso, se voc estiver usando uma IDE diferente, no se preocupe que o aplicativo ainda no ir compilar.

Receba o Intent
Cada atividade invocado por um Intent , independentemente de como o usurio navegou l. Voc pode obter o Intent que comeou sua atividade chamando getIntent () e recuperar os dados contidos nele. No DisplayMessageActivity da classe onCreate () mtodo, se a inteno e extrair a mensagem entregue pelo MainActivity :
Inteno inteno = getIntent (); Cordas mensagem = inteno . getStringExtra ( MainActivity . EXTRA_MESSAGE );

Mostrar a Mensagem
Para mostrar a mensagem na tela, crie um TextView widget e definir o texto usando setText () . Em seguida, adicione o TextView como a viso de raiz o layout da atividade, passando-a para setContentView () . A completa onCreate () mtodo para DisplayMessageActivity agora se parece com isto:

@ Override pblico vazio onCreate ( Bundle savedInstanceState ) Super . onCreate ( savedInstanceState );

/ / Pega a mensagem da inteno Inteno inteno = getIntent (); Cordas mensagem = inteno . getStringExtra ( MainActivity . EXTRA_MESSAGE ); / / Criar o ponto de vista do texto TextView textView = new TextView ( este ); textView . setTextSize ( 40 ); textView . setText ( mensagem ); / / Definir a viso de texto como o layout da atividade setContentView ( textView ); }

Agora voc pode executar o aplicativo. Quando se abre, digite uma mensagem no campo de texto, clique em Enviar, e aparece a mensagem na segunda atividade.

Figura 2. Ambas as atividades do aplicativo finais, em execuo no Android 4.0.

isso a, voc construiu seu primeiro aplicativo Android! Para saber mais sobre a criao de aplicativos para Android, continuar a seguir as aulas de formao bsica. A prxima turma est Gerenciando o Ciclo de Vida Atividade .

Gerenciando o Ciclo de Vida Atividade


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Como criar um projeto Android (vejaCriando um projeto Android )

VOC TAMBM DEVE LER


Atividades

EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip

Como um usurio navega atravs, de, e de volta para o seu aplicativo, as Atividade instncias na sua transio aplicativo entre os diferentes estados do seu ciclo de vida. Por exemplo, quando sua atividade iniciado pela primeira vez, ele vem para o primeiro plano do sistema e recebe o foco do usurio. Durante este processo, o sistema Android chama uma srie de mtodos de ciclo de vida na atividade em que voc configurar a interface do usurio e outros componentes. Se o usurio executa uma ao que comea uma outra atividade ou muda para outro aplicativo, o sistema chama um outro conjunto de mtodos de ciclo de vida em sua atividade, uma vez que se move para o fundo (onde a atividade no mais visvel, mas a instncia e seu estado permanece intacta ). Dentro dos mtodos de retorno de chamada do ciclo de vida, voc pode declarar como sua atividade se comporta quando as folhas de usurios e re-entra na atividade. Por exemplo, se voc est construindo um player de vdeo streaming, voc pode pausar o vdeo e terminar a conexo de rede quando o usurio muda para outro aplicativo. Quando o usurio retorna, voc pode ligar-se rede e permitir que o usurio reiniciar o vdeo a partir do mesmo local. Esta classe explica importantes mtodos de retorno de chamada do ciclo de vida que cada Atividadeinstncia recebe e como voc pode us-los para que sua atividade faz o que o usurio espera e no consome recursos do sistema quando sua atividade no precisa delas.

Lies

Iniciar uma Atividade Aprenda o bsico sobre o ciclo de vida de atividade, como o usurio pode lanar o seu aplicativo, e como realizar a criao atividade bsica. Pausar e retomar uma atividade Saiba o que acontece quando sua atividade interrompida (parcialmente escondido) e retomado eo que voc deve fazer durante estas mudanas de estado. Interrupo e reincio de actividade Saiba o que acontece quando o usurio deixa completamente sua atividade e retorna a ele. Recriando uma Atividade Saiba o que acontece quando sua atividade destruda e como voc pode reconstruir o estado de atividade, quando necessrio.

Iniciar uma Atividade


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Entenda os retornos do Ciclo de Vida 2. Especifique Lanador atividade do seu App 3. Criar uma nova instncia 4. Destrua o Activity

VOC TAMBM DEVE LER


Atividades

EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip

Ao contrrio de outros paradigmas de programao no qual os aplicativos so lanados com um main () mtodo, o sistema Android inicia cdigo em um Activity instncia invocando mtodos de retorno especficos que correspondem a fases especficas do seu ciclo de vida. H uma seqncia de mtodos de retorno de chamada que iniciam uma atividade e uma seqncia de mtodos de callback que derrubar uma atividade. Esta lio fornece uma viso geral dos mtodos de ciclo de vida mais importantes e mostra-lhe como lidar com a primeira chamada do ciclo de vida que cria uma nova instncia de sua atividade.

Entenda os retornos do Ciclo de Vida


Durante a vida de uma atividade, o sistema chama um conjunto bsico de mtodos de ciclo de vida em uma seqncia semelhante a uma pirmide de degraus. Ou seja, cada fase do ciclo de vida da atividade uma etapa separada na pirmide. Como o sistema cria uma nova instncia de atividade, cada mtodo de retorno move o estado de atividade um passo em direo ao topo. O topo da pirmide o ponto em que a atividade est sendo executado em primeiro plano eo usurio pode interagir com ele. medida que o usurio comea a deixar a atividade, o sistema chama outros mtodos que movem o estado de atividade de volta para baixo da pirmide, a fim de desmantelar a atividade. Em alguns casos, a atividade passar nica forma parte de baixo da pirmide e esperar (por exemplo, quando o usurio muda para outro app), de que ponto a atividade pode se mover de volta ao topo (se o usurio retorna atividade) e currculo onde o usurio parou.

Figura 1. uma ilustrao simplificada do ciclo de vida Actividade expressa como uma pirmide passo. Isto mostra como, para cada callback usado para levar a atividade um passo em direo ao estado retomado no topo, h um mtodo de retorno que leva a atividade um passo para baixo. A atividade tambm pode retornar ao estado retomada a partir do estado de pausa e parou.

Dependendo da complexidade de sua atividade, voc provavelmente no precisa implementar todos os mtodos do ciclo de vida. No entanto, importante que voc entenda cada um e implementar as que asseguram o seu aplicativo se comporta da maneira como os usurios esperam. Implementar os seus mtodos de ciclo de vida de atividade corretamente garante que o seu aplicativo se comporta bem em vrias formas, incluindo que:

No falhar se o usurio recebe uma chamada de telefone ou muda para outro aplicativo enquanto estiver usando o aplicativo. No consome recursos valiosos do sistema, quando o usurio no est usando ativamente. No perder o progresso do usurio se ele deixar o seu aplicativo e retornar a ele em um momento posterior. No falhar ou perder o progresso do usurio quando a tela gira entre a orientao horizontal e vertical.

Como voc vai aprender as seguintes lies, h vrias situaes em que uma atividade transies entre diferentes estados que esto ilustrados na figura 1. No entanto, apenas trs destes estados pode ser esttico.Ou seja, a actividade pode existir em uma de apenas trs estados, por um perodo de tempo prolongado: Retomado Neste estado, a atividade est em primeiro plano eo usurio pode interagir com ele. (Tambm por vezes referido como o estado "running"). Pausada Neste estado, a atividade parcialmente obscurecida por outra atividade a outra atividade que est em primeiro plano semi-transparente ou no cobrir a tela inteira. A atividade fez uma pausa no recebe entrada do usurio e no pode executar qualquer cdigo. Parado Neste estado, a actividade est completamente oculto e no visvel para o utilizador, que considerado no fundo. Enquanto est parado, a instncia de atividade e toda a sua informao de estado, tais como variveis membro mantido, mas no pode executar qualquer cdigo. Os outros estados (criado e iniciado) so transitrios eo sistema se move rapidamente a partir deles para o prximo estado, chamando o prximo mtodo de retorno de chamada do ciclo de vida. Isto , depois de o sistema chama onCreate () , rapidamente chama onStart () , que rapidamente seguido por onResume ().

Isso tudo para o ciclo de vida atividade bsica. Agora voc vai comear a aprender sobre alguns dos comportamentos especficos do ciclo de vida.

Especifique Lanador atividade do seu App


Quando o usurio seleciona o cone do aplicativo na tela inicial, o sistema chama o onCreate () mtodo para a Atividade em seu aplicativo que voc tenha declarado ser o "lanador" (ou "principal") atividade. Esta a atividade que serve como ponto de entrada principal para a interface de usurio do aplicativo. Voc pode definir qual a atividade a ser usado como principal atividade o arquivo de manifesto Android,AndroidManifest.xml , que est na raiz do diretrio do seu projeto. A principal atividade para sua aplicao deve ser declarado no manifesto com um <intentfilter> que inclui o MAIN ao e LAUNCHER categoria. Por exemplo:
<Atividade android: name = "MainActivity." android: label = "@ string / app_name" > <intent-filter> <Ao android: name = "android.intent.action.MAIN" /> <Categoria android: name = "android.intent.category.LAUNCHER" /> </ Intent-filter> </ Atividade>

Nota: Quando voc cria um novo projeto Android com as ferramentas do Android SDK, os arquivos de projeto padro incluem uma atividade de classe que declarada no manifesto com este filtro. Se tanto o MAIN ao ou LAUNCHER categoria no so declarados para uma de suas atividades, em seguida, o cone do aplicativo no aparecer na lista da tela principal de apps.

Criar uma nova instncia

A maioria dos aplicativos incluem diversas atividades que permitem ao usurio realizar aes diferentes. Se uma atividade a principal atividade que criado quando o usurio clica no cone do aplicativo ou uma atividade diferente que seu aplicativo iniciado em resposta a uma ao do usurio, o sistema cria a cada nova instncia de Atividade chamando seu onCreate () mtodo. Voc deve implementar o onCreate () mtodo para executar a lgica de inicializao do aplicativo bsico que deve acontecer apenas uma vez durante toda a vida da atividade. Por exemplo, a implementao de onCreate () deve definir a interface do usurio e, possivelmente, instanciar algumas variveis de escopo de classe. Por exemplo, o exemplo a seguir do onCreate () mtodo mostra um cdigo que executa alguma configurao fundamental para a atividade, como declarar a interface do usurio (definido em um arquivo de layout XML), definindo as variveis de membro, e configurar algumas das UI.

TextView mTextView ;

/ / Membro varivel para exibio de texto no layout {

@ Override pblico vazio onCreate ( Bundle savedInstanceState ) Super . onCreate ( savedInstanceState );

/ / Definir o layout da interface de usurio para esta atividade / / O arquivo de layout definido no projeto res / layout / arquivo main_activity.xml setContentView ( R . disposio . main_activity ); / / Inicializar membro TextView para que possamos manipul-lo mais tarde mTextView = ( TextView ) findViewById ( R . id . text_message ); / / Certifique-se de que estamos rodando em Honeycomb ou superior para utilizar APIs ActionBar se ( Construir . VERSO . SDK_INT > = Envergadura . VERSION_CODES . FAVO DE MEL ) { / / Para a atividade principal, certifique-se o cone do aplicativo na barra de ao / / No se comporta como um boto ActionBar ActionBar = getActionBar (); ActionBar . setHomeButtonEnabled ( falso ); } }

Ateno: Usando o SDK_INT para evitar que o sistema mais velho de de executar novas APIs funciona dessa maneira no Android 2.0 (API nvel 5) e superior. As verses mais antigas vo encontrar uma exceo de tempo de execuo. Uma vez que o onCreate () termina a execuo, o sistema chama o ONSTART () e onResume () mtodos em rpida sucesso. Sua atividade no reside nos estados criados ou iniciados. Tecnicamente, a atividade se torna visvel para o usurio quando onStart () chamado, mas onResume () segue rapidamente ea atividade permanece no estado de retomada at que algo acontece para mudar isso, como quando uma chamada recebida, o usurio navega para outra atividade, ou a tela do dispositivo desliga-se. Nas outras lies que se seguem, voc vai ver como a outra start up mtodos, onStart () e onResume () , so teis durante o ciclo de vida de sua atividade quando usado para retomar a atividade dos interrompido ou parado estados. Nota: O onCreate () mtodo inclui um parmetro chamado savedInstanceState que discutido na ltima lio sobre Recriando uma atividade .

Figura 2. Outra ilustrao da estrutura de ciclo de vida de atividade, com nfase em trs principais callbacks que o sistema chama em seqncia ao criar uma nova instncia da atividade: OnCreate () , ONSTART () , e onResume (). Uma vez que essa seqncia de chamadas de retorno completo, a atividade atinge o estado Resumido onde os usurios podem interagir com a atividade at que se mudar para uma atividade diferente.

Destrua o Activity
Enquanto a primeira chamada do ciclo de vida da atividade onCreate () , seu ltimo retorno onDestroy () . O sistema chama este mtodo em sua atividade como o ltimo sinal de que o seu exemplo atividade est sendo completamente removido da memria do sistema. A maioria dos aplicativos no precisam implementar este mtodo, porque as referncias de classe locais so destrudos com a atividade e sua atividade deve executar a maioria de limpeza durante onPause () e onStop () . No entanto, se sua atividade inclui tpicos de fundo que voc criou durante onCreate () ou outros recursos de longa durao que poderiam vazar memria se no for devidamente fechado, voc deve mat-los durante onDestroy () .
@ Override pblico vazio onDestroy () { Super . onDestroy (); / / Sempre chamar a superclasse / / Stop mtodo de rastreamento que a atividade comeou durante onCreate () android . sistema operacional . Debug . stopMethodTracing (); }

Nota: O sistema chama onDestroy () depois que ele j chamou onPause () e onStop () em todas as situaes, exceto um: quando voc chamar acabamento () de dentro do onCreate () mtodo. Em alguns casos, como quando sua atividade funciona como um tomador de deciso temporria para lanar uma outra atividade, voc pode chamar de acabamento () de dentro do onCreate () para destruir a atividade. Neste caso, o sistema chama imediatamente onDestroy () sem chamar qualquer um dos outros mtodos de ciclo de vida.

Pausar e retomar uma atividade


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Pausa sua atividade 2. Retomar a sua atividade

VOC TAMBM DEVE LER


Atividades

EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip

Durante a utilizao normal, app, a actividade do primeiro plano , por vezes, obstruda por outros componentes visuais que provocam a actividade de pausa . Por exemplo, quando uma atividade semi-transparente abre (como uma no estilo de um dilogo), a atividade anterior pausas. Enquanto a atividade ainda parcialmente visvel, mas atualmente no a atividade em foco, permanece interrompida. No entanto, uma vez que a atividade totalmente obstruda e no visvel, ele pra (que ser discutido na prxima lio). Como sua atividade entra no estado de pausa, o sistema chama o onPause () mtodo em sua atividade , o que permite parar aces em curso que no deve continuar durante a pausa (como um vdeo) ou persistir alguma informao que deve ser permanentemente salvo em caso o usurio continua a deixar seu aplicativo. Se o usurio retorna sua atividade a partir do estado de pausa, o sistema reinicia-lo e chama oonResume () mtodo. Nota: Quando a sua atividade recebe uma chamada para onPause () , pode ser uma indicao de que a atividade ser interrompida por um momento, o usurio pode retornar o foco sua atividade. No entanto, geralmente a primeira indicao de que o usurio est deixando sua atividade.

Figura 1. Quando uma atividade semi-transparente obscurece sua atividade, o sistema chama onPause () ea atividade de espera no estado de pausa (1). Se o usurio retorna atividade enquanto ele ainda est em pausa, o sistema chamaonResume () (2).

Pausa sua atividade


Quando o sistema chama onPause () para sua atividade, que tecnicamente significa que sua atividade ainda parcialmente visvel, mas na maioria das vezes uma indicao de que o usurio est deixando a atividade e vai em breve entrar no estado parado. Normalmente voc deve usar o onPause () callback para:

Pare de animaes ou outras aces em curso que poderiam consumir CPU. Confirmar as alteraes no salvas, mas apenas se os usurios esperam que essas mudanas sejam permanentemente salvo quando saem (como um projecto de e-mail). Liberar recursos do sistema, tais como receptores de radiodifuso, alas para sensores (como GPS), ou quaisquer recursos que possam afetar a vida til da bateria, enquanto sua atividade interrompida eo usurio no precisa delas.

Por exemplo, se o seu aplicativo usa a cmera , o onPause () mtodo um bom lugar para liber-lo.
@ Override pblico vazio onPause () { super . onPause (); / / Sempre chamar o mtodo da superclasse primeiro / / Solte a cmera, porque ns no precisamos dele quando fez uma pausa . / / e outras atividades pode precisar us-lo se ( mCamera ! = NULL ) { mCamera . lanamento () mCamera = nulo ; } }

Geralmente, voc deve no usar onPause () para armazenar as alteraes do usurio (como informaes pessoais inseridas em um formulrio) para armazenamento permanente. A nica vez que voc deve manter as alteraes do usurio para armazenamento permanente dentro onPause () quando voc tem certeza de que os usurios esperam que as alteraes sejam salvas automaticamente (como na elaborao de um e-mail). No entanto, deve-se evitar a realizao de trabalhos CPU-intensivo durante onPause () , como escrever para um banco de dados, porque pode atrasar a transio visvel para a prxima atividade (voc deveria executar operaes de desligamento de carga pesada durante onStop () ). Voc deve manter a quantidade de operaes realizadas no onPause () mtodo relativamente simples, a fim de permitir uma transio rpida para o prximo destino do usurio se sua atividade est realmente a ser interrompido. Nota: Quando a atividade estiver em pausa, o Activity instncia mantida residente na memria e recordase quando a atividade recomea. Voc no precisa re-inicializar os componentes que foram criados durante qualquer um dos mtodos de retorno de chamada que antecederam o estado retomado.

Retomar a sua atividade


Quando o usurio retoma suas atividades a partir do estado de pausa, o sistema chama o onResume ()mtodo.

Esteja ciente de que o sistema chama este mtodo cada vez que sua atividade vem para o primeiro plano, inclusive quando ele criado pela primeira vez. Como tal, voc deve implementar onResume () para inicializar os componentes que liberam durante onPause () e executar outras inicializaes que devem ocorrer cada vez que a atividade entra no estado de Retomada (como comear animaes e inicializar os componentes utilizados apenas quando a atividade tem usurio Focus). O exemplo a seguir de onResume () a contrapartida do onPause () exemplo acima, ento ele inicializa a cmera que liberado quando a atividade interrompida.
@ Override pblico vazio onResume () { super . onResume (); / / Sempre chamar o mtodo da superclasse primeiro / / Pega o exemplo da cmera como a atividade alcana foco total do usurio se ( mCamera == nulo ) { initializeCamera (); / / local mtodo para lidar com cmera de inicializao } }

Interrupo e reincio de actividade


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Pare de sua atividade 2. Start / Restart sua atividade

VOC TAMBM DEVE LER


Atividades

EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip

Devidamente parar e reiniciar sua atividade um processo importante no ciclo de vida da atividade que garante que seus usurios percebem que seu aplicativo est sempre vivo e no perder o seu progresso. Existem alguns cenrios principais em que a sua actividade parado e reiniciado:

O usurio abre a janela e muda a partir de seu aplicativo para outro aplicativo Apps Recentes. A atividade em seu aplicativo que est atualmente em primeiro plano est parado. Se o usurio retorna para o seu aplicativo a partir do cone da tela inicial lanador ou a janela Apps recentes, a atividade reiniciado. O usurio executa uma ao em seu aplicativo que inicia uma nova atividade. A atividade atual interrompido quando a segunda atividade criada. Se o usurio pressiona a volta do boto, a primeira atividade reiniciado. O usurio recebe um telefonema durante o uso do aplicativo em seu telefone.

A Atividade classe fornece dois mtodos de ciclo de vida, onStop () e onRestart () , que permitem lidar especificamente como sua atividade alas de ser parado e reiniciado. Ao contrrio do estado de pausa, o que

identifica uma obstruo parcial da interface do usurio, o estado parado garante que a interface do usurio no mais visvel e foco do usurio est em uma atividade separada (ou um aplicativo totalmente separado). Nota: Como o sistema mantm sua atividade instncia na memria do sistema quando ele est parado, possvel que voc no precisa para implementar o onStop () e onRestart () (ou mesmo onStart ()mtodos de todo Para a maioria das atividades que so. relativamente simples, a atividade vai parar e reiniciar muito bem e talvez voc s precisa usar onPause () s aces em curso pausa e desligue a partir de recursos do sistema.

Figura 1. Quando o usurio deixa a sua atividade, o sistema chama onStop () para interromper a atividade (1). Se o utilizador retorna ao passo que a actividade est parado, o sistema chama onRestart () (2), rapidamente seguido poronStart () (3) e onResume () (4). Note-se que no importa o cenrio faz com que a atividade de parar, o sistema chama sempre onPause () antes de chamar onStop () .

Pare de sua atividade


Quando sua atividade recebe uma chamada para o onStop () mtodo, ele no mais visvel e deve liberar quase todos os recursos que no so necessrios enquanto o usurio no est usando. Uma vez que sua atividade interrompida, o sistema pode destruir a instncia se ele precisa recuperar a memria do sistema. Em casos extremos, o sistema pode simplesmente matar o seu processo de aplicao sem chamar final da atividade onDestroy () callback, por isso importante que voc use onStop () para liberar recursos que podem vazamento de memria. Embora o onPause () mtodo chamado antes onStop () , voc deve usar onStop () para realizar intensivos desligamento operaes maiores, mais CPU, como gravar informaes em um banco de dados. Por exemplo, aqui est uma implementao do onStop () que salva o contedo de um projecto de nota para armazenamento persistente:
@ Override protegido vazio onStop () { super . onStop (); / / Sempre chamar o mtodo da superclasse primeiro / / Salvar rascunho atual da nota, porque a atividade est parando / / e ns queremos ter certeza que o atual progresso nota no

. A URI para a nota para atualizar os valores , / / O mapa de nomes de colunas e novos valores para aplicar a eles. nulo , / / no so utilizados critrios SELECT. nulo / / No ONDE colunas so usadas. ); }

Quando sua atividade interrompida, a atividade objeto mantido residente na memria e recorda-se quando a atividade recomea. Voc no precisa re-inicializar os componentes que foram criados durante qualquer um dos mtodos de retorno de chamada que antecederam o estado retomado. O sistema tambm controla o estado atual de cada Ver no layout, por isso, se o usurio digitou texto em um EditText widget, que o contedo retido para que voc no precisa para salvar e restaurar. Nota: Mesmo que o sistema destri a sua actividade enquanto ele est parado, ele ainda mantm o estado das Exibir objetos (como o texto em um EditText ) em um Bundle (uma bolha de pares chave-valor) e restaura-se o usurio navega de volta para a mesma instncia da atividade (a prxima lio fala mais sobre o uso de um pacote para salvar outros dados do estado no caso de sua atividade destrudo e recriado).

Start / Restart sua atividade


Quando sua atividade de volta para o primeiro plano do estado parado, ele recebe uma chamada paraonRestart () . O sistema tambm chama a onStart () mtodo, o que acontece cada vez que sua atividade se torna visvel (se a ser reiniciado ou criado pela primeira vez). O onRestart () mtodo, no entanto, chamado apenas quando a atividade retomada a partir do estado parado, de modo que voc pode us-lo para realizar o trabalho de restaurao especial que pode ser necessrio somente se a atividade foi interrompido anteriormente, mas no destrudos. raro que um aplicativo precisa usar onRestart () para restaurar o estado da atividade, de modo que no h qualquer orientao para este mtodo que se aplicam populao em geral de apps. No entanto, porque o seuonStop () mtodo deve essencialmente limpar todos os recursos de sua atividade, voc vai precisar reinstanciar-los quando a atividade reiniciado. No entanto, voc tambm precisa instanciar-los quando sua atividade criada pela primeira vez (quando no h nenhuma instncia existente da atividade). Por esta razo, voc deve geralmente usar o onStart () mtodo de retorno como a contrapartida do onStop () mtodo, porque o sistema chama onStart () , tanto quando ele cria sua atividade e quando ele reinicia a atividade do estado parado. Por exemplo, porque o usurio poderia ter sido afastado de sua aplicao por um longo tempo antes de voltar para ele, o onStart () mtodo um bom lugar para verificar se os recursos de sistema necessrios esto habilitados:
@ Override protegido vazio onStart () { super . onStart (); / / Sempre chamar o mtodo da superclasse primeiro / / A atividade ou est sendo reiniciado ou iniciado pela primeira vez / / de modo que este o lugar onde devemos nos certificar de que o GPS

Criar um dilogo aqui que solicita ao usurio habilitar GPS, e usar uma inteno / / com a ao android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS / / para levar o usurio para a tela de configuraes para permitir GPS ao clicar em "OK" } } @ Substituir protegido vazio onRestart () { super . onRestart (); / / Sempre chamar o mtodo da superclasse primeiro / / atividade a ser reiniciado a partir do estado parado }

Quando o sistema destri sua atividade, ele chama o onDestroy () mtodo para a sua atividade . Porque geralmente voc deve ter liberado a maioria de seus recursos com onStop () , no momento em que voc recebe uma chamada para onDestroy () , no h muito que a maioria dos aplicativos precisa fazer. Este mtodo a sua ltima chance para limpar recursos que poderiam levar a um vazamento de memria, ento voc deve ter certeza de que segmentos adicionais so destrudas e outras aes de longa durao, como mtodo de rastreamento tambm esto parados.

Recriando uma Atividade


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Salve o seu estado de atividade 2. Restaurar seu estado de atividade

VOC TAMBM DEVE LER


Apoiar telas diferentes Tratamento de alteraes de tempo de execuo Atividades

Existem algumas situaes em que sua atividade destruda devido a um comportamento normal aplicativo, como quando o usurio pressiona o Voltar boto ou sua atividade sinaliza sua prpria destruio, chamando acabamento () . O sistema tambm pode destruir a sua actividade se est atualmente parado e no foi usado em um longo perodo de tempo ou primeiro plano a atividade requer mais recursos para que o sistema deve desligar os processos de fundo para recuperar a memria. Quando sua atividade destruda porque o usurio pressionaVoltar ou a atividade termina em si, o conceito de que o sistema de Atividade exemplo, se foi para sempre, porque o comportamento indica que a atividade no mais necessrio. No entanto, se o sistema destri a atividade devido a restries do sistema (ao invs de um comportamento normal app), em seguida, embora o realAtividade exemplo, se foi, o sistema lembra que existia de modo que se o usurio navega de volta para ele, o sistema cria uma nova instncia da actividade, utilizando um conjunto de dados gravados, que descreve o estado da actividade quando foi destrudo. Os dados guardados que o sistema usa para restaurar o estado anterior chamado de "estado da instncia", e uma coleo de pares chave-valor armazenados em um Bundleobjeto. Ateno: Sua atividade ser destrudo e recriado cada vez que o usurio gira a tela. Quando a mudana de orientao da tela, o sistema destri e recria a atividade de plano porque a configurao da tela mudou e sua atividade pode precisar carregar recursos alternativos (tais como o layout).

Por padro, o sistema usa o Bundle estado da instncia para guardar informaes sobre cada Ver objeto em seu layout atividade (como o valor do texto inserido em um EditText objeto). Assim, se sua instncia de atividade destrudo e recriado, o estado do layout restaurado ao seu estado anterior com nenhum cdigo exigido por voc. No entanto, sua atividade pode ter mais informaes sobre o estado que voc gostaria de restaurar, como variveis membros que acompanham o progresso do usurio na atividade. Nota: Para que o sistema Android para restaurar o estado dos pontos de vista em sua atividade, cada vista deve ter uma identificao nica , fornecida pelo android: id atributo. Para salvar dados adicionais sobre o estado de atividade, voc deve substituir o onSaveInstanceState ()mtodo de callback. O sistema chama este mtodo quando o usurio est deixando sua atividade e passa oBundle objeto que ser salvo no caso em que sua atividade destruda de forma inesperada. Se o sistema deve recriar a instncia de atividade mais tarde, ele passa o mesmo Bundle objeto tanto para oonRestoreInstanceState () e onCreate () mtodos.

Figura 2. medida que o sistema comea a parar a sua atividade, ele chama onSaveInstanceState () (1), assim voc pode especificar os dados de estado adicionais que voc gostaria de salvar no caso da Atividade instncia deve ser recriada. Se a actividade destruda e o mesmo deve ser recriado exemplo, o sistema transfere os dados de estado definidos em (1) tanto o onCreate () mtodo (2) e o onRestoreInstanceState () mtodo (3).

Salve o seu estado de atividade


Como sua atividade comea a parar, o sistema chama onSaveInstanceState () para que sua atividade pode salvar as informaes de estado com uma coleo de pares chave-valor. A implementao padro desse mtodo salva informaes sobre o estado de hierarquia de vista da atividade, como o texto em um EditTextwidget ou a posio de rolagem de um ListView . Para salvar as informaes de estado adicional para a sua atividade, voc deve implementaronSaveInstanceState () e adicionar pares chave-valor para o pacote de objeto. Por exemplo:

Salve o jogo atual do usurio

Sempre chamar a superclasse para que ele possa salvar a exibio hierarquia estado de super . onSaveInstanceState ( savedInstanceState ); }

Ateno: Sempre chamar a implementao de superclasse onSaveInstanceState () para a implementao padro pode salvar o estado da hierarquia de vista.

Restaurar seu estado de atividade


Quando sua atividade recriada depois de ter sido anteriormente destruda, voc pode recuperar seu estado salvo da Bundle que o sistema passa sua atividade. Tanto o OnCreate () e onRestoreInstanceState ()mtodos de retorno de receber o mesmo pacote que contm as informaes de estado da instncia. Porque o onCreate () mtodo chamado se o sistema est criando uma nova instncia de sua atividade ou recriar uma anterior, voc deve verificar se o estado Bundle nulo antes de tentar l-lo. Se for nulo, ento o sistema est criando uma nova instncia da atividade, em vez de restaurar um anterior que foi destrudo. Por exemplo, aqui est como voc pode restaurar alguns dados estaduais no onCreate () :
@ Override protegido vazio onCreate ( Bundle savedInstanceState ) { super . onCreate ( savedInstanceState ); / / Sempre chamar a superclasse primeiro / / Verifica se estamos recriando uma instncia anteriormente destrudo se ( savedInstanceState =! nulo ) { / / Restaurar valor dos membros de salva

Provavelmente inicializar os membros com valores padro para uma nova instncia } ... }

Em vez de restaurar o estado durante onCreate () voc pode optar por implementaronRestoreInstanceState () , que o sistema chama aps a onStart () mtodo. O sistema chamaonRestoreInstanceState () somente se houver um estado salvo para restaurar, assim voc no precisa verificar se o pacote nulo:
pblico vazio onRestoreInstanceState ( Bundle savedInstanceState ) { / / Sempre chamar a superclasse para que ele possa restaurar a vista hierarquia de super . onRestoreInstanceState ( savedInstanceState ); / / Restaurar estados membros da salva

Ateno: Sempre chamar a implementao de superclasse onRestoreInstanceState () para a implementao padro pode restaurar o estado da hierarquia de vista. Para saber mais sobre recriando sua atividade devido a um evento restart em tempo de execuo (como quando a tela gira), leia Tratamento de alteraes de tempo de execuo .

Apoiar diferentes dispositivos


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 1.6 ou superior

VOC TAMBM DEVE LER


Recursos de Aplicativo Projetando para mltiplas telas

Dispositivos Android vm em muitos formas e tamanhos em todo o mundo. Com uma ampla gama de tipos de dispositivos, voc tem a oportunidade de alcanar uma audincia enorme com o seu aplicativo. Para ser to bem sucedido quanto possvel no Android, o aplicativo precisa se adaptar a vrias configuraes do dispositivo. Algumas das variaes importantes que voc deve considerar incluem lnguas diferentes tamanhos de tela e verses da plataforma Android. Esta classe ensina como usar os recursos de plataforma bsica que aproveitam recursos alternativos e outras caractersticas que o seu aplicativo pode fornecer uma experincia de usurio otimizada em uma variedade de dispositivos compatveis com o Android, usando um pacote nico aplicativo (APK).

Lies
Apoiar diferentes idiomas Aprenda a suportar vrios idiomas com recursos de cadeia alternativas. Apoiar telas diferentes Saiba como otimizar a experincia do usurio para diferentes tamanhos de tela e densidades. Apoiar diferentes verses da plataforma Aprenda a usar APIs disponveis em novas verses do Android, continuando a apoiar as verses mais antigas do Android.

Apoiar diferentes idiomas


ANTERIORPRXIMA

ESTA CLASSE ENSINA A


1. Criar Diretrios Local e arquivos de cordas 2. Use os recursos de seqncia

VOC TAMBM DEVE LER


Checklist localizao Localizao com Recursos

sempre uma boa prtica para extrair seqncias de interface do usurio a partir de seu cdigo de aplicativo e mant-los em um arquivo externo. Android torna isso fcil com um diretrio de recursos em cada projeto Android.

Se voc criou seu projeto usando o Android SDK Tools (leiaCriando um projeto Android ), as ferramentas de criar um res /diretrio do nvel superior do projeto. Dentro desta res /diretrio so subdiretrios para vrios tipos de recursos. H tambm alguns arquivos padro, como res / valores / strings.xml , que detm os seus valores de seqncia.

Criar Diretrios Local e arquivos de cordas


Para adicionar suporte para mais idiomas, criar adicionais valores diretrios dentro de res / que incluem um hfen eo cdigo do pas ISO no final do nome do diretrio. Por exemplo, os valores-es / o diretrio que contm resourcess simples para as localidades com o cdigo de linguagem "es". Android carrega os recursos apropriados de acordo com as configuraes de localidade do dispositivo em tempo de execuo. Uma vez que voc tenha decidido sobre os idiomas que voc vai apoiar, criar os subdiretrios de recursos e arquivos de recurso de cordas. Por exemplo:
MyProject / res / valores / strings.xml valores-es / strings.xml valores-fr / strings.xml

Adicionar os valores de cadeia para cada localidade para o arquivo apropriado. Em tempo de execuo, o sistema Android utiliza o conjunto apropriado de recursos de cadeia com base na localidade atualmente definido para o dispositivo do usurio. Por exemplo, a seguir esto alguns arquivos de recursos de cordas diferentes para diferentes idiomas. Ingls (locale padro) / valores / strings.xml :
<? xml version = "1.0" encoding = "UTF-8" > <resources> <corda nome = "title" > My Application </ string> <corda nome = "hello_world" > Ol Mundo! </ string> < / resources>

Espanhol, / values-es/strings.xml :
<? xml version = "1.0" encoding = "UTF-8" > <resources> <corda nome = "title" > Mi Aplicacin </ string> <corda nome = "hello_world" > Hola Mundo! </ string> < / resources>

Francs, / values-fr/strings.xml :

<? xml version = "1.0" encoding = "UTF-8" > <resources> <corda nome = "title" > Aplicao Mon </ string> <corda nome = "hello_world" > Bonjour le monde! </ string> </ resources>

Nota: Voc pode usar o qualificador localidade (ou qualquer qualificador de configurao) em qualquer tipo de recurso, como se voc deseja fornecer verses localizadas do seu drawable bitmap. Para mais informaes, consulte Localizao .

Use os recursos de seqncia


Voc pode consultar seus recursos de cordas em seu cdigo-fonte e outros arquivos XML usando o nome do recurso definido pelo <string> do elemento nome do atributo. Em seu cdigo-fonte, voc pode se referir a um recurso de seqncia com a sintaxe R.string. <string_name> . H uma variedade de mtodos que aceitam um recurso de cadeia desta maneira. Por exemplo:
/ / Pega um recurso de seqncia de de seu aplicativo de Recursos Cordas Ol = getResources () . getString ( R . corda . hello_world ); / / ou fornecer um recurso de seqncia de um mtodo que requer uma seqncia TextView textView = new TextView ( este ); textView . setText ( R . corda . hello_world );

Em outros arquivos XML, voc pode se referir a um recurso de seqncia com a sintaxe @ string / <string_name> sempre que o atributo XML aceita um valor string. Por exemplo:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />

Apoiar telas diferentes


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Criar diferentes layouts 2. Criar diferentes bitmaps

VOC TAMBM DEVE LER


Projetando para mltiplas telas Dando Suporte a Mltiplos ecrs

Iconografia guia de design

Android categoriza telas de dispositivos usando duas propriedades gerais: tamanho e densidade. Voc deve esperar que seu aplicativo ser instalado em dispositivos com telas que variam em tamanho e densidade. Como tal, voc deve incluir alguns recursos alternativos que otimizam a aparncia do seu aplicativo para diferentes tamanhos de tela e densidades.

H quatro tamanhos generalizadas: pequeno, normal, grande, extra grande E quatro densidades generalizadas: baixo (LDPI), mdio (MDPI), alto (hdpi), altas adicional (xhdpi)

Para declarar diferentes layouts e bitmaps que voc gostaria de usar para telas diferentes, voc deve colocar esses recursos alternativos em diretrios separados, semelhante forma como voc faz para cordas diferentes idiomas. Tambm estar ciente de que a orientao telas (paisagem ou retrato) considerado uma variao do tamanho da tela, tantos aplicativos devem revisar o layout para otimizar a experincia do usurio em cada orientao.

Criar diferentes layouts


Para otimizar a experincia do usurio em diferentes tamanhos de tela, voc deve criar um arquivo XML de layout exclusivo para cada tamanho de tela que voc deseja oferecer suporte. Cada layout deve ser salvo no diretrio de recursos adequados, nomeada com um - <screen_size> sufixo. Por exemplo, um layout exclusivo para telas grandes devem ser guardados em res / layout-large / . Nota: Android automaticamente escalas sua disposio, a fim de encaixar corretamente na tela. Assim, os seus layouts para diferentes tamanhos de tela no precisa se preocupar com o tamanho absoluto dos elementos de interface do usurio, mas em vez disso se concentrar na estrutura de layout que afeta a experincia do usurio (como o tamanho ou a posio de importantes vistas em relao s opinies de irmos). Por exemplo, o projeto inclui um layout padro e um layout alternativo para as grandes telas:
MyProject / res / layout / main.xml layout grande / main.xml

Os nomes de arquivo devem ter exatamente o mesmo, mas os seus contedos so diferentes, a fim de fornecer uma interface de usurio otimizada para o tamanho da tela correspondente. Basta consultar o arquivo de layout em seu aplicativo, como de costume:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }

O sistema carrega o arquivo de layout do diretrio de layout apropriado com base no tamanho da tela do dispositivo em que o aplicativo est sendo executado. Mais informaes sobre como Android seleciona o recurso apropriado disponvel no Recursos Fornecer guia. Como outro exemplo, aqui est um projecto com uma disposio alternativa para orientao paisagem:
MyProject / res / layout / main.xml layout da terra / main.xml

Por padro, o layout / main.xml arquivo usado para orientao retrato. Se voc deseja fornecer um layout especial para a paisagem, inclusive enquanto em telas grandes, ento voc precisa usar tanto o grande e terra qualificador:
MyProject / res / layout / # default (retrato) main.xml layout terra / # paisagem main.xml layout grande / # grande (retrato) main.xml layout de grande terra / # grande paisagem main.xml

Nota: Android 3.2 e acima suporta um mtodo avanado de definio de tamanhos de tela que permite que voc especifique os recursos para tamanhos de tela com base na largura e altura mnimas em termos de densidade de pixels independentes. Esta lio no cobre esta nova tcnica. Para mais informaes, leiaProjetando para mltiplas telas .

Criar diferentes bitmaps

Voc sempre deve fornecer recursos de bitmap que esto devidamente dimensionadas para cada um dos baldes densidade generalizadas: baixa, mdia, alta e extra-alta densidade. Isso ajuda voc a alcanar uma boa qualidade grfica e desempenho em todas as densidades de tela. Para gerar estas imagens, voc deve comear com o recurso natural em formato vetorial e gerar as imagens para cada densidade utilizando a seguinte escala de tamanho:

xhdpi: 2,0

hdpi: 1,5 MDPI: 1.0 (baseline) LDPI: 0,75

Isto significa que se voc gerar uma imagem de 200x200 para dispositivos xhdpi, voc deve gerar o mesmo recurso em 150x150 para hdpi, 100x100 para MDPI e 75x75 para dispositivos LDPI. Em seguida, coloque os arquivos no diretrio drawable recurso apropriado:
MyProject / res / drawable-xhdpi / awesomeimage.png drawable-hdpi / awesomeimage.png drawable-MDPI / awesomeimage.png drawable-LDPI / awesomeimage.png

Toda vez que voc referncia @ drawable / awesomeimage , o sistema seleciona o bitmap apropriado com base na densidade da tela. Nota: os recursos de baixa densidade (LDPI) nem sempre so necessrias. Quando voc fornece ativos hdpi, as escalas do sistema deles para baixo pela metade para caber corretamente telas LDPI. Para mais dicas e orientaes sobre a criao de cone ativos para sua aplicao, consulte o Guia de design de Iconografia .

Apoiar diferentes verses da plataforma


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Especificar os nveis mnimos e Target API 2. Verifique Verso do sistema em tempo de execuo 3. Use Styles Plataforma e Temas

VOC TAMBM DEVE LER


Android Nveis API Biblioteca de Apoio Android

Enquanto as verses mais recentes do Android, muitas vezes oferecem grande APIs para o seu aplicativo, voc deve continuar a apoiar as verses mais antigas do Android at mais dispositivos so atualizados. Esta lio mostra como tirar proveito dos mais recentes APIs enquanto continua a apoiar as verses mais antigas tambm.

O painel de verses da plataforma atualizado regularmente para mostrar a distribuio de dispositivos ativos rodando cada verso do Android, com base no nmero de dispositivos que visitam a loja Play Google. Geralmente, uma boa prtica para apoiar cerca de 90% dos dispositivos activos, enquanto que a segmentao do seu aplicativo para a verso mais recente. Dica: A fim de proporcionar os melhores recursos e funcionalidades atravs de vrias verses para Android, voc deve usar a Biblioteca de Apoio Android em seu aplicativo, que permite que voc use vrios recente APIs plataforma em verses mais antigas.

Especificar os nveis mnimos e Target API


O AndroidManifest.xml arquivo descreve detalhes sobre a sua aplicao e identifica quais verses do Android que ele suporta. Especificamente, os minSdkVersion e targetSdkVersion atributos para o <usessdkelemento identificar o nvel mais baixo API com que seu aplicativo compatvel eo nvel API maior contra o qual voc projetou e testou o aplicativo. Por exemplo:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... > <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" /> ... </manifest>

medida que novas verses do Android so liberados, alguns estilo e comportamentos podem mudar. Para permitir que o aplicativo para tirar vantagem dessas mudanas e garantir que seu aplicativo se encaixa no estilo de dispositivo de cada usurio, voc deve definir o targetSdkVersion valor para coincidir com a verso mais recente do Android disponvel.

Verifique Verso do sistema em tempo de execuo


Android fornece um cdigo exclusivo para cada verso de plataforma no Envergadura classe constantes.Utilize estes cdigos dentro de seu aplicativo para a construo de condies que garantam o cdigo que depende dos nveis mais elevados da API executada somente quando as APIs esto disponveis no sistema.
privado vazio setUpActionBar () { / / Certifique-se de que estamos rodando em Honeycomb ou superior para utilizar ActionBar

Nota: Ao analisar os recursos XML, Android ignora atributos XML que no so suportadas pelo dispositivo atual. Ento voc pode usar com segurana os atributos XML que so apenas suportados por verses mais novas sem se preocupar com verses mais antigas quebrando quando se deparam com esse cdigo. Por exemplo, se voc definir o targetSdkVersion = "11" , o aplicativo inclui o ActionBar por padro no Android 3.0 e superior. Para, em seguida, adicionar itens de menu para a barra de ao, voc precisa definirandroid: showAsAction = "ifRoom" em seu menu de recursos XML. seguro fazer isso em um

arquivo XML cross-verso, pois as verses mais antigas do Android simplesmente ignorar o showAsAction atributo (ou seja, voc no precisa de uma verso separada em res/menu-v11 / ).

Use Styles Plataforma e Temas


Android oferece experincia do usurio temas que do aplicativos o look and feel do sistema operacional subjacente. Estes temas podem ser aplicados a sua aplicao dentro do arquivo de manifesto. Ao utilizar essas construdo em estilos e temas, seu aplicativo ir naturalmente acompanhar as ltimas look and feel do Android com cada novo lanamento. Para tornar a sua atividade parece uma caixa de dilogo:
<Atividade android: theme = "@ android: estilo / Theme.Dialog" >

Para tornar a sua actividade tem um fundo transparente:


<Atividade android: theme = "@ android: estilo / Theme.Translucent" >

Para aplicar o seu prprio tema personalizado definido em / res / valores / styles.xml :
<Atividade android: theme = "@ estilo / CustomTheme" >

Para aplicar um tema para todo o seu aplicativo (todas as atividades), adicione o android: theme atributo <application> elemento:
<Aplicao android: theme = "@ estilo / CustomTheme" >

Para saber mais sobre a criao e utilizao de temas, leia os estilos e temas -guia.

A construo de uma interface dinmica com fragmentos


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Conhecimento bsico do ciclo de vida de atividades (ver Gesto do Ciclo de Vida de Atividade ) Experimente construir layouts XML

VOC TAMBM DEVE LER


Fragmentos Tablets apoio e monofones

EXPERIMENT-LO

Baixe o exemplo
FragmentBasics.zip

Para criar uma interface de usurio dinmica e multi-painel no Android, voc precisa encapsular componentes de interface do usurio e comportamentos de atividade em mdulos que voc pode trocar para dentro e fora de suas atividades. Voc pode criar esses mdulos com o fragmento de classe, que se comporta mais ou menos como uma atividade aninhada que pode definir o seu prprio layout e gerir o seu prprio ciclo de vida. Quando um fragmento especifica o seu prprio layout, ele pode ser configurado em diferentes combinaes com outros fragmentos dentro de uma atividade para modificar a configurao do layout para diferentes tamanhos de tela (uma pequena tela pode mostrar um fragmento de cada vez, mas um grande ecr pode mostrar dois ou mais). Esta classe mostra como criar uma experincia de usurio dinmica com fragmentos e otimizar a experincia do usurio de seu aplicativo para dispositivos com diferentes tamanhos de tela, tudo ao mesmo tempo continuar a oferecer suporte a dispositivos que executam verses to antiga quanto o Android 1.6.

Lies
Usando Biblioteca de suporte a Android Aprenda a usar APIs quadro mais recente em verses anteriores do Android atravs do agrupamento Biblioteca de Apoio do Android em seu aplicativo. Criando um Fragmento Aprenda a construir um fragmento e implementar comportamentos bsicos dentro de seus mtodos de retorno de chamada. A construo de uma interface flexvel Aprenda a construir o seu aplicativo com layouts que proporcionam configuraes fragmento diferentes para diferentes telas. Comunicando-se com outros fragmentos Saiba como configurar os caminhos de comunicao a partir de um fragmento para a atividade e outros fragmentos.

Usando a biblioteca de suporte


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Configurar seu projeto com a Biblioteca de Apoio 2. Importe o apoio APIs Biblioteca

VOC TAMBM DEVE LER


Biblioteca de Apoio

O Android Support Library fornece um arquivo JAR com uma biblioteca API que permite que voc use alguns dos mais recentes APIs Android em seu aplicativo durante a execuo em verses anteriores do Android. Por exemplo, a biblioteca de suporte fornece uma verso do Fragmento APIs que voc pode usar no Android 1.6 (API nvel 4) e superior.

Esta lio mostra como configurar seu aplicativo para usar a biblioteca de suporte, a fim de usar os fragmentos para construir uma UI aplicativo dinmico.

Configurar seu projeto com a Biblioteca de Apoio

Figura 1. O gerente SDK Android com o pacote de suporte Android selecionados.

Para configurar seu projeto: 1. Faa o download do pacote de suporte Android usando o Gerenciador de SDK. 2. Criar um libsdiretrio no nvel superior do seu projeto Android. 3. Localize o arquivo JAR para a biblioteca que deseja usar e copi-lo para aslibs / diretrio. Por exemplo, a biblioteca que suporta o nvel API 4 ou superior est localizado na <sdk> / extras/android/support/v4/android-support-v4.jar . 4. Atualize seu arquivo de manifesto para definir o nvel mnimo API para 4 eo nvel API alvo para a verso mais recente:
<Uses-sdk android: minSdkVersion = "4" android: targetSdkVersion = "15" />

Importe o apoio APIs Biblioteca

A Biblioteca de suporte inclui uma variedade de APIs que ou foram adicionadas nas verses recentes do Android ou no existem na plataforma em tudo e simplesmente fornecer suporte adicional para voc no desenvolvimento de caractersticas especficas da aplicao. Voc pode encontrar toda a documentao de referncia da API para a biblioteca de suporte na plataforma docs em android.support.v4. * .

Ateno: Para ter certeza de que voc no usa acidentalmente novas APIs em uma verso mais antiga do sistema, ter certeza de que voc importar o Fragmento de classes e APIs relacionados doandroid.support.v4.app pacote:
importao android . apoio . v4 . aplicativo . Fragmento ; importao android . apoio . v4 . aplicativo . FragmentManager ; ...

Ao criar uma atividade que abriga fragmentos enquanto estiver usando a biblioteca de suporte, voc tambm deve se estender a FragmentActivity classe em vez da tradicional atividade de classe. Voc vai ver o cdigo de exemplo para o fragmento e atividade na prxima lio.

Criando um Fragmento
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Criar uma classe Fragment 2. Adicionar um fragmento de uma atividade usando XML

VOC TAMBM DEVE LER


Fragmentos

EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip

Voc pode pensar em um fragmento de uma seo modular de uma atividade, que tem o seu prprio ciclo de vida, recebe os seus prprios eventos de entrada, e que voc pode adicionar ou remover enquanto a atividade est em execuo (como uma espcie de "sub atividade", que voc pode reutilizar em diferentes atividades). Esta lio mostra como estender oFragmento classe usando a biblioteca de suporte para seu aplicativo continua sendo compatvel com dispositivos que executam verses do sistema to antigo quanto o Android 1.6. Nota: Se voc optar por outras razes que o nvel API mnimo o seu aplicativo exige 11 ou superior, voc no precisa usar a biblioteca de suporte e em vez disso pode usar o quadro construdo em Fragmento de classes e APIs relacionadas.Esteja ciente de que esta lio se concentra em usar as APIs da Biblioteca de Apoio, que utilizam uma assinatura pacote especfico e os nomes da API, por vezes, um pouco diferentes do que as verses includas na plataforma.

Criar uma classe Fragment


Para criar um fragmento, estender o fragmento de classe, em seguida, substituir os mtodos fundamentais de ciclo de vida para inserir a sua lgica de aplicao, semelhante maneira como voc faria com uma atividadede classe.

Uma diferena na criao de um fragmento que voc deve usar o onCreateView () callback para definir o layout. Na verdade, este o nico retorno que voc precisa, a fim de obter um fragmento de corrida. Por exemplo, aqui est um fragmento simples que especifica o seu prprio layout:

Inflar o layout para este fragmento retorno inflater . inflar ( R . disposio . article_view , recipiente , ); } }

falso

Assim como uma atividade, um fragmento deve implementar outros retornos de chamada do ciclo de vida que permitem que voc gerencie seu estado, uma vez que adicionado ou removido da atividade e como as transies de atividade entre seus estados de ciclo de vida. Por exemplo, quando a actividade do onPause () chamado de mtodo, quaisquer fragmentos na atividade tambm receber uma chamada para OnPause () . Mais informaes sobre o ciclo de vida fragmento e os mtodos de retorno de chamada est disponvel noFragments guia do desenvolvedor.

Adicionar um fragmento de uma atividade usando XML


Enquanto fragmentos so, componentes de interface do usurio modulares reutilizveis, cada instncia de umfragmento de classe deve ser associado a um pai FragmentActivity . Voc pode conseguir esta associao atravs da definio de cada fragmento dentro do arquivo XML de layout atividade. Nota: FragmentActivity uma atividade especial prevista na Biblioteca de Apoio ao lidar com fragmentos de verses de sistemas mais velhos do que o nvel API 11. Se o menor verso do sistema que voc apoiar o nvel API 11 ou mais, ento voc pode usar um regular Atividade . Aqui est um arquivo de layout exemplo que adiciona dois fragmentos de uma atividade em que a tela do aparelho considerado "grande" (especificado pelo grande qualificador no nome do diretrio).
res / layout-large / news_articles.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment android:name="com.example.android.fragments.HeadlinesFragment" android:id="@+id/headlines_fragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.android.fragments.ArticleFragment"

android:id="@+id/article_fragment" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>

Dica: Para obter mais informaes sobre a criao de layouts para diferentes tamanhos de tela, leia Apoiar diferentes tamanhos de tela . Eis como uma atividade aplica esta disposio:
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); } }

Nota: Quando voc adicionar um fragmento de um layout de atividade, definindo o fragmento no arquivo XML de layout, voc no pode remover o fragmento em tempo de execuo. Se voc pretende trocar seus fragmentos dentro e para fora durante a interao do usurio, voc deve adicionar o fragmento atividade quando a atividade inicia pela primeira vez, como mostrado na prxima lio.

A construo de uma interface flexvel


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Adicionar um fragmento de uma atividade em tempo de execuo 2. Substituir um fragmento com outro

VOC TAMBM DEVE LER


Fragmentos Tablets apoio e monofones

EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip

Ao projetar seu aplicativo para suportar uma ampla gama de tamanhos de tela, voc pode reutilizar os seus fragmentos em diferentes configuraes de layout para otimizar a experincia do usurio com base no espao disponvel na tela. Por exemplo, em um dispositivo celular que poderia ser apropriada para exibir apenas um fragmento de cada vez para uma interface de usurio de painel nico. Por outro lado, voc pode querer definir fragmentos de lado a lado em um tablet que tem um tamanho de tela maior para exibir mais informaes para o usurio.

Figura 1. Dois fragmentos, exibidos em diferentes configuraes para a mesma atividade em diferentes tamanhos
de tela.Em uma tela grande, os dois fragmentos caber lado a lado, mas em um aparelho celular, apenas um fragmento se encaixa em um momento assim os fragmentos devem substituir um ao outro como o usurio navega.

O FragmentManager classe fornece mtodos que permitem que voc adicionar, remover e substituir fragmentos de uma atividade em tempo de execuo, a fim de criar uma experincia dinmica.

Adicionar um fragmento de uma atividade em tempo de execuo


Ao invs de definir os fragmentos para uma atividade no layout do arquivo, como mostrado na aula anteriorcom o <fragment> elemento voc pode adicionar um fragmento da atividade durante o tempo de execuo de atividade. Isto necessrio se voc pretende mudar fragmentos durante a vida da atividade. Para executar uma operao como adicionar ou remover um fragmento, voc deve usar o FragmentManagerpara criar um FragmentTransaction , que fornece APIs para adicionar, remover, substituir e executar outras operaes de fragmento. Se a sua atividade permite que os fragmentos a serem removidos e substitudos, voc deve adicionar o fragmento inicial (s) para a atividade durante a sua actividade onCreate () mtodo. Uma regra importante quando se lida com fragmentos-especialmente aqueles que voc adicionar em tempo de execuo que o fragmento deve ter um recipiente Ver no layout em que o layout do fragmento residir. O esquema seguinte uma alternativa para a disposio mostrada na lio anterior , que mostra apenas um fragmento de uma vez. A fim de substituir um fragmento com o outro, o layout da atividade inclui um vazioFrameLayout que atua como recipiente fragmento. Observe que o nome do arquivo o mesmo que o arquivo de layout na lio anterior, mas o diretrio de layout no no tm a grande qualificao, de modo que este esquema utilizado quando a tela do dispositivo menor do que grande porque a tela no se encaixa ambos os fragmentos no mesmo tempo.
res / layout / news_articles.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />

Dentro de sua atividade, chamada getSupportFragmentManager () para obter uma FragmentManagerusando o suporte APIs Library. Em seguida, chamar beginTransaction () para criar umFragmentTransaction e chamar add () para adicionar um fragmento. Voc pode executar a transao fragmento mltiplo para a atividade usando o mesmo FragmentTransaction. Quando voc estiver pronto para fazer as mudanas, voc deve chamar commit () . Por exemplo, aqui est como adicionar um fragmento ao layout anterior:

Verifique se a atividade est usando a verso de layout com / / o FrameLayout fragment_container se ( findViewById ( R . id . fragment_container ) ! = nulo ) / / / / / / se } / / Cria uma instncia de ExampleFragment HeadlinesFragment firstFragment = new HeadlinesFragment ();

No entanto, se estamos sendo restaurado a partir de um estado anterior, ento ns don 't precisa fazer nada e deve retornar ou ento ns pode acabar com fragmentos sobrepostos. ( savedInstanceState =! nulo ) { retorno ;

/ / Em caso esta atividade foi iniciada com instrues especiais de uma inteno, / / passar extras da inteno de o fragmento como argumentos firstFragment . setArguments ( getIntent (). getExtras ()); / / Adicionar o fragmento do 'fragment_container'

Porque o fragmento foi adicionado ao FrameLayout recipiente em tempo de execuo, em vez de defini-la no layout da atividade com um <fragment> elemento a atividade pode remover o fragmento e substitu-lo por um diferente.

Substituir um fragmento com outro


O procedimento para substituir um fragmento semelhante a adicionar um, mas requer a substituio ()mtodo em vez de adicionar () . Tenha em mente que quando voc executar transaes fragmento, como substituir ou remover um, muitas vezes necessrio para permitir que o usurio navegue para trs e para "desfazer" a mudana. Para permitir que o usurio navegue para trs atravs das operaes de fragmentos, voc deve chamar addToBackStack ()antes de se comprometer a FragmentTransaction .

Nota: Quando voc remover ou substituir um fragmento e adicione a transao para a pilha de volta, o fragmento que removida parado (no destrudo). Se o usurio navega de volta para restaurar o fragmento, ele reinicia. Se voc no adicionar a transao para a pilha de volta, em seguida, o fragmento destruda quando removidos ou substitudos. Exemplo de substituio de um fragmento com outro:
/ / Cria o fragmento e dar-lhe um argumento que especifica o artigo que deveria

Substitua o que est na vista fragment_container com este fragmento, / / e adicione a transao para a pilha de volta para que o usurio possa navegar de volta transao . substituir ( R . id . fragment_container , newFragment ); transao . addToBackStack ( nulo ); / / commit a transao transao . cometer ();

O addToBackStack () mtodo tem um parmetro de cadeia opcional que especifica um nome exclusivo para a transao. O nome no necessrio a menos que voc planeja para executar operaes de fragmentos avanados usando o FragmentManager.BackStackEntry APIs.

Comunicando-se com outros fragmentos


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Definir uma interface 2. Implementar a interface 3. Entregar uma mensagem a um fragmento

VOC TAMBM DEVE LER


Fragmentos

EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip

A fim de reutilizar os componentes de interface fragmento, voc deve construir cada um como um componente completamente auto-suficiente, modular que define o seu prprio layout e comportamento. Depois de ter definido estes fragmentos reutilizveis, voc pode associ-los com uma atividade e conect-los com a lgica do aplicativo para realizar a interface de usurio composta em geral. Muitas vezes, voc vai querer um fragmento para se comunicar com o outro, por exemplo, para alterar o contedo com base em um evento de usurio. Toda a comunicao Fragment-to-fragmento feito atravs da atividade associada. Dois fragmentos nunca deve se comunicar diretamente.

Definir uma interface


Para permitir que um fragmento de comunicar-se com a sua actividade, voc pode definir uma interface na classe Fragment e implement-lo na atividade. O fragmento capta a implementao da interface durante o seu ciclo de vida mtodo onAttach () e pode, ento, chamar os mtodos de interface, a fim de comunicar-se com a atividade. Aqui est um exemplo de fragmento de comunicao Atividade:
pblico classe HeadlinesFragment estende OnHeadlineSelectedListener mCallback ; ListFragment {

/ / Container Atividade deve implementar esse

Isso garante que a atividade recipiente implementou / / a interface de callback. Se no, ele lana uma

deve implementar OnHeadlineSelectedListener " ); } } ... }

Agora, o fragmento pode entregar mensagens para a atividade chamando o onArticleSelected () mtodo (ou outros mtodos na interface) utilizando o mCallback instncia do OnHeadlineSelectedListenerinterface. Por exemplo, o mtodo a seguir no fragmento chamado quando o usurio clica em um item da lista. O fragmento usa a interface de retorno de chamada para entregar o caso para a atividade principal.
@ Override pblico vazio onListItemClick ( ListView l , { / / Envia o evento para a atividade de acolhimento mCallback . onArticleSelected ( posio ); }

Ver v ,

int posio ,

longa id )

Implementar a interface
Para receber retornos de chamada de eventos a partir do fragmento, a atividade que o hospeda deve implementar a interface definida na classe fragmento. Por exemplo, a seguinte actividade implementa a interface a partir do exemplo acima.

O usurio selecionou o ttulo de um artigo do HeadlinesFragment / / Faa algo aqui para exibir esse artigo } }

Entregar uma mensagem a um fragmento


A atividade host pode entregar mensagens a um fragmento, capturando o Fragmento instncia comfindFragmentById () , em seguida, chamar diretamente mtodos pblicos do fragmento. Por exemplo, imagine que a atividade acima pode conter outro fragmento que usado para exibir o item especificado pelos dados retornados no mtodo de retorno acima. Neste caso, a atividade pode passar as informaes recebidas no mtodo de retorno de chamada para o outro fragmento que vai exibir o item:

O usurio selecionou o ttulo de um artigo do HeadlinesFragment / / Faa algo aqui para exibir o que

Se o artigo frag est disponvel, estamos na disposio de dois painis ... / / Chama um mtodo no ArticleFragment para atualizar seu contedo articleFrag . updateArticleView ( posio ); mais { / / Caso contrrio, estamos em um layout de painel e deve trocar frags ... / / cria fragmento e dar-lhe um argumento para o selecionado

Substitua o que est na vista fragment_container com este fragmento, / / e adicione a transao para a pilha de volta para que o usurio possa navegar de volta transao . substituir ( R . id . fragment_container , newFragment ); transao . addToBackStack ( nulo ); / / commit a transao transao . cometer (); } } }

Salvando dados
COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 1.6 (API de nvel 4) ou superior Familiaridade com o Mapa colees de valores-chave Familiaridade com o arquivo I / O API Java Familiaridade com bancos de dados SQL

VOC TAMBM DEVE LER


Opes de armazenamento

A maioria dos aplicativos Android precisa salvar os dados, mesmo que apenas para guardar informaes sobre o estado do aplicativo durante onPause () para que o progresso do usurio no est perdida. A maioria dos aplicativos no-triviais tambm precisa salvar as configuraes do usurio, e alguns aplicativos precisam gerenciar grandes quantidades de informaes em arquivos e bancos de dados. Esta classe apresenta as principais opes de armazenamento de dados em Android, incluindo:

Salvando pares de valores-chave de tipos de dados simples em um arquivo de preferncias compartilhada Salvando arquivos arbitrrios no sistema de arquivos do Android Utilizando bancos de dados gerenciados pelo SQLite

Lies

Salvando conjuntos de chaves-Valor Aprenda a usar um arquivo de preferncias compartilhada para armazenar pequenas quantidades de informao em pares chave-valor. Salvando arquivos Aprenda a salvar um arquivo bsico, como para armazenar longas seqncias de dados que geralmente so lidos em ordem. Salvando dados em bancos de dados SQL Aprenda a usar um banco de dados SQLite para ler e gravar dados estruturados.

Salvando conjuntos de chaves-Valor


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Obter um identificador para um SharedPreferences 2. Escreva para Preferncias Compartilhadas 3. Leia em Preferncias compartilhadas

VOC TAMBM DEVE LER


Usando Preferncias compartilhadas

Se voc tem um conjunto relativamente pequeno de valores-chave que voc deseja salvar, voc deve usar oSharedPreferences APIs. A SharedPreferences objeto aponta para um arquivo contendo pares de valores-chave e fornece mtodos simples de ler e escrever. CadaSharedPreferences arquivo gerenciado pelo framework e podem ser privados ou compartilhados. Esta classe mostra como usar o SharedPreferences APIs para armazenar e recuperar valores simples. Nota: Os SharedPreferences APIs so apenas para leitura e escrita de pares chave-valor e no se deve confundi-los com o Preference APIs, que ajudam a construir uma interface de usurio para as configuraes de aplicativos (embora eles usam SharedPreferences como a sua execuo para salvar as configuraes do aplicativo ).Para obter informaes sobre como usar o Preference APIs, consulte o Configuraes guia.

Obter um identificador para um SharedPreferences


Voc pode criar um novo arquivo de preferncia compartilhada ou acessar uma j existente, chamando um dos dois mtodos:
getSharedPreferences () - Use isto se voc precisar de vrios arquivos de preferncias comuns

identificados pelo nome, o que voc especificar com o primeiro parmetro. Voc pode chamar isso de qualquer contexto de sua aplicao.
getPreferences () - Utilize este a partir de uma atividade , se voc precisa usar apenas um arquivo de

preferncia compartilhada para a atividade. Porque este recupera um arquivo de preferncia compartilhada padro que pertence atividade, voc no precisa fornecer um nome. Por exemplo, o seguinte cdigo executado dentro de um fragmento . Ele acessa o arquivo de preferncias compartilhada que identificado pela seqncia de recurso R.string.preference_file_key e abre-a usando o modo privado para que o arquivo est acessvel apenas por sua aplicao.
Context context = getActivity(); SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE);

Ao nomear seus arquivos de preferncias compartilhados, voc deve usar um nome que exclusivamente identificvel para o seu aplicativo, como "com.example.myapp.PREFERENCE_FILE_KEY" Alternativamente, se voc precisa apenas de um arquivo de preferncia compartilhada para sua atividade, voc pode usar os getPreferences () mtodo:
SharedPreferences sharedPref = getActivity . () getPreferences ( Context . MODE_PRIVATE );

Ateno: Se voc criar um arquivo de preferncias compartilhada com MODE_WORLD_READABLE ouMODE_WORLD_WRITEABLE , quaisquer outros aplicativos que sabem o identificador de arquivo pode acessar seus dados.

Escreva para Preferncias Compartilhadas


Para gravar um arquivo de preferncias compartilhada, criar um SharedPreferences.Editor chamandoedit () em seus SharedPreferences .

Passe as chaves e valores que voc quer escrever com mtodos como putInt () e putString () . Em seguida, chamar commit () para salvar as alteraes. Por exemplo:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(getString(R.string.saved_high_score), newHighScore); editor.commit();

Leia em Preferncias compartilhadas


Para recuperar valores a partir de um arquivo de preferncias compartilhada, chamar mtodos como getInt () e getString () , fornecendo a chave para o valor desejado e, opcionalmente, um valor padro para retornar se a chave no est presente. Por exemplo:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); int defaultValue = getResources().getInteger(R.string.saved_high_score_default); long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

Salvando arquivos
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Escolha de armazenamento interno ou externo 2. Obter permisses para armazenamento externo 3. Salvar um arquivo no armazenamento interno 4. Salvar um arquivo no armazenamento externo 5. Consulta Espao Livre 6. Excluir um arquivo

VOC TAMBM DEVE LER


Usando o armazenamento interno Usando o armazenamento externo

Android usa um sistema de arquivos que semelhante aos sistemas de arquivos baseados em disco em outras plataformas. Esta lio descreve como trabalhar com o sistema de arquivos do Android para ler e escrever arquivos com oarquivo APIs. Um arquivo objeto adequado para ler ou escrever grandes quantidades de dados em start-to-finish fim, sem pular ao redor. Por exemplo, bom para arquivos de imagem ou qualquer coisa trocados em uma rede. Esta lio mostra como executar tarefas relacionadas com o arquivo bsicas em seu aplicativo. A lio pressupe que voc esteja familiarizado com os conceitos bsicos do sistema de arquivos Linux e de entrada / sada APIs de arquivos padro emjava.io .

Escolha de armazenamento interno ou externo

Todos os dispositivos Android tm duas reas de armazenamento de arquivos: "internos" e armazenamento "externo". Estes nomes vm desde os primeiros dias do Android, quando a maioria dos dispositivos oferecido construdo em memria no-voltil (memria interna), alm de um meio de armazenamento removvel, como um carto micro SD (armazenamento externo). Alguns dispositivos de dividir o espao de armazenamento permanente em parties e "internos" "externas", por isso mesmo, sem um meio de armazenamento removvel, h sempre dois espaos de armazenamento e do comportamento API o mesmo se o armazenamento externo removvel ou no. As listas a seguir um resumo dos fatos sobre cada espao de armazenamento. Armazenamento interno:

sempre disponvel. Arquivos salvos aqui so acessveis apenas por seu aplicativo, por padro. Quando o usurio desinstala o aplicativo, o sistema remove todos os arquivos do seu aplicativo de armazenamento interno.

O armazenamento interno melhor quando voc quer ter certeza de que nem o usurio nem outros aplicativos podem acessar seus arquivos. Armazenamento externo:

No sempre disponvel, porque o utilizador pode montar o armazenamento externo como armazenamento USB e, em alguns casos, remov-lo a partir do dispositivo. lido por todos, para que os arquivos salvos aqui pode ser lido fora de seu controle. Quando o usurio desinstala o aplicativo, o sistema remove os arquivos do seu aplicativo a partir daqui apenas se voc salv-los no diretrio de getExternalFilesDir () .

O armazenamento externo o melhor lugar para arquivos que no requerem restries de acesso e para arquivos que voc deseja compartilhar com outros aplicativos ou permitir que o usurio acesse com um computador. Dica: Embora os aplicativos so instalados na memria interna por padro, voc pode especificar oandroid: installLocation atributo no seu manifesto para que o seu aplicativo pode ser instalado em armazenamento externo. Usurios apreciam esta opo quando o tamanho da APK muito grande e eles tm um espao de armazenamento externo que maior do que o armazenamento interno. Para mais informaes, consulte App Install Location .

Obter permisses para armazenamento externo


Para escrever para o armazenamento externo, voc deve solicitar o WRITE_EXTERNAL_STORAGE permisso em seu arquivo de manifesto :
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>

Ateno: Atualmente, todas as aplicaes tm a capacidade de ler o armazenamento externo sem uma permisso especial. No entanto, isso vai mudar em uma verso futura. Se seu aplicativo precisa ler o armazenamento externo (mas no escrever para ele), ento voc ter que declarar oREAD_EXTERNAL_STORAGE permisso. Para garantir que sua aplicao continua a funcionar como esperado, voc deve declarar essa permisso agora, antes que a alterao tenha efeito.

<Manifestar ... > <usos-permisso ... </ manifest>

android: name = "android.permission.READ_EXTERNAL_STORAGE"

/>

No entanto, se o seu aplicativo usa o WRITE_EXTERNAL_STORAGE permisso, ento implicitamente tem permisso para ler o armazenamento externo tambm. Voc no precisa de nenhuma permisso para salvar arquivos no armazenamento interno. Sua aplicao sempre tem permisso para ler e gravar arquivos em seu diretrio de armazenamento interno.

Salvar um arquivo no armazenamento interno


Ao salvar um arquivo para a memria interna, voc pode adquirir o diretrio apropriado como um arquivochamando um dos dois mtodos:
getFilesDir ()

Retorna um arquivo que representa um diretrio interno para seu aplicativo.


getCacheDir () Retorna um arquivo que representa um diretrio interno para arquivos de cache temporrios do seu

aplicativo. No se esquea de apagar cada arquivo, uma vez que no mais necessrio e implementar um limite de tamanho razovel para a quantidade de memria que voc usa em um determinado momento, como 1MB. Se o sistema comea a ficar sem armazenamento, pode apagar seus arquivos de cache sem aviso prvio. Para criar um novo arquivo em um desses diretrios, voc pode usar o File () construtor, passando oarquivo fornecido por um dos mtodos acima que especifica o diretrio de armazenamento interno. Por exemplo:
Arquivo arquivo = new Arquivo ( contexto . getFilesDir (), nome );

Alternativamente, voc pode chamar openFileOutput () para obter um FileOutputStream que grava em um arquivo no seu diretrio interno. Por exemplo, aqui como escrever um texto para um arquivo:
Cordas filename = "myfile" ; cordas corda = "Ol

Ou, se voc precisa armazenar alguns arquivos, voc deve usar createTempFile () . Por exemplo, o seguinte mtodo extrai o nome do arquivo a partir de uma URL e cria um arquivo com esse nome no diretrio de cache interna do seu app:

Erro ao criar arquivo } retorno arquivo ; }

Nota: o diretrio de armazenamento interno do seu aplicativo especificado pelo nome do pacote do aplicativo em um local especial do sistema de arquivos do Android. Tecnicamente, outro aplicativo pode ler seus arquivos internos, se voc definir o modo de arquivo a ser lido. No entanto, o outro aplicativo tambm precisa saber o nome do pacote de aplicativos e nomes de arquivos. Outros aplicativos no pode navegar pelos seus diretrios internos e no tem ler ou escrever acesso, a menos que voc defina explicitamente os arquivos a serem lidos ou escritos. Ento, enquanto voc usa MODE_PRIVATE para seus arquivos no armazenamento interno, eles nunca so acessveis a outros aplicativos.

Salvar um arquivo no armazenamento externo

Como o armazenamento externo pode no estar disponvel, por exemplo, quando o usurio tenha instalado o armazenamento para um PC ou tenha retirado o carto SD que fornece o armazenamento externo, voc deve sempre verificar se o volume est disponvel antes de acess-lo. Voc pode consultar o estado de armazenamento externo atravs do telefone getExternalStorageState () . Se o estado retornado igual aMEDIA_MOUNTED , ento voc pode ler e gravar seus arquivos. Por exemplo, os seguintes mtodos so teis para determinar a disponibilidade de armazenamento:
/ * Verifica se o armazenamento externo est disponvel para ler e escrever

Verifica se o armazenamento externo est disponvel para pelo menos ler

Embora o armazenamento externo modificvel pelo usurio e outros aplicativos, existem duas categorias de arquivos que voc pode salvar aqui: Arquivos pblicos Os arquivos que deveriam estar disponveis livremente para outros aplicativos e para o usurio. Quando o usurio desinstala o aplicativo, esses arquivos devem permanecer disponveis para o usurio. Por exemplo, fotografias tiradas pelo seu aplicativo ou outros arquivos baixados.

Arquivos privados Arquivos que legitimamente pertencem a sua aplicao e deve ser suprimido quando o usurio desinstala o aplicativo. Embora esses arquivos so tecnicamente acessveis pelo usurio e outros aplicativos, pois eles esto no armazenamento externo, que so arquivos que realisticamente no fornecem valor para o usurio fora do seu aplicativo. Quando o usurio desinstala o aplicativo, o sistema exclui todos os arquivos no diretrio privado externo de seu aplicativo. Por exemplo, recursos adicionais baixado por seu aplicativo ou arquivos de mdia temporrios. Se voc deseja salvar os arquivos pblicos no armazenamento externo, use ogetExternalStoragePublicDirectory () mtodo para obter um arquivo que representa o diretrio apropriado no armazenamento externo. O mtodo recebe um argumento que especifica o tipo de arquivo que voc deseja salvar, para que possam ser organizadas de forma lgica com outros arquivos pblicos, comoDIRECTORY_MUSIC ou DIRECTORY_PICTURES . Por exemplo:
pblico Arquivo getAlbumStorageDir ( cordas albumName ) / / Pega o diretrio para imagem pblica do usurio {

no foi criado " ); } retorno arquivo ; }

Se voc deseja salvar os arquivos que so privados de seu aplicativo, voc pode adquirir o diretrio apropriado chamando getExternalFilesDir () e passando-lhe um nome que indica o tipo de diretrio que voc gostaria. Cada diretrio criado dessa forma adicionado a um diretrio pai que encapsula todos os arquivos externos de armazenamento do seu aplicativo, o que os exclui do sistema quando o usurio desinstala o aplicativo. Por exemplo, aqui est um mtodo que voc pode usar para criar um diretrio para um lbum de fotos individual:
pblico Arquivo getAlbumStorageDir ( Context contexto , Cordas albumName ) { / / Pega o diretrio para fotos privadas do aplicativo

no foi criado " ); } retorno arquivo ; }

Se nenhum dos nomes de sub-diretrios pr-definidos adequar seus arquivos, voc pode chamar em vezgetExternalFilesDir () e passar nulo . Isso retorna o diretrio raiz para o diretrio privado de seu aplicativo no armazenamento externo. Lembre-se que getExternalFilesDir () cria um diretrio dentro de um diretrio que excludo quando o usurio desinstala o aplicativo. Se os arquivos que voc est salvando devem permanecer disponveis depois que o usurio desinstala o app-como quando seu aplicativo uma cmera e que o usurio vai querer manter as fotos, voc deve usar getExternalStoragePublicDirectory () .

Independentemente de voc usar getExternalStoragePublicDirectory () para arquivos que so compartilhados ou getExternalFilesDir () para arquivos que so privadas de sua aplicao, importante que voc use nomes de diretrio fornecidas por constantes API como DIRECTORY_PICTURES . Estes nomes de diretrio garantir que os arquivos so tratados corretamente pelo sistema. Por exemplo, os arquivos salvos emDIRECTORY_RINGTONES so categorizados pelo scanner de mdia do sistema como ringtones em vez de msica.

Consulta Espao Livre


Se voc sabe de antemo a quantidade de dados que voc est salvando, voc pode descobrir se espao suficiente disponvel, sem causar uma IOException chamando getFreeSpace () ou getTotalSpace () .Estes mtodos proporcionam a corrente espao disponvel e o espao total do volume de armazenamento, respectivamente. Esta informao tambm til para evitar encher o volume de armazenamento acima de um certo limite. No entanto, o sistema no garante que voc pode escrever tantos bytes quanto so indicados porgetFreeSpace () . Se o nmero retornado um pouco MB mais do que o tamanho dos dados que voc deseja salvar, ou se o sistema de arquivo inferior a 90% cheio, ento provavelmente seguro para prosseguir. Caso contrrio, voc provavelmente no deve escrever para o armazenamento. Nota: Voc no obrigado a verificar a quantidade de espao disponvel antes de salvar o arquivo. Voc pode em vez de tentar escrever o arquivo de imediato, em seguida, pegar um IOException se ocorre. Voc pode precisar fazer isso se voc no sabe exatamente quanto espao voc precisa. Por exemplo, se voc alterar a codificao do arquivo antes de salv-lo atravs da converso de uma imagem PNG para JPEG, voc no vai saber o tamanho do arquivo de antemo.

Excluir um arquivo

Voc deve sempre apagar arquivos que voc no precisa mais. A maneira mais simples de apagar um arquivo ter a referncia de chamada arquivo aberto delete () em si mesmo.
myFile . excluir ();

Se o arquivo salvo na memria interna, voc tambm pode pedir o contexto para localizar e excluir um arquivo chamando deleteFile () :
myContext . deleteFile ( fileName );

Nota: Quando o usurio desinstala o aplicativo, o sistema elimina Android a seguir:


Todos os arquivos salvos na memria interna Todos os arquivos que voc salvou no armazenamento externo usando getExternalFilesDir () .

No entanto, voc deve excluir manualmente todos os arquivos de cache criados com getCacheDir () em uma base regular e tambm apagar regularmente outros arquivos que voc no precisa mais.

Salvando dados em bancos de dados SQL


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Definir um esquema e contrato 2. Criar um banco de dados usando um Helper SQL 3. Colocar informao em um banco de dados 4. Ler as informaes de um banco de dados 5. Excluir informaes de um banco de dados 6. Atualizar um banco de dados

VOC TAMBM DEVE LER


Usando bancos de dados

Salvando dados em um banco de dados ideal para dados repetidos ou estruturada, tais como informaes de contato.Esta classe assume que voc est familiarizado com bancos de dados SQL em geral, e ajuda voc a comear com bancos de dados SQLite no Android. As APIs que voc vai precisar usar um banco de dados on Android esto disponveis noandroid.database.sqlite pacote.

Definir um esquema e contrato


Um dos principais princpios de bancos de dados SQL o esquema: uma declarao formal de como o banco de dados est organizado. O esquema se reflete nas instrues SQL que voc usa para criar seu banco de dados. Voc pode achar que til para criar uma classe de companheiro, conhecido como umcontrato de classe, o qual especifica o layout do seu esquema de uma forma sistemtica e auto-documentado. Uma classe de contrato um recipiente para constantes que definem nomes para URIs, tabelas e colunas. A classe de contrato permite que voc use as mesmas constantes em todas as outras classes no mesmo pacote.Isso permite que voc altere o nome da coluna em um s lugar e t-lo propagar por todo o seu cdigo. Uma boa maneira de organizar a classe contrato colocar definies que so globais para todo o banco de dados no nvel da raiz da classe. Em seguida, crie uma classe interna para cada tabela que enumera suas colunas. Nota: Com a implementao do BaseColumns interface, sua classe interna pode herdar um campo de chave primria chamada _ID que algumas classes Android como adaptadores cursor vai esperar que ele tem. No necessrio, mas isso pode ajudar o seu trabalho de banco de dados harmoniosamente com a estrutura do Android. Por exemplo, este trecho define o nome da tabela e os nomes das colunas de uma nica tabela:
pblico final, classe FeedReaderContract { / / Para impedir que algum acidentalmente instanciar a classe do contrato, / / dar-lhe um construtor vazio.

pblico

FeedReaderContract ()

{}

/ * class Inner que define o contedo da tabela

Criar um banco de dados usando um Helper SQL


Depois de ter definido como seu banco de dados parece, voc deve implementar mtodos que criar e manter o banco de dados e tabelas. Aqui esto algumas declaraes tpicas que criar e excluir uma tabela:
privada esttica final de Cordas TEXT_TYPE = "TEXT" ; privada esttica final de Cordas COMMA_SEP = "" ; privadas estticos finais corda SQL_CREATE_ENTRIES = "CREATE TABLE" + FeedEntry . TABLE_NAME + "(" + FeedEntry . _ID + "INTEGER PRIMARY Quaisquer outras opes para o comando CREATE ")" ; privadas estticos finais corda SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS" + FeedEntry . TABLE_NAME ;

Assim como os arquivos que voc salvar no dispositivo de armazenamento interno , Android armazena em seu banco de dados privado de espao em disco que est aplicativo associado. Seus dados esto seguros, porque, por padro nesta rea no acessvel a outros aplicativos. Um conjunto til de APIs est disponvel no SQLiteOpenHelper classe. Quando voc usa essa classe para obter referncias para o seu banco de dados, o sistema executa as operaes potencialmente longa durao de criar e atualizar o banco de dados somente quando necessrio, e no durante a inicializao do aplicativo . Tudo que voc precisa fazer chamar getWritableDatabase () ou getReadableDatabase () . Nota: Porque eles podem ser de longa durao, no se esquea que voc chama getWritableDatabase ()ou getReadableDatabase () em uma discusso de fundo, como com AsyncTask ou IntentService . Para usar SQLiteOpenHelper , criar uma subclasse que substitui o onCreate () , ONUPGRADE () e onOpen () mtodos de callback. Voc tambm pode querer implementar onDowngrade () , mas no necessrio. Por exemplo, aqui est uma implementao do SQLiteOpenHelper que usa alguns dos comandos mostrados acima:
pblico classe FeedReaderDbHelper extends SQLiteOpenHelper { / / Se voc alterar o esquema de banco de dados, voc deve incrementar o banco de dados

Esta base de dados apenas um cache de dados on-line, pelo que a sua poltica de atualizao / / para simplesmente descartar os dados e comear

Para acessar o banco de dados, instanciar a subclasse de SQLiteOpenHelper :


FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper ( getContext ());

Colocar informao em um banco de dados


Inserir dados no banco de dados por meio de um ContentValues objeto para o insert () mtodo:
/ / Obtm o repositrio de dados em modo de gravao SQLiteDatabase db = mDbHelper . getWritableDatabase (); / / Cria um novo mapa de valores, onde os nomes das colunas so os

Inserir a nova linha, retornando o valor da chave primria da nova linha longo newRowId ; newRowId = db . insert ( FeedEntry . TABLE_NAME , FeedEntry . COLUMN_NAME_NULLABLE , valores );

O primeiro argumento para insert () simplesmente o nome da tabela. O segundo argumento fornece o nome de uma coluna em que o quadro pode inserir NULL no caso em que os ContentValues est vazia (se voc, em vez este conjunto de "null" , ento o quadro no ir inserir uma linha quando no h valores).

Ler as informaes de um banco de dados


Para ler a partir de um banco de dados, use a query () mtodo, passando os critrios de seleo e colunas desejadas. O mtodo combina elementos de insert () e update () , exceto a lista coluna define os dados que deseja buscar, em vez de os dados a inserir. Os resultados da consulta so retornados a voc em umCursor objeto.

SQLiteDatabase db = mDbHelper . getReadableDatabase (); / / Define uma projeo que especifica quais colunas do banco de dados / / voc vai realmente usar depois desta

Como voc quer que os resultados classificados na Cursor resultando Cordas sortOrder = FeedEntry . COLUMN_NAME_UPDATED + "DESC" ; Cursor c = db . consulta ( FeedEntry . TABLE_NAME , de projeo , a seleo , selectionArgs , nulo , nulo , sortOrder ); / / A tabela de consulta / / As colunas para retornar / / As colunas para a clusula WHERE / / Os valores para a clusula WHERE / / no do grupo de linhas / / no filtro por grupos de linhas / / A ordem de classificao

Olhar para uma linha no cursor, use um dos Cursor mtodos de movimentao, que voc deve sempre chamar antes de comear a leitura de valores. Geralmente, voc deve comear por vocao MoveToFirst () , que coloca a "posio de leitura" na primeira entrada nos resultados. Para cada linha, voc pode ler o valor de uma coluna, chamando um dos Cursor obter mtodos, como getString () ou getLong () . Para cada um dos mtodos get, voc deve passar a posio de ndice da coluna que voc deseja, que voc pode obter pelo telefonegetColumnIndex () ou getColumnIndexOrThrow () . Por exemplo:
cursor . MoveToFirst (); longo itemId = cursor . getLong ( cursor . getColumnIndexOrThrow ( FeedEntry . _ID ) );

Excluir informaes de um banco de dados


Para excluir linhas de uma tabela, voc precisar fornecer critrios de seleco que identificam as linhas. A API de banco de dados fornece um mecanismo para a criao de critrios de seleo que protege contra injeo de SQL. O mecanismo divide a especificao de seleo em uma clusula de seleo e os argumentos de seleo.A clusula define as colunas para olhar, e tambm permite que voc combine ensaios de coluna. Os argumentos so os valores para testar contra os algemados na clusula. Porque o resultado no tratado da mesma como uma declarao SQL regular, ele imune a injeo de SQL.
/ / Define 'onde' parte da consulta. Cordas seleo = FeedEntry . COLUMN_NAME_ENTRY_ID + "Como?" ; / / Especificar argumentos a fim de espao reservado. seqncia [] selectionArgs = { cordas . valueOf ( ROWID ) }; instruo SQL / / Edio. db . apagar ( table_name , seleo , selectionArgs );

Atualizar um banco de dados


Quando voc precisar modificar um subconjunto de valores do banco de dados, use o update () mtodo. Atualizar a tabela combina os valores de contedo sintaxe insert () com o qual a sintaxe de delete () .
SQLiteDatabase db = mDbHelper . getReadableDatabase (); / / Novo valor para uma coluna contentValues valores = new ContentValues (); valores . colocar ( FeedEntry . COLUMN_NAME_TITLE , ttulo ); / / Que linha de atualizao, com base na identificao de Cordas seleo = FeedEntry . COLUMN_NAME_ENTRY_ID + "COMO

Interagindo com outros Apps


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Conhecimento bsico do ciclo de vida de atividades (consulte Gerenciando o Ciclo de Vida de Atividade )

VOC TAMBM DEVE LER


Compartilhando contedo Integrao de aplicativos com Intenes (blog post) Intenes e inteno Filtros

Um aplicativo Android normalmente tem vrias atividades .Cada atividade apresenta uma interface de usurio que permite ao usurio realizar uma tarefa especfica (por exemplo, visualizar uma mapa ou tirar uma foto). Para levar o usurio a partir de uma atividade para outra, o aplicativo deve usar umIntent para definir a "inteno" de seu aplicativo para fazer alguma coisa. Quando voc passar um Intent para o sistema com um mtodo como startActivity () , o sistema utiliza ainteno de identificar e iniciar o componente aplicativo apropriado. Usando intenes ainda permite que seu aplicativo para iniciar uma atividade que est contido em um aplicativo separado. Uma Inteno pode ser explcita , a fim de iniciar um componente especfico (um especfico Atividade exemplo) ou implcita , a fim de iniciar qualquer componente que pode lidar com a ao pretendida (como "tirar uma foto"). Esta classe mostra como usar um Intent para executar algumas interaes bsicas com outros aplicativos, como iniciar outro aplicativo, receber um resultado de que o app, e fazer o seu aplicativo capaz de responder s intenes de outros apps.

Lies

Enviar o usurio para outro aplicativo Mostra como voc pode criar intenes implcitas para lanar outros aplicativos que podem executar uma ao. Conseguir um resultado de uma atividade Mostra como iniciar outra atividade e receber o resultado da atividade. Permitindo que outros aplicativos para iniciar sua atividade Mostra como fazer as atividades em seu aplicativo aberto para uso por outros aplicativos, definindo filtros inteno que declaram as intenes implcitas seu aplicativo aceita.

Enviar o usurio para outro aplicativo


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Construir uma Intent implcita 2. Verifique H um App para receber a Inteno 3. Iniciar uma atividade com a inteno 4. Mostrar uma App Chooser

VOC TAMBM DEVE LER


Compartilhando contedo

Um dos recursos mais importantes do Android a capacidade de um aplicativo para enviar o usurio para outro aplicativo baseado em uma "ao" que gostaria de realizar. Por exemplo, se seu aplicativo tem o endereo de um negcio que voc gostaria de mostrar em um mapa, voc no tem que construir uma atividade em seu aplicativo que mostra um mapa. Em vez disso, voc pode criar uma solicitao para exibir o endereo usando um Intent . O sistema Android, em seguida, comea um aplicativo que capaz de mostrar o endereo em um mapa. Como explicado na primeira classe, construir o seu primeiro aplicativo , voc deve usar as intenes para navegar entre as atividades em seu prprio aplicativo. Voc geralmente o fazem com uma inteno explcita , que define o nome da classe exata do componente que voc deseja iniciar. No entanto, quando voc quer ter um aplicativo separado executar uma ao, como "ver um mapa", voc deve usar uma inteno implcita . Esta lio mostra como criar uma inteno implcita de uma ao particular, e como us-lo para iniciar uma atividade que executa a ao em outro aplicativo.

Construir uma Intent implcita


Intenes implcitas no declarar o nome da classe do componente para comear, mas declarar uma ao para executar. A ao especifica a coisa que voc quer fazer, como viso , editar , enviar ou receber alguma coisa.Intenes, muitas vezes tambm incluem dados associados com a ao, tais como o endereo que voc deseja ver, ou o e-mail que voc quer enviar. Dependendo da inteno que voc deseja criar, os dados podem ser umUri , um dos vrios outros tipos de dados, ou a inteno pode no precisar de dados em tudo. Se os dados um Uri , h uma simples Intent () construtor voc pode usar definir a ao e dados. Por exemplo, aqui como criar a inteno de iniciar uma chamada telefnica utilizando os Uri dados para especificar o nmero de telefone:

Uri nmero = Uri . parse ( "tel: 5551234" ); Inteno callIntent = new Intent ( Inteno . ACTION_DIAL , nmero );

Quando seu aplicativo chama essa inteno, chamando startActivity () , o app do telefone inicia uma chamada para o nmero de telefone indicado. Aqui esto algumas outras intenes e sua ao e Uri pares de dados:

Ver um mapa:
/ / Ponto Mapa baseado no endereo Uri localizao = Uri . parse ( "geo:? 0,0 q = 1600 + + Amphitheatre Parkway, + montanha + View, Califrnia +" ); / / ou ponto de mapa com base na latitude / longitude / / Uri location = Uri.parse ("geo:? 37,422219, -122,08364 z = 14") / / z param zoom nvel Inteno mapIntent = new Intent ( Inteno . ACTION_VIEW , localizao );

Visualizar uma pgina web:


Uri webpage = Uri.parse("http://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

Outros tipos de intenes implcitas exigem dados "extras" que oferecem diferentes tipos de dados, como uma string. Voc pode adicionar uma ou mais partes de dados adicionais utilizando as diversas putExtra ()mtodos. Por padro, o sistema determina o tipo MIME apropriado exigido por uma inteno baseada na Uri dados que est includo. Se voc no incluir um Uri na inteno, voc deve geralmente usar SetType () para especificar o tipo de dados associados com a inteno. Definindo o tipo MIME especifica ainda que os tipos de atividades devem receber a inteno. Aqui esto mais algumas intenes que agregam dados adicionais para especificar a ao desejada:

Enviar um e-mail com um anexo:


Inteno emailIntent = new Intent ( Inteno . ACTION_SEND ); / / A inteno no tem uma URI, para declarar a "text / plain" MIME destinatrios emailIntent . putExtra ( Intent . EXTRA_SUBJECT , "sujeito-mail" ); emailIntent . putExtra ( Intent . EXTRA_TEXT , "o texto da mensagem e-mail" ); emailIntent . putExtra ( Intent . EXTRA_STREAM , Uri . parse ( "content :/ / path / to / email / attachment " )); / / Voc tambm pode anexar vrios itens passando um ArrayList de Uris

Criar um evento de calendrio:

class " ); calendarIntent . putExtra ( Events . EVENT_LOCATION ,

"Secret dojo" );

Nota: Esta inteno para um evento no calendrio compatvel apenas com nvel API 14 e superior.

Nota: importante que voc defina sua inteno de ser o mais especfico possvel. Por exemplo, se voc quiser exibir uma imagem usando o ACTION_VIEW inteno, voc deve especificar um tipo MIME de image / * . Isso evita que aplicativos que podem "ver" outros tipos de dados (como um aplicativo de mapa) de ser desencadeada pela inteno.

Verifique H um App para receber a Inteno


Embora a plataforma Android garante que certas intenes vai resolver um dos aplicativos internos (como o telefone, email, ou Calendar app), voc deve sempre incluir uma etapa de verificao antes de invocar uma inteno. Ateno: Se voc chamar uma inteno e no h nenhum aplicativo disponvel no dispositivo que pode lidar com a inteno, o aplicativo ir falhar. Para verificar se h uma atividade disponvel que pode responder inteno, chamadaqueryIntentActivities () para obter uma lista de atividades capazes de lidar com a sua inteno . Se o retornou lista no estiver vazia, voc pode usar com segurana a inteno. Por exemplo:
PackageManager packageManager = getPackageManager(); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0); boolean isIntentSafe = activities.size() > 0;

Se isIntentSafe verdadeiro , ento pelo menos um aplicativo ir responder inteno. Se for falsa , ento no h qualquer apps para lidar com o intento. Nota: Voc deve executar essa verificao quando sua atividade comea pela primeira vez em caso de necessidade de desativar o recurso que usa a inteno antes de o utilizador tentar us-lo. Se voc souber de um aplicativo especfico que pode lidar com a inteno, voc tambm pode fornecer um link para o usurio baixar o aplicativo (veja como a ligao para o seu produto no Google Play ).

Iniciar uma atividade com a inteno

Figura 1. Exemplo de caixa de dilogo de seleo que aparece quando mais de um aplicativo pode lidar com uma inteno.

Depois de ter criado sua Inteno e definir a informao extra, chamarstartActivity () para envi-lo para o sistema. Se o sistema identifica mais de uma atividade que pode lidar com a inteno, ele exibe uma caixa de dilogo para que o usurio selecione qual aplicativo usar, como mostrado na figura 1. Se houver apenas uma actividade que manipula a inteno, o sistema comea imediatamente.

startActivity ( inteno );

Aqui est um exemplo completo que mostra como criar uma inteno de ver um mapa, verifique se existe um app para lidar com a inteno, ento inicie-o:
/ / Construir o

Verific-lo

Iniciar uma atividade se seguro se ( isIntentSafe ) { startActivity ( mapIntent ); }

Mostrar uma App Chooser

Figura 2. Exemplo de caixa de dilogo selecionador que aparece quando voc usa createChooser () para garantir que o usurio sempre mostrada uma lista de aplicativos que respondem a sua inteno.

Observe que quando voc iniciar uma atividade, passando a sua Intenopara startActivity () e h mais de um aplicativo que responde inteno, o usurio pode selecionar qual aplicativo usar como padro (selecionando a caixa de seleo na parte inferior da caixa de dilogo; ver figura 1). Isso bom quando executar uma ao para que o usurio geralmente quer usar o mesmo aplicativo de cada vez, como quando se abre uma pgina web (usurios provavelmente usar apenas um navegador da Web) ou tirar uma foto (os usurios provavelmente preferem uma cmera).No entanto, se a ao a ser executada pode ser tratado por vrios aplicativos eo usurio pode preferir um aplicativo diferente de cada vez, como uma ao de "share", para o qual os usurios podem ter vrias aplicaes atravs do qual eles podem compartilhar um item, voc deve mostrar explicitamente um dilogo selecionador, o que obriga o usurio selecione qual aplicativo usar para a ao de cada vez (o usurio no pode selecionar um aplicativo padro para a ao).

Para mostrar o seletor, criar um Intent usando createChooser () e pass-lo para startActivity () . Por exemplo:
Inteno inteno = ... new Intent ( Inteno . ACTION_SEND );

/ / Sempre usar os recursos de cadeia para texto UI. Isso diz algo como "Compartilhe essa foto com" Cordas title = getResources (). getText ( R . corda . chooser_title ); / / Criar e iniciar o seletor de Inteno chooser = Inteno . createChooser ( inteno , ttulo ); startActivity ( seletor );

Isso exibe uma caixa de dilogo com uma lista de aplicativos que respondem inteno passado para ocreateChooser () mtodo e usa o texto fornecido como o ttulo de dilogo.

Conseguir um resultado de uma atividade


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Comece o Activity 2. Receber o resultado

VOC TAMBM DEVE LER


Compartilhando contedo

Iniciar outra atividade no tem que ser s de ida. Voc tambm pode iniciar uma outra atividade e receber um resultado de volta. Para receber o resultado, liguestartActivityForResult () (em vez de startActivity ()). Por exemplo, seu aplicativo pode iniciar um aplicativo da cmera e receber a foto capturada como resultado. Ou, voc pode iniciar o aplicativo de pessoas para que o usurio selecione um contato e voc receber os dados de contato como resultado. Naturalmente, a actividade que responde deve ser concebida para retornar um resultado. Quando isso acontecer, ele envia o resultado como outro Inteno objeto. Sua atividade recebe no onActivityResult ()callback. Nota: Voc pode usar as intenes explcitas ou implcitas quando voc chamar startActivityForResult () . Ao iniciar uma de suas prprias atividades para receber um resultado, voc deve usar uma inteno explcita de assegurar que voc receba o resultado esperado.

Comece o Activity
No h nada especial sobre a Inteno objeto que voc usa quando se inicia uma atividade para um resultado, mas voc precisa passar um argumento inteiro adicional para o startActivityForResult () mtodo.

O argumento inteiro um "cdigo de pedido", que identifica o seu pedido. Quando voc recebe o resultadoInteno , o callback fornece o mesmo cdigo de pedido para que seu aplicativo pode identificar corretamente o resultado e determinar a forma de lidar com isso. Por exemplo, aqui como comear uma atividade que permite ao usurio escolher um contato:
static final, int PICK_CONTACT_REQUEST = 1 ; / / A pedido

Mostrar usurio somente os contatos c / nmeros de telefone startActivityForResult ( pickContactIntent , PICK_CONTACT_REQUEST ); }

Receber o resultado
Quando o usurio feito com a atividade e retorna posteriormente, o sistema chama de sua atividadeonActivityResult () mtodo. Este mtodo inclui trs argumentos:

O cdigo de pedido passado para startActivityForResult () . Um cdigo de resultado especificado pela segunda atividade. Isto tanto RESULT_OK se a operao foi bem sucedida ou RESULT_CANCELED se o usurio desistiu ou a operao falhou por algum motivo. Uma Inteno que carrega os dados do resultado.

Por exemplo, aqui est como voc pode manipular o resultado para a "pegar um contato" inteno:
@ Override protegido vazio onActivityResult ( int requestCode , int resultCode , Inteno de dados ) { / / Verifica qual solicitao estamos respondendo a se ( requestCode == PICK_CONTACT_REQUEST ) { / / Certifique-se que o pedido foi bem sucedido se ( resultCode == RESULT_OK ) { / / O usurio escolheu um contato. / / Uri dados do Inteno identifica que o contato foi selecionado. / / Faa algo com o contato aqui (exemplo maior abaixo) } } }

Neste exemplo, o resultado Inteno retornado por contatos do Android ou APP Pessoas oferece um contedoUri que identifica o contato do usurio selecionado. A fim de lidar com sucesso o resultado, voc deve entender o que o formato do resultado Inteno ser. Fazer isso fcil quando a atividade retornando um resultado uma de suas prprias atividades. Apps includo com a plataforma Android oferecer sua prpria APIs que voc pode contar para os dados de resultado especfico.Por exemplo, as pessoas app (aplicativo Contatos em algumas verses mais antigas) sempre retorna um resultado com o contedo URI que identifica o contato selecionado, eo app Camera retorna um Bitmap em"dados" extra (consulte a classe sobre a captura de fotos ).

Bonus: ler os dados de contato


O cdigo acima mostra como obter um resultado do app Pessoas no entrar em detalhes sobre como realmente ler os dados do resultado, porque requer uma discusso mais avanada sobre os provedores de contedo . No entanto, se voc estiver curioso, aqui vai um pouco mais de cdigo que mostra como consultar os dados do resultado para obter o nmero de telefone do contato selecionado:
@ Override protegido vazio onActivityResult ( int requestCode , int resultCode , Inteno de dados ) { / / Verifica qual pedido que estamos respondendo a se ( requestCode == PICK_CONTACT_REQUEST ) { / / Certifique-se que o pedido foi bem sucedido se ( resultCode == RESULT_OK ) { / / Pega a URI que aponta para o contato selecionado Uri contactUri = dados . getData (); / / Precisamos apenas a coluna de nmero, porque haver apenas uma linha no resultado de Cordas [] projeo = { telefone . NMERO }; / / Execute a consulta no contato para obter o nmero da coluna / / Ns no precisamos de uma seleo ou ordenao (h apenas um resultado para um determinado URI) / / ATENO: O mtodo query () deve ser chamado de um segmento separado para evitar o bloqueio / / thread da interface do usurio do aplicativo. (Para simplicidade do exemplo, este cdigo no faz isso.) / / Considere o uso de CursorLoader para executar a

Recuperar o nmero de telefone o nmero da coluna int coluna = cursor . getColumnIndex ( telefone . NMERO ); Cordas nmero = cursor . getString ( coluna ); / / Faa algo com o nmero de telefone ... } } }

Nota: Antes de Android 2.3 (nvel API 9), realizando uma consulta no Contatos Provider (como a mostrada acima) requer que seu aplicativo declarar a READ_CONTACTS permisso (ver Segurana e permisses ). No entanto, comeando com o Android 2.3, os contatos / app Pessoas concede seu aplicativo uma permisso temporria para ler o Contatos Provider quando ele retorna um resultado. A permisso temporria aplica-se apenas para o contato especfico solicitado, ento voc no pode consultar um contato diferente daquele especificado pela inteno de Uri , a menos que voc declare o READ_CONTACTS permisso.

Permitindo que outros aplicativos para iniciar sua atividade


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Adicionar um filtro de Inteno 2. Lidar com a Inteno em sua atividade 3. Retornar um resultado

VOC TAMBM DEVE LER


Compartilhando contedo

As duas lies anteriores focado em um lado da histria: a partir de atividade de outro aplicativo do seu aplicativo. Mas se o seu aplicativo pode executar uma ao que pode ser til para outro aplicativo, o aplicativo deve estar preparado para responder s solicitaes de ao de outros apps. Por exemplo, se voc criar um aplicativo social que pode compartilhar mensagens ou fotos com amigos do usurio, no seu melhor interesse para apoiar o ACTION_SEND inteno para que os usurios podem iniciar uma ao de "share" de outro aplicativo e lanar seu aplicativo para executar a ao . Para permitir que outros aplicativos para iniciar a sua atividade, voc precisa adicionar um <intentfilter>elemento em seu arquivo de manifesto para o correspondente <activity> elemento. Quando o aplicativo instalado em um dispositivo, o sistema identifica os filtros de inteno e adiciona as informaes de um catlogo interno de intenes suportado por todos os aplicativos instalados. Quando um aplicativo chama startActivity () ou startActivityForResult () , com a inteno implcita, o sistema encontra que a atividade (ou atividades) pode responder inteno.

Adicionar um filtro de Inteno


Para definir corretamente qual intentos sua atividade pode manipular, filtrar cada inteno de adicionar deve ser o mais especfico possvel em termos do tipo de ao e dados da atividade aceita. O sistema pode enviar um determinado Inteno de uma atividade se que a atividade tem um filtro de inteno de preencher os seguintes critrios de Inteno objeto: Ao Um string com o nome da ao a ser executada. Normalmente, um dos valores plataforma definidos comoACTION_SEND ou ACTION_VIEW . Especifique isso no seu filtro inteno com o <action> elemento. O valor especificado neste elemento deve ser o nome da seqncia completa para a ao, em vez da constante API (veja os exemplos abaixo). Dados Uma descrio dos dados associados com a inteno. Especifique isso no seu filtro inteno com o <dados> elemento. Usando um ou mais atributos deste elemento, voc pode especificar apenas o tipo MIME, apenas um prefixo URI, apenas um esquema de URI, ou uma combinao destes e outros que indicam o tipo de dados aceito. Nota: Se voc no precisa declarar detalhes sobre os dados Uri (como quando sua atividade alas para outro tipo de dados "Extra", em vez de uma URI), voc deve especificar apenas o android: mimeTypeatributo para declarar o tipo dos dados de sua atividade lida, como text / plain ou image / jpeg . Categoria Fornece uma maneira adicional para caracterizar a atividade manusear a inteno, normalmente relacionados com o gesto do usurio ou local de onde ele comeou. Existem vrias categorias diferentes suportados pelo sistema, mas a maioria so raramente utilizadas. No entanto, todas as intenes implcitas so definidos com CATEGORY_DEFAULT por padro. Especifique isso no seu filtro inteno com o <category> elemento.

Em seu filtro de inteno, voc pode declarar quais os critrios que sua atividade aceita, declarando cada uma delas com elementos XML correspondentes aninhados no <intentfilter> elemento. Por exemplo, aqui est uma atividade com um filtro de inteno que manipula o ACTION_SEND inteno quando o tipo de dados texto ou uma imagem:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>

Cada inteno de entrada especifica apenas uma ao e um tipo de dados, mas no h problema em declarar vrias instncias do <action> , <category> e <data> elementos em cada <intent-filter> . Se quaisquer dois pares de ao e os dados so mutuamente exclusivos em seus comportamentos, voc deve criar filtros inteno separadas para especificar quais aes so aceitveis quando emparelhado com que tipos de dados. Por exemplo, suponha que sua atividade lida com texto e imagens, tanto para o ACTION_SEND eACTION_SENDTO intenes. Neste caso, voc deve definir dois filtros inteno separados para as duas aes porque a ACTION_SENDTO inteno de utilizar os dados de Uri para especificar o endereo do destinatrio usando o envio ou sendto esquema de URI. Por exemplo:
<Atividade android: name = "ShareActivity" > ! <- filtro para o envio de texto; aceita ao SENDTO com esquemas URI sms

filtrar por enviar mensagens de texto ou de imagens; aceita ENVIAR ao e texto ou imagem dados

Nota: Para receber as intenes implcitas, voc deve incluir o CATEGORY_DEFAULT categoria no filtro de inteno. Os mtodos startActivity () e startActivityForResult () tratar todos os efeitos como se continha o CATEGORY_DEFAULT categoria. Se voc no declar-lo, sem intenes implcitas ir resolver a sua atividade. Para mais informaes sobre envio e recebimento de ACTION_SEND intenes que realizam comportamentos de compartilhamento social, ver a lio sobre o recebimento de contedo de outros aplicativos .

Lidar com a Inteno em sua atividade


A fim de decidir qual ao tomar em sua atividade, voc pode ler a Inteno que foi usado para inici-lo. Como sua atividade comea, ligue getIntent () para recuperar o Intent que comeou a atividade. Voc pode faz-lo a qualquer momento durante o ciclo de vida da atividade, mas geralmente voc deve faz-lo durante os primeiros retornos de chamada, como onCreate () ou onStart () . Por exemplo:

Obter a inteno que comeou essa atividade Inteno inteno = getIntent (); Uri dados = inteno . getData (); / / Descobrir o que fazer com base no tipo de inteno se ( inteno . getType . () indexOf ( "image /" ) ! = - 1 ) { / / Pega intenes com dados de imagem ... } mais se ( inteno . getType (). iguais ( "text / plain" )) { / / Pega intenes com o texto ... } }

Retornar um resultado
Se voc quiser retornar um resultado para a atividade que invocou o seu, basta ligar para SetResult () para especificar o cdigo de resultado e resultado Intent . Quando a operao feita e que o usurio deve retornar atividade original, ligue para terminar () para fechar (e destruir) sua atividade. Por exemplo:
/ / Cria a inteno de entregar algum tipo de resultado

Voc sempre deve especificar um cdigo de resultado com o resultado. Geralmente, tanto RESULT_OK ouRESULT_CANCELED . Voc pode, ento, fornecer dados adicionais com uma inteno , conforme necessrio. Nota: O resultado est definido para RESULT_CANCELED por padro. Assim, se o usurio pressionar o Voltaboto antes de completar a ao e antes de definir o resultado, a atividade original recebe o resultado "cancelada". Se voc s precisa retornar um nmero inteiro que indica uma das vrias opes de resultado, voc pode definir o cdigo de resultado para qualquer valor maior que 0. Se voc usar o cdigo

de resultado para entregar um inteiro e voc no precisa incluir a Intent , voc pode chamar SetResult () e passar apenas um cdigo de resultado. Por exemplo:
SetResult ( RESULT_COLOR_RED ); acabamento ();

Neste caso, pode haver apenas um pequeno nmero de resultados possveis, de modo que o cdigo de resultado um nmero inteiro definido localmente (superior a 0). Isso funciona bem quando voc est retornando um resultado de uma atividade em seu prprio aplicativo, pois a atividade que recebe o resultado pode fazer referncia ao constante pblica para determinar o valor do cdigo de resultado. Nota: No h necessidade de verificar se a atividade foi iniciada com startActivity () oustartActivityForResult () . Basta ligar para SetResult () se a inteno que comeou sua atividade poderia esperar um resultado. Se a atividade originria tinha chamado startActivityForResult () , ento o sistema oferece o resultado que voc fornecer para SetResult () , caso contrrio, o resultado ignorado.

Compartilhando contedo
COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 1.0 ou superior (maiores exigncias quando indicado) A experincia com as intenes e Inteno Filtros

Uma das grandes coisas sobre os aplicativos do Android a sua capacidade de se comunicar e se integrar com os outros.Por que reinventar a funcionalidade que no essencial para a sua aplicao quando j existe em outra aplicao? Esta classe cobre alguns aspectos comuns que voc pode enviar e receber contedo entre aplicativos usando IntenoAPIs eo ActionProvider objeto.

Lies
O envio de contedo para outros Apps Aprenda a configurar seu aplicativo para ser capaz de enviar mensagens de texto e dados binrios para outras aplicaes com intentos. Receber contedo de outros aplicativos Aprenda a configurar seu aplicativo para receber texto e dados binrios de intenes. Adicionando uma Easy Share Ao Saiba como adicionar um "share" item de ao para a sua barra de ao.

O envio de contedo para outros Apps


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A

1. Enviar texto contedo 2. Enviar contedo binrio 3. Enviar vrias peas de contedo

VOC TAMBM DEVE LER


Intenes e inteno Filtros

Quando voc constri uma inteno, voc deve especificar a ao que deseja a inteno de "provocar". Android define uma srie de aes, incluindo ACTION_SEND que, como voc provavelmente pode adivinhar, indica que a inteno enviar dados a partir de uma atividade para outra, mesmo para alm das fronteiras do processo. Para enviar dados para uma outra atividade, tudo que voc precisa fazer especificar os dados e seu tipo, o sistema ir identificar as atividades que recebem compatveis e exibi-las para o usurio (se houver vrias opes) ou iniciar imediatamente a atividade (se houver apenas uma opo). Da mesma forma, voc pode anunciar os tipos de dados que suas atividades de apoio que receberam de outros aplicativos, especificando-os em seu manifesto. Envio e recebimento de dados entre aplicaes com intenes mais comumente usado para compartilhamento social de contedo. Intenes permitem aos usurios compartilhar informaes de forma rpida e fcil, usando seus aplicativos favoritos. Nota: A melhor maneira de adicionar um item de ao social para uma ActionBar usarShareActionProvider , que se tornou disponvel em nvel de API 14. ShareActionProvider discutida na lio sobre a adio de um Easy Share ao .

Enviar texto contedo

Figura 1. Tela de ACTION_SENDseletor com a inteno de um aparelho.

O uso mais simples e comum do ACTION_SEND ao o envio de contedo de texto a partir de uma atividade para outra. Por exemplo, o aplicativo do navegador embutido pode compartilhar a URL da pgina atualmente exibida como texto com qualquer aplicao. Isso til para compartilhar um artigo ou website com os amigos via e-mail ou redes sociais. Aqui est o cdigo para implementar este tipo de compartilhamento:

o meu texto para enviar. " ); sendIntent . SetType ( "text / plain" ); startActivity ( sendIntent );

Se h um aplicativo instalado com um filtro que combine ACTION_SEND e tipo MIME text / plain, o sistema Android vai execut-lo, se mais de um jogos de aplicao, o sistema exibe uma caixa de dilogo disambiguation (um "seletor"), que permite ao usurio escolher um aplicativo. Se voc chamar Intent.createChooser () para a inteno, o Android ir sempre exibir o seletor. Isto tem algumas vantagens:

Mesmo que o usurio tenha selecionado anteriormente uma ao padro para esse intento, o seletor ainda ser exibida. Se no corresponder aplicaes, o Android exibe uma mensagem do sistema. Voc pode especificar um ttulo para o dilogo Seletor.

Aqui est o cdigo atualizado:

o meu texto para

A janela resultante mostrado na figura 1. Opcionalmente, voc pode definir alguns extras padro para a inteno: EXTRA_EMAIL , EXTRA_CC , EXTRA_BCC, EXTRA_SUBJECT . No entanto, se receber o pedido no foi projetado para us-los, nada vai acontecer. Voc pode usar extras personalizados, bem como, mas no h nenhum efeito a menos que o aplicativo receptor entende. Normalmente, voc usaria extras personalizados definidos pelo prprio aplicativo de recebimento. Nota: Alguns aplicativos de e-mail, como o Gmail, esperar um String [] para extras como EXTRA_EMAIL eEXTRA_CC , uso putExtra (String, String []) para adicion-los sua inteno.

Enviar contedo binrio


Os dados binrios compartilhada usando o ACTION_SEND ao combinada com a criao do tipo MIME apropriado e colocar o URI para os dados em uma chamada extra de EXTRA_STREAM . Isto comumente usado para compartilhar uma imagem, mas pode ser usado para compartilhar qualquer tipo de contedo binrio:
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

Observe o seguinte:

Voc pode usar um tipo de MIME "* / *" , mas isso s ir corresponder a atividades que sejam capazes de lidar com fluxos de dados genricos. A aplicao precisa receber permisso para acessar os dados das Uri aponta. H um certo nmero de maneiras de lidar com isto:
o

Gravar os dados em um arquivo no armazenamento externo / shared (como o carto SD), que todos os aplicativos podem ler. Use Uri.fromFile () para criar o Uri que pode ser passado para a inteno partes. No entanto, tenha em mente que nem todas as aplicaes de processamento de um file :/ /estilo Uri . Gravar os dados em um arquivo em seu prprio diretrio de aplicativos usando openFileOutput () com o modo MODE_WORLD_READABLE depois que getFileStreamPath () pode ser usado para retornar umarquivo . Assim como a opo anterior, Uri.fromFile () ir criar um file :/ / estilo Uri para o seu intento partes. Os arquivos de mdia, como imagens, vdeos e udio podem ser digitalizados e adicionados ao sistemaMediaStore usando SCANFILE () . O onScanCompleted () callback retorna um contedo :/ / estiloUri adequado para incluir na sua inteno partes. As imagens podem ser inseridas no sistema MediaStore usando InsertImage () que ir retornar umcontedo :/ / estilo Uri adequado para incluso num inteno partes. Armazenar os dados em seu prprio ContentProvider , certifique-se de que outros aplicativos tm a permisso correta para acessar o seu provedor (ou use permisses por URI ).

o o

Enviar vrias peas de contedo


Para compartilhar vrias peas de contedo, utilize o ACTION_SEND_MULTIPLE ao, juntamente com uma lista de URIs apontando para o contedo. O tipo MIME varia de acordo com o mix de contedo que voc est compartilhando. Por exemplo, se voc compartilhar trs imagens JPEG, o tipo ainda "image / jpeg" . Para uma mistura de tipos de imagem, deve ser "image / *" para coincidir com uma atividade que lida com qualquer tipo de imagem. Voc deve usar apenas "* / *" Se voc est compartilhando uma grande variedade de tipos. Como dito anteriormente, cabe aplicao de recepo para analisar e processar seus dados. Aqui est um exemplo:
ArrayList < Uri > imageUris = new ArrayList < Uri > (); imageUris . adicionar ( imageUri1 ); / / Adicionar sua imagem URIs

imagens para .. " ));

Como antes, certifique-se o disposto URIs apontam para dados que um aplicativo de recebimento pode acessar.

Receber contedo de outros aplicativos


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Atualize seu manifesto

2. Lidar com o contedo recebido

VOC TAMBM DEVE LER


Intenes e inteno Filtros

Assim como o aplicativo pode enviar dados para outros aplicativos, ele tambm pode facilmente receber dados de aplicativos. Pense em como os usurios interagem com a sua aplicao, e quais os tipos de dados que voc deseja receber de outros aplicativos. Por exemplo, um aplicativo de rede social seria, provavelmente, interessado em receber o contedo do texto, como uma URL web interessante, a partir de outro aplicativo. O aplicativo Google+ Android aceita tanto texto eimagens nicas ou mltiplas. Com este aplicativo, o usurio pode facilmente comear um novo post Google+ com fotos da Galeria app Android.

Atualize seu manifesto


Filtros inteno informar o sistema que as intenes um componente de aplicao est disposto a aceitar.Semelhante forma como voc construiu uma inteno com a ao ACTION_SEND no enviar contedo para outros aplicativos com as Intenes lio, voc cria filtros inteno, a fim de ser capaz de receber intenes com esta ao. Voc define um filtro de inteno em seu manifesto, usando o <intentfilter> elemento. Por exemplo, se seu aplicativo lida com o recebimento de contedo de texto, uma nica imagem de qualquer tipo, ou vrias imagens de qualquer tipo, o manifesto seria parecido com:
<Atividade android: name = ". ui.MyActivity" > <intent-filter> <Ao android: name = "android.intent.action.SEND" /> <Categoria android: name = "android.intent.category.DEFAULT" /> <Dados android: mimeType = "image / *" /> </ Intent-filter> <intent-filter> <Ao android: name = "android.intent.action.SEND" /> <Categoria android: name = "android.intent.category.DEFAULT" /> <Dados android: mimeType = "text / plain" /> </ Intent-filter> <intent-filter> <Ao android: name = "android.intent.action.SEND_MULTIPLE" /> <Categoria android: name = "android.intent.category.DEFAULT" /> <Dados android: mimeType = "image / *" /> </ Intent-filter> </ Atividade>

Nota: Para mais informaes sobre filtros de inteno e resoluo de inteno, por favor leia as intenes e Intent Filters Quando outro aplicativo tenta compartilhar qualquer uma dessas coisas atravs da construo de uma inteno e pass-la para startActivity () , a sua candidatura ser listado como uma opo no seletor de inteno. Se o usurio selecionar a sua aplicao, a atividade correspondente ( . ui.MyActivity no exemplo acima) ser iniciado. Cabe ento a voc a lidar com o contedo de forma adequada dentro de seu cdigo e interface do usurio.

Lidar com o contedo recebido


Para lidar com o contedo entregue por um Intent , comece chamando getIntent () para obter Intenoobjeto. Assim que tiver o objeto, voc pode examinar o seu contedo para determinar o que

fazer a seguir.Tenha em mente que, se essa atividade pode ser iniciado a partir de outras partes do sistema, como o lanador, ento voc ter que levar isso em considerao quando se examina a inteno.
vazio onCreate ( Bundle savedInstanceState ) ... / / Pega a inteno, ao e tipo MIME Inteno inteno = getIntent (); Cordas ao = inteno . getAction (); Cordas tipo = inteno . getType (); se {

} {

( Intent . ACTION_SEND . iguais ( ao ) && tipo ! = NULL ) { se ( "text / plain" . iguais ( tipo )) { handleSendText ( inteno ), texto / / Pega a ser enviado } mais se ( tipo . startsWith ( "image /" )) { handleSendImage ( inteno ); / / Handle nica imagem a ser enviada } mais se ( Intent . ACTION_SEND_MULTIPLE . iguais ( ao ) && tipo ! = NULL ) se

( tipo . startsWith ( "image /" )) { handleSendMultipleImages ( inteno ); / / Lidar com vrias imagens que esto sendo enviados } } mais { / / Lidar com outras intenes, como sendo iniciado a partir da tela inicial } ... } vazio handleSendText ( Inteno inteno ) { Cordas sharedText = inteno . getStringExtra ( Intent . EXTRA_TEXT ); se ( sharedText ! = nulo ) { / / Atualizao da interface do usurio para refletir o texto que est sendo compartilhado } } vazio handleSendImage ( Inteno inteno ) { Uri imageUri = ( Uri ) inteno . getParcelableExtra ( Intent . EXTRA_STREAM ); se ( imageUri ! = nulo ) { / / Atualizao da interface do usurio para refletir a imagem que est sendo compartilhado } } vazio handleSendMultipleImages ( Inteno inteno ) { ArrayList < Uri > imageUris = inteno . getParcelableArrayListExtra ( Intent . EXTRA_STREAM ); se ( imageUris ! = nulo ) { / / Atualizao da interface do usurio para refletir vrias imagens que esto sendo compartilhados } }

Ateno: Tome cuidado extra para verificar os dados de entrada, voc nunca sabe o que algum outro aplicativo pode enviar-lhe. Por exemplo, o tipo MIME errado pode ser definido, ou a imagem a ser enviada pode ser extremamente grande. Alm disso, lembre-se de processar dados binrios em um segmento separado ao invs do principal thread ("UI"). Atualizando a interface do usurio pode ser to simples como preencher um EditText , ou pode ser mais complicado, como a aplicao de um filtro foto interessante para uma imagem. realmente especfico para a sua aplicao o que acontece em seguida.

Adicionando uma Easy Share Ao


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Atualize declaraes do menu 2. Defina a Compartilhar Intent

VOC TAMBM DEVE LER


Barra de ao

Execuo de uma aco eficaz e amigvel partes usurio em sua ActionBar ainda mais fcil com a introduo deActionProvider em Android 4.0 (API Nvel 14). UmActionProvider , uma vez ligado a um item de menu na barra de ao, lida com a aparncia eo comportamento desse item.No caso de ShareActionProvider , voc fornece uma inteno de compartilhar e ele faz o resto. Nota: ShareActionProvider est disponvel a partir da API nvel 14 ou superior.

Figura 1. TheShareActionProvider no aplicativo Gallery.

Atualize declaraes do menu


Para comear com ShareActionProviders , definir o android: actionProviderClass atributo para o correspondente <item> em seurecurso de menu arquivo:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item_share" android:showAsAction="ifRoom" android:title="Share" android:actionProviderClass="android.widget.ShareActionProvider" /> ... </menu>

Esta responsabilidade delegados para a aparncia e funo do itemShareActionProvider . No entanto, voc ter que informar o provedor que voc gostaria de compartilhar.

Defina a Compartilhar Intent


Para que ShareActionProvider a funo, voc deve fornecer-lhe uma inteno de ao. Esta inteno partes deve ser o mesmo descrito no envio de contedo para outros aplicativos lio, com a ao ACTION_SEND e dados adicionais definido atravs extras como EXTRA_TEXT e EXTRA_STREAM . Para atribuir uma inteno partes, a primeira a encontrar o correspondente MenuItem enquanto inflar o recurso de menu em suaatividade ou fragmento . Em seguida, ligue para MenuItem.getActionProvider () para recuper uma instncia de ShareActionProvider . Use setShareIntent () para atualizar a inteno partes associado a esse item de ao. Aqui est um exemplo:

Inflar arquivo de recurso menu. getMenuInflater (). inflar ( R . cardpio . share_menu , cardpio ); / / Localiza MenuItem com ShareActionProvider MenuItem artigo = Menu . FindItem ( R . id . menu_item_share ); / / busca e armazenar ShareActionProvider mShareActionProvider = ( ShareActionProvider ) ponto . getActionProvider (); / / Retorna verdadeiro para exibir o menu de retorno verdadeiro ; } / / Chamada para atualizar a parcela

Voc s precisa definir a inteno partes uma vez durante a criao de seus menus, ou voc pode querer configur-lo e, em seguida, atualiz-lo com as mudanas de interface do usurio. Por exemplo, quando voc ver fotos em tela cheia na App Gallery, a partilha alteraes inteno como voc virar entre as fotos. Para uma discusso mais aprofundada sobre o ShareActionProvider objeto, consulte a Barra de aomanual.

Gerenciamento de reproduo de udio


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 2.0 (API nvel 5) ou superior Experincia com Mdia de reproduo

VOC TAMBM DEVE LER


Servios

Se o seu aplicativo reproduz udio, importante que os usurios podem controlar o udio de uma forma previsvel.Para garantir uma tima experincia de usurio, tambm importante que seu aplicativo gerencia o foco de udio para garantir vrios aplicativos no esto jogando de udio ao mesmo tempo. Aps esta aula, voc ser capaz de construir aplicativos que respondem ao hardware de udio teclas, que pedem foco de udio durante a reproduo de udio, e que respondem adequadamente a mudanas no foco de udio causadas pelo sistema ou outras aplicaes.

Lies

Controlar o volume e reproduo do seu App Saiba como garantir seus usurios podem controlar o volume do seu aplicativo usando o hardware ou software controles de volume e, quando disponvel o play, stop, pause, pular e anteriores de mdia teclas de reproduo. Gerenciando Foco udio Com vrios aplicativos potencialmente reproduzir udio importante pensar sobre como eles devem interagir. Para evitar qualquer aplicativo de msica tocando ao mesmo tempo, o Android usa o foco de udio para moderar a reproduo de udio. Saiba como solicitar o foco de udio, para ouvir uma perda de foco de udio, e como reagir quando isso acontece. Lidar com sada de udio Hardware O udio pode ser jogado a partir de um certo nmero de fontes. Aprenda a descobrir onde o udio est sendo reproduzido e como lidar com um fone de ouvido de ser desconectado durante a reproduo.

Controlar o volume e reproduo do seu App


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Identificar qual o fluxo de udio para usar 2. Use Hardware Teclas de Volume para controlar o volume de udio do seu aplicativo 3. Usar o hardware de reproduo Teclas de controle para controlar a reproduo de udio do seu aplicativo

VOC TAMBM DEVE LER


Mdia de reproduo

A boa experincia do usurio um previsvel um. Se o seu aplicativo reproduz mdias, importante que os usurios podem controlar o volume do seu aplicativo usando o hardware ou os controles do seu dispositivo de volume de software, bluetooth fone de ouvido ou fones de ouvido. Da mesma forma, onde o play, stop, pause, pular apropriado e disponvel, e anteriores de mdia teclas de reproduo deve exercer as respectivas aes no fluxo de udio usado pelo seu aplicativo.

Identificar qual o fluxo de udio para usar

O primeiro passo para a criao de uma experincia de udio previsvel entender qual o fluxo de udio do seu aplicativo ir usar. Android mantm um fluxo de udio em separado para a reproduo de msica, alarmes, notificaes, o toque de chamada recebida, os sons do sistema, o volume durante a chamada, e os tons DTMF. Isso feito principalmente para permitir aos usurios controlar o volume de cada fluxo de forma independente. A maioria destes fluxos so restritos a eventos do sistema, a menos que seu aplicativo um despertador de substituio, voc quase certamente estar jogando o udio usando o STREAM_MUSIC stream.

Use Hardware Teclas de Volume para controlar o volume de udio do seu aplicativo
Por padro, pressionando os controles de volume modificar o volume do fluxo de udio ativo. Se o seu aplicativo no est jogando nada, batendo as teclas de volume para ajustar o volume da campainha. Se voc tem um jogo ou aplicativo de msica, ento as chances so boas de que quando o usurio pressiona as teclas de volume que querem controlar o volume do jogo ou msica, mesmo se eles esto atualmente entre as msicas ou no h msica no atual local do jogo. Voc pode ser tentado a experimentar e ouvir teclas de volume e modificar o volume do fluxo de udio dessa forma. Resista tentao. Android oferece o prtico setVolumeControlStream () mtodo para tecla de volume diretos prensas para o fluxo de udio que voc especificar. Tendo identificado o fluxo de udio a sua aplicao vai usar, voc deve defini-lo como o alvo fluxo de volume.Voc deve fazer este apelo no incio do seu ciclo de vida do aplicativo, porque voc s precisa cham-lo de uma vez durante o ciclo de vida da atividade, voc normalmente deve cham-lo de dentro do onCreate () mtodo (da atividade ou fragmento que controla a mdia). Isso garante que sempre que o aplicativo visvel, os controles de volume funcionam como o usurio espera.
setVolumeControlStream ( AudioManager . STREAM_MUSIC );

A partir deste ponto, pressionando as teclas de volume no dispositivo afetar o fluxo de udio que voc especificar (neste caso, a "msica"), sempre que a atividade-fim ou fragmento visvel.

Usar o hardware de reproduo Teclas de controle para controlar a reproduo de udio do seu aplicativo

Mdia de reproduo botes como play, pause, stop, pular, e anteriores esto disponveis em alguns aparelhos e muitos fones de ouvido conectados ou sem fio. Sempre que um usurio pressiona uma das teclas de hardware, o sistema transmite uma inteno com o ACTION_MEDIA_BUTTON ao. Para responder a mdia cliques no boto, voc precisa registrar um BroadcastReceiver em seu manifesto que escuta essa ao transmitido como mostrado abaixo.
<receiver android:name=".RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver>

A prpria aplicao receptor precisa para extrair qual tecla foi pressionada para causar a transmisso. AInteno inclui esta sob a EXTRA_KEY_EVENT chave, enquanto o KeyEvent classe inclui uma listaKEYCODE_MEDIA_ * constantes estticas que representa cada um dos possveis botes de mdia, comoKEYCODE_MEDIA_PLAY_PAUSE e KEYCODE_MEDIA_NEXT . O trecho a seguir mostra como extrair o boto pressionado e mdia afeta a reproduo de mdia em conformidade.

Lidar com tecla. } } } }

Porque mltiplas aplicaes pode querer ouvir mdia pressiona o boto, voc tambm deve controlar programaticamente quando seu aplicativo deve receber mdia boto eventos de imprensa. O cdigo a seguir pode ser usado dentro de seu aplicativo para registrar e cancelar o registro com o boto receptor de eventos de mdia usando a AudioManager . Quando registrado, o receptor de transmisso o receptor exclusivo de todos os boto transmisses de mdia.
AudioManager am = mContext . getSystemService ( Context . AUDIO_SERVICE ); ... / / Comece ouvindo pressiona o boto sou . registerMediaButtonEventReceiver ( RemoteControlReceiver ); ... / / Pare para ouvir pressiona o boto sou . unregisterMediaButtonEventReceiver ( RemoteControlReceiver );

Tipicamente, as aplicaes devero cancelar a maioria dos seus receptores, sempre que se tornar inactivo ou invisvel (tal como durante o onStop () de retorno). No entanto, no to simples para reproduo de mdia apps-na verdade, respondendo a mdia botes de reproduo o mais importante quando a aplicao no visvel e, portanto, no pode ser controlado pela interface do usurio na tela.

Uma abordagem melhor registrar e cancelar o registro do boto media receiver evento quando seus ganhos e aplicao perde o foco de udio. Isso abordado em detalhes na prxima lio.

Gerenciando Foco udio


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Pedir o udio do foco 2. Lidar com a perda de foco udio 3. Pato!

VOC TAMBM DEVE LER


Mdia de reproduo

Com vrios aplicativos potencialmente reproduzir udio importante pensar sobre como eles devem interagir. Para evitar qualquer aplicativo de msica tocando ao mesmo tempo, o Android usa o foco de udio para moderar udio somente a reproduo aplicativos que possuem o foco de udio devem reproduzir o udio. Antes de sua aplicao comea a tocar udio deve solicitar e receber, o foco de udio. Da mesma forma, ele deve saber ouvir para uma perda de foco de udio e responder apropriadamente quando isso acontece.

Pedir o udio do foco


Antes de sua aplicao comea a tocar qualquer udio, ele deve manter o foco de udio para o fluxo que vai estar usando. Isso feito com uma chamada para requestAudioFocus () que retornaAUDIOFOCUS_REQUEST_GRANTED se o seu pedido for bem sucedida. Voc deve especificar qual o fluxo que voc est usando e se voc esperar para exigir foco udio transitria ou permanente. Pedir foco transitria quando voc espera para reproduzir udio por apenas um curto perodo de tempo (por exemplo, quando se joga instrues de navegao). Pedir foco permanente de udio quando voc pretende jogar de udio para o futuro prximo (por exemplo, quando tocar msica). Os seguintes pedidos trecho foco udio permanente no fluxo de udio da msica. Voc deve solicitar o foco de udio imediatamente antes de iniciar a reproduo, por exemplo, quando o usurio pressiona o jogo ou a msica de fundo para o prximo nvel de jogo comea.
AudioManager am = mContext . getSystemService ( Context . AUDIO_SERVICE ); ... / / Pedido foco de udio para reproduo int resultado = sou . requestAudioFocus ( afChangeListener , / / Use o streaming de msica. AudioManager . STREAM_MUSIC , / / Request permanente

Iniciar a reproduo. }

Depois de terminar a reproduo no se esquea de chamar abandonAudioFocus () . Isso notifica o sistema que voc no precisar mais foco e cancela o registro do associadoAudioManager.OnAudioFocusChangeListener . No caso de abandono foco transitria, isto permite que qualquer app interupted para continuar a reproduo.
/ / Abandono foco de udio quando a reproduo completa sou . abandonAudioFocus ( afChangeListener );

Ao solicitar foco udio transitria voc tem uma opo adicional: se voc deseja ou no ativar "esquivandose".Normalmente, quando um aplicativo de udio bem-comportado perde o foco do audio-lo imediatamente silncios sua reproduo. Ao solicitar um foco de udio transitria que permite que voc diga esquivando outros aplicativos de udio que aceitvel para eles para continuar a jogar, desde que diminuir o seu volume at que o foco retorna para eles.
/ / Pedido foco de udio para reproduo int resultado = sou . requestAudioFocus ( afChangeListener , / / Use o streaming de msica. AudioManager . STREAM_MUSIC , / / Request permanente

Iniciar a reproduo. }

Esquivando particularmente adequado para aplicaes que utilizam o fluxo de udio de forma intermitente, como por direes de conduo sonoros. Sempre que outro aplicativo solicita udio do foco, como descrito acima, a sua escolha entre o foco de udio permanente e transitrio (com ou sem suporte para som) recebida pelo ouvinte se registou ao solicitar foco.

Lidar com a perda de foco udio


Se o seu aplicativo pode solicitar o foco de udio, segue-se que, por sua vez perder o foco quando outro aplicativo solicite. Como seu aplicativo responde a uma perda de foco de udio depende da maneira de que a perda. O onAudioFocusChange () mtodo de retorno de udio eles ouvinte de alterao de foco que voc registrou ao solicitar foco de udio recebe um parmetro que descreve o evento de mudana de foco. Especificamente, os possveis eventos de perda de foco espelhar os tipos de solicitao foco da perda anterior seco permanente, perda transitria e passageira com ducking permitido. De modo geral, a perda transitria (temporria) de foco de udio deve resultar em seu aplicativo silenci-lo do fluxo de udio, mas por outro lado a manuteno do mesmo estado. Voc deve continuar a monitorar as alteraes no foco de udio e estar preparado para retomar a reproduo no qual foi interrompida uma vez que voc recuperou o foco. Se a perda de foco udio permanente, assumido que outro aplicativo est sendo usado agora para ouvir o udio e sua aplicao deve efetivamente acabar com si mesmo. Em termos prticos, isso significa parar a reproduo, a remoo de mdia boto ouvintes, permitindo que o novo player de udio para tratar exclusivamente desses eventos e abandonando seu foco de udio. Nesse ponto, seria de esperar uma ao do usurio (pressionando o jogo em sua app) a ser exigida antes de retomar a reproduo de udio.

No seguinte trecho de cdigo, fazemos uma pausa na reproduo ou nosso objeto media player se a perda de udio transitria e retom-la quando ns recuperamos o foco. Se a perda for permanente, ele cancela nosso boto media receptor de eventos e para monitorar mudanas de foco de udio.

Pausar a reproduo mais se ( focusChange == / / Resume

AudioManager . AUDIOFOCUS_GAIN )

Parar a reproduo } } };

No caso de uma perda temporria de foco de udio onde abaixando permitido, ao invs de pausar a reproduo, voc pode "pato" em vez.

Pato!
Esquivando-se o processo de reduzir o volume de fluxo de sada de udio para fazer udio transitria de outro aplicativo mais fcil de ouvir sem interromper totalmente o udio de seu prprio aplicativo. No seguinte trecho de cdigo reduz o volume do nosso objeto media player quando perdemos temporariamente o foco, ento retorna ao seu nvel anterior, quando recuperar o foco.

} } } };

Abaixe o volume mais se ( focusChange == AudioManager . AUDIOFOCUS_GAIN ) / / Levante-lo de volta ao normal

A perda do foco de udio a transmisso mais importante para reagir, mas no o nico. O sistema emite uma srie de intenes para alert-lo s mudanas na experincia de udio do usurio. A prxima lio demonstra como monitor-los para melhorar a experincia geral do usurio.

Lidar com sada de udio Hardware


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Verifique O Hardware est sendo usado 2. Lidar com as mudanas na produo de hardware de udio

VOC TAMBM DEVE LER

Mdia de reproduo

Os usurios tm uma srie de alternativas quando se trata de apreciar o udio dos seus dispositivos Android. A maioria dos dispositivos tm um alto-falante embutido, de fones de ouvido para fones de ouvido com fio, e muitos tambm recurso de conectividade Bluetooth e suporte para udio A2DP.

Verifique O Hardware est sendo usado


Como seu aplicativo se comporta pode ser afetada pelo qual hardware sua sada est sendo encaminhado para. Voc pode consultar o AudioManager para determinar se o udio est sendo encaminhado para o alto-falante do dispositivo, fone de ouvido com fio, ou um dispositivo Bluetooth ligado, como mostrado no seguinte trecho:
se } } } } ( isBluetoothA2dpOn ()) { / / Ajuste de sada para Bluetooth. mais se ( isSpeakerphoneOn ()) { / / Ajuste de sada para alto-falante. mais se ( isWiredHeadsetOn ()) { / / Ajuste de sada para fones de ouvido mais { / / Se o udio reproduzido e ningum pode ouvi-lo, se ele ainda est jogando?

Lidar com as mudanas na produo de hardware de udio


Quando um fone de ouvido est desligado, ou um dispositivo Bluetooth desligado, o fluxo de udio redireciona automaticamente para o alto-falante embutido. Se voc ouvir a sua msica em um volume to alto como eu, que pode ser um barulhento surpresa. Felizmente, o sistema emite um ACTION_AUDIO_BECOMING_NOISY inteno quando isso acontece. uma boa prtica para registrar um BroadcastReceiver que escuta essa inteno quando voc est jogando de udio.No caso de tocadores de msica, os usurios normalmente esperam que a reproduo em pausa, enquanto para os jogos que voc pode optar por reduzir significativamente o volume.

Pause o

Captura de Fotos
COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 1.5 (API nvel 3) ou superior Um dispositivo com uma cmara

VOC TAMBM DEVE LER


Cmera Atividades

EXPERIMENT-LO
Baixe o exemplo
PhotoIntentActivity.zip

O mundo era um lugar sombrio e inexpressivo antes de rich media tornou-se predominante. Lembre-se Gopher? Ns no, tampouco. Para a sua aplicao para se tornar parte da vida de seus usurios, dar-lhes uma maneira de colocar suas vidas a ele. Usando as cmeras on-board, o aplicativo pode permitir que os usurios para aumentar o que vem ao seu redor, faa avatares nicos, procure zombies ao virar da esquina, ou simplesmente compartilhar suas experincias. Esta classe faz com que voc clicar em rpido com algumas maneiras super-fceis de alavancar aplicaes de cmera existentes. Em lies posteriores, voc mergulhar mais fundo e aprender a controlar o hardware da cmera diretamente.

Lies
Tirar fotos Simplesmente Alavancagem outras aplicaes e capturar fotos com apenas algumas linhas de cdigo. Gravar vdeos Simplesmente Alavancagem outras aplicaes e gravar vdeos com apenas algumas linhas de cdigo. Controlar a cmera Controlar o hardware da cmera diretamente e implementar seu prprio aplicativo de cmera.

Tirar fotos Simplesmente


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Pedido Camera Permisso 2. Tire uma foto com o aplicativo da cmera 3. Ver a foto 4. Salvar a foto 5. Adicione a foto para uma Galeria

6. Decodificar uma imagem em escala

VOC TAMBM DEVE LER


Cmera Intenes e inteno Filtros

EXPERIMENT-LO
Baixe o exemplo
PhotoIntentActivity.zip

Esta lio explica como tirar fotos usando um aplicativo de cmera existente. Suponha que voc est implementando uma multido proveniente servio de meteorologia que faz um mapa do tempo mundial, misturando imagens de o cu tomado por dispositivos que executam seu aplicativo cliente. Integrando fotos apenas uma pequena parte do seu aplicativo. Voc quer tirar fotos com o mnimo de barulho, no reinventar a cmera. Felizmente, a maioria dos dispositivos com Android j tem pelo menos um aplicativo de cmera instalado. Nesta lio, voc aprende como faz-lo tirar uma foto para voc.

Pedido Camera Permisso


Se uma funo essencial de sua aplicao tirar fotos, ento restringir a sua visibilidade no Google Play para dispositivos que possuem uma cmera. Para anunciar que a sua aplicao depende de ter uma cmera, colocar um <uses-feature> tag em seu arquivo de manifesto:
<Manifestar ... > <usos-feature ... </ manifest ... >

android: name = "android.hardware.camera"

/>

Se o seu aplicativo usa, mas no necessita de uma cmera para funcionar, adicione android: required = "false" para o tag. Ao fazer isso, o Google Play permitir que dispositivos sem uma cmera para fazer o download do aplicativo. ento a sua responsabilidade de verificar a disponibilidade da cmera em tempo de execuo, chamando hasSystemFeature (PackageManager.FEATURE_CAMERA) . Se a cmera no estiver disponvel, ento voc deve desativar os recursos de cmera.

Tire uma foto com o aplicativo da cmera


A maneira Android de delegar aes para outras aplicaes invocar uma Intent que descreve o que voc quer fazer. Este processo envolve trs partes: A Inteno si, uma chamada para iniciar o externo Activity , e alguns cdigo para manipular os dados da imagem quando o foco retorna sua atividade. Aqui est uma funo que chama a inteno de capturar uma foto.
private void dispatchTakePictureIntent(int actionCode) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(takePictureIntent, actionCode); }

Parabns: com esse cdigo, o aplicativo ganhou a capacidade de fazer outro aplicativo de cmera fazer o seu lance! Claro que, se nenhum aplicativo compatvel est pronto para pegar a inteno, ento o seu aplicativo vai cair como um mergulho fase fracassada. Aqui est uma funo para verificar se um aplicativo pode manipular a sua inteno:
public static boolean isIntentAvailable(Context context, String action) { final PackageManager packageManager = context.getPackageManager(); final Intent intent = new Intent(action); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; }

Ver a foto
Se o simples feito de tirar uma foto no o ponto culminante da ambio de seu aplicativo, ento voc provavelmente vai querer tirar a imagem de volta a partir do aplicativo de cmera e fazer alguma coisa com ele. A aplicao Camera Android codifica a foto em troca da Inteno entregue onActivityResult () como um pequeno Bitmap nos extras, sob a chave "dados" . O cdigo a seguir recupera esta imagem e exibe-lo em umImageView .
private void handleSmallCameraPhoto(Intent intent) { Bundle extras = intent.getExtras(); mImageBitmap = (Bitmap) extras.get("data"); mImageView.setImageBitmap(mImageBitmap); }

Nota: Esta imagem em miniatura a partir de "dados" pode ser bom para um cone, mas no muito mais. Lidar com uma imagem em tamanho normal leva um pouco mais de trabalho.

Salvar a foto
A aplicao Camera Android salva uma foto no tamanho completo se voc lhe der um arquivo para salvar em.Voc deve fornecer um caminho que inclui o volume de armazenamento, a pasta eo nome do arquivo. Existe uma maneira fcil de obter o caminho para as fotos, mas ele s funciona em Android 2.2 (API nvel 8) e, mais tarde:

storageDir = new File( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ),

getAlbumName() );

Para os nveis API anteriores, voc tem que fornecer o nome do diretrio de fotos mesmo.

StorageDir = new Arquivo ( Meio Ambiente . getExternalStorageDirectory () + PICTURES_DIR + getAlbumName () );

Nota: O componente do caminho PICTURES_DIR apenas Pictures / , o local padro para as fotos compartilhadas no armazenamento externo / shared.

Definir o nome do arquivo


Como mostrado na seo anterior, a localizao do arquivo de uma imagem deve ser impulsionado pelo ambiente do dispositivo. O que voc precisa fazer a si mesmo escolher um esquema de nomeao de arquivos coliso-resistente. Voc pode querer tambm para salvar o caminho em uma varivel de membro para uso posterior. Aqui est uma soluo de exemplo:

privado Arquivo createImageFile () / / Cria um arquivo de imagem

throws

IOException

Acrescentar o nome do arquivo para o Intent


Uma vez que voc tem um lugar para guardar a sua imagem, passar esse local para o aplicativo da cmera atravs da Inteno .
Arquivo f = createImageFile (); takePictureIntent . putExtra ( MediaStore . EXTRA_OUTPUT ,

Uri . FromFile ( f ));

Adicione a foto para uma Galeria


Quando voc cria uma foto atravs de uma inteno, voc deve saber onde a imagem est localizada, porque voc disse que para salv-lo em primeiro lugar. Para todos os outros, talvez a maneira mais fcil de fazer a sua foto acessvel torn-lo acessvel a partir da Mdia Provider do sistema. O mtodo seguinte exemplo demonstra como invocar scanner de mdia do sistema para adicionar sua foto no banco de dados do provedor de mdia, tornando-o disponvel no aplicativo Gallery Android e outros aplicativos.

private void galleryAddPic() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); }

Decodificar uma imagem em escala


Gerenciamento de mltiplas imagens em tamanho natural pode ser complicado com memria limitada. Se voc encontrar o seu aplicativo em execuo sem memria depois de exibir apenas algumas imagens, voc pode reduzir drasticamente a quantidade de heap dinmico usado por expandir o JPEG em uma matriz de memria que j est escalado para combinar com o tamanho da exibio de destino. O seguinte exemplo demonstra o mtodo desta tcnica.
privado vazio setPic () { / / Pega as dimenses da Viso int targetW = mImageView . getWidth (); int targetH = mImageView . getHeight (); / / Pega as dimenses da

Determine quanto para diminuir a imagem int ScaleFactor = Math . min ( photoW / targetW , photoH / targetH ); / / decodificar o arquivo de imagem em um bitmap para preencher o tamanho

Gravar vdeos Simplesmente


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Pedido Camera Permisso 2. Grave um vdeo com um aplicativo da cmera 3. Ver o vdeo

VOC TAMBM DEVE LER


Cmera Intenes e inteno Filtros

EXPERIMENT-LO
Baixe o exemplo
PhotoIntentActivity.zip

Esta lio explica como capturar vdeo usando aplicativos de cmera existentes. O aplicativo tem um trabalho a fazer, e integrando vdeos apenas uma pequena parte dela. Voc quer gravar vdeos com o mnimo de barulho, e no reinventar a filmadora. Felizmente, a maioria dos dispositivos com Android j tem um aplicativo de cmera que grava vdeo. Nesta lio, voc faz isso para voc.

Pedido Camera Permisso


Para anunciar que a sua aplicao depende de ter uma cmera, colocar um <uses-feature> tag no arquivo de manifesto:
<Manifestar ... > <usos-feature ... </ manifest ... >

android: name = "android.hardware.camera"

/>

Se o seu aplicativo usa, mas no necessita de uma cmera para funcionar, adicione android: required = "false" para o tag. Ao fazer isso, o Google Play permitir que dispositivos sem uma cmera para fazer o download do aplicativo. ento a sua responsabilidade de verificar a disponibilidade da cmera em tempo de execuo, chamando hasSystemFeature (PackageManager.FEATURE_CAMERA) . Se a cmera no estiver disponvel, ento voc deve desativar os recursos de cmera.

Grave um vdeo com um aplicativo da cmera


A maneira Android de delegar aes para outras aplicaes invocar uma Intent que descreve o que voc quer fazer. Trata-se de trs partes: a Inteno si, uma chamada para iniciar o externo Activity , e um cdigo para lidar com o vdeo quando o foco retorna sua atividade. Aqui est uma funo que chama a inteno de capturar vdeo.
private void dispatchTakeVideoIntent() { Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO); }

uma boa idia para se certificar existe um aplicativo para lidar com a sua inteno antes de invoc-lo. Aqui est uma funo que verifica se h aplicativos que podem lidar com a sua inteno:
public static boolean isIntentAvailable(Context context, String action) { final PackageManager packageManager = context.getPackageManager(); final Intent intent = new Intent(action); List<ResolveInfo> list =

packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; }

Ver o vdeo
A aplicao Camera Android retorna o vdeo no Inteno entregue onActivityResult () como um Uriapontando para o local vdeo no armazenamento. O cdigo a seguir recupera este vdeo e exibe-lo em umVideoView .
private void handleCameraVideo(Intent intent) { mVideoUri = intent.getData(); mVideoView.setVideoURI(mVideoUri); }

Controlar a cmera
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Abra o objeto Camera 2. Crie o Camera visualizao 3. Modificar Configuraes da cmera 4. Definir a orientao visualizao 5. Tire uma foto 6. Reinicie o Pr-Visualizao 7. Pare de visualizao e Solte o Camera

VOC TAMBM DEVE LER


Construindo um aplicativo de cmera

Nesta lio, vamos discutir como controlar o hardware da cmera diretamente usando as APIs do framework. Controlar diretamente a cmera do dispositivo requer um cdigo muito mais do que pedir fotos ou vdeos a partir de aplicativos de cmera existentes. No entanto, se voc quiser construir uma aplicao de cmara especializada ou algo totalmente integrado em sua interface do usurio de aplicativos, esta lio mostra como voc.

Abra o objeto Camera


Obteno de uma instncia da Cmara objecto o primeiro passo no processo de controlar directamente a cmara. Como o prprio aplicativo Cmera do Android faz, a maneira recomendada para acessar a cmera abrir Camera em um segmento separado que lanado a partir deonCreate () . Esta abordagem uma boa idia, pois pode demorar um pouco e pode atolar o segmento. Em uma implementao mais bsica, abrindo a

cmera pode ser adiada para o onResume () mtodo para facilitar a reutilizao de cdigo e manter o fluxo de controle simples. Chamando Camera.open () lana uma exceo se a cmera j est em uso por outro aplicativo, de modo que envolv-la em um try bloco.

para abrir

Desde nvel API 9, o quadro cmera suporta mltiplas cmeras. Se voc usar a API legado e chamar open ()sem um argumento, voc comea a primeira cmera traseira.

Crie o Camera visualizao


Tirar uma fotografia geralmente requer que os usurios ver um preview do assunto antes de clicar o boto do obturador. Para fazer isso, voc pode usar um SurfaceView tirar previews do que o sensor da cmera est pegando.

Classe pr-visualizao
Para comear com a exibio de um preview, voc precisa classe visualizao. A pr-visualizao requer uma execuo do android.view.SurfaceHolder.Callback interface, que usado para transmitir dados de imagem a partir do hardware para a cmara de aplicao.

Instale um SurfaceHolder.Callback por isso ser notificado quando a superfcie / / subjacente criado e

A classe de visualizao deve ser passado para a Cmara objeto antes de a pr-visualizao de imagens ao vivo pode ser iniciado, como mostrado na prxima seo.

Definir e iniciar a visualizao


A exemplo da cmera e sua visualizao relacionada deve ser criado em uma ordem especfica, com o objetivo cmera ser o primeiro. No trecho abaixo, o processo de inicializao da cmera encapsulado para queCamera.startPreview () chamado pelo setCamera () mtodo, sempre que o usurio faz alguma coisa para mudar a cmera. A visualizao tambm deve ser reiniciado na classe prvisualizao surfaceChanged () mtodo de callback.

Chame startPreview () para iniciar a atualizao superfcie de visualizao. Visualizao deve ser iniciado antes que voc pode tirar uma foto. * / mCamera . startPreview (); } }

Modificar Configuraes da cmera


As configuraes da cmera mudar a maneira que a cmera tira fotos, desde o nvel de zoom para a compensao de exposio. Este exemplo altera apenas o tamanho da visualizao, ver o cdigo fonte da aplicao Cmara para muitos mais.
pblico vazio surfaceChanged ( SurfaceHolder titular , int formato , int w , int h ) { / / Agora que o tamanho conhecido, configurar os parmetros da cmera e comear a / / o

Chame startPreview () para iniciar a atualizao superfcie de visualizao. Visualizao deve ser iniciado antes que voc pode tirar uma foto. * / mCamera . startPreview (); }

Definir a orientao visualizao


A maioria dos aplicativos de cmera bloquear a tela em modo paisagem porque essa a orientao natural do sensor da cmera. Essa configurao no impedi-lo de tirar fotos em modo retrato, porque a orientao do dispositivo registrado no cabealho EXIF. O setCameraDisplayOrientation () mtodo permite que voc altere a forma como a pr-visualizao exibida sem afetar a forma como a imagem gravada. No entanto, em Android antes de API nvel 14, voc deve parar a sua pr-visualizao antes de alterar a orientao e, em seguida, reinici-lo.

Tire uma foto


Use o Camera.takePicture () mtodo para tirar uma foto quando a visualizao iniciada. Voc pode criarCamera.PictureCallback e Camera.ShutterCallback objetos e pass-las em Camera.takePicture () . Se voc quiser pegar imagens continuamente, voc pode criar um Camera.PreviewCallback que implementaonPreviewFrame () . Para algo no meio, voc pode capturar quadros de visualizao apenas selecionados ou criar uma ao retardada para chamar takePicture () .

Reinicie o Pr-Visualizao

Depois que a foto tirada, voc deve reiniciar a visualizao que o usurio possa tirar outra foto. Neste exemplo, o recomeo feito por sobrecarregar o boto do obturador.

mudar shutterBtnConfig (); }

Pare de visualizao e Solte o Camera


Assim que seu pedido feito usando a cmera, hora de limpar. Em particular, voc deve liberar a cmera do objeto, ou corre o risco de cair outras aplicaes, incluindo novas instncias de sua prpria aplicao. Quando voc deve parar a pr-visualizao e solte a cmera? Bem, tendo sua superfcie de visualizao destrudo um bom indcio de que hora de parar a pr-visualizao e solte a cmera, como mostrado nesses mtodos da visualizao classe.
pblico vazio surfaceDestroyed ( SurfaceHolder titular ) { / / Surface ser destrudo quando voltamos, ento pare de visualizao. se ( mCamera ! = NULL ) { / * Chamada stopPreview () para parar de atualizar superfcie de visualizao. * / mCamera . stopPreview ( ); } } / ** . * Quando esta funo retorna, mCamera ser nulo * / privado vazio stopPreviewAndFreeCamera () { se ( mCamera ! = NULL ) { / * . Chamada stopPreview () para parar de atualizar superfcie de visualizao * / mCamera . stopPreview ();

/ * Importante:. lanamento Call () para liberar a cmera para uso por outros aplicativos candidaturas devero liberar a cmera imediatamente em onPause () (e re-open () em onResume ()). * / mCamera . lanamento (); mCamera = } } nulo ;

No incio da aula, esse procedimento tambm fazia parte do setCamera () mtodo, para inicializar uma cmera sempre comea com parar a visualizao.

Exibindo Bitmaps eficiente


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 2.1 (API Nvel 7) ou superior Biblioteca de Apoio

EXPERIMENT-LO

Baixe o exemplo
BitmapFun.zip

Aprenda a usar as tcnicas comuns para processar e carregarBitmap objetos de uma forma que mantm os componentes a sua interface de usurio (UI) gil e evita exceder seu limite de memria do aplicativo. Se voc no tiver cuidado, bitmaps podem consumir rapidamente o seu oramento memria disponvel levando a um acidente de aplicao devido temida exceo: java.lang.OutOfMemoryError: bitmap tamanho excede o oramento VM . H uma srie de razes pelas quais o carregamento bitmaps em seu aplicativo Android complicado:

Os dispositivos mveis normalmente tm limitado os recursos do sistema. Dispositivos Android podem ter to pouco como 16MB de memria disponvel para uma nica aplicao. O Android Documento Definio de Compatibilidade (CDD), Seo 3.7. Compatibilidade Virtual Machine d a memria da aplicao mnima exigida para vrios tamanhos de tela e densidades. As candidaturas devem ser otimizados para executar sob este limite mnimo de memria. No entanto, tenha em mente muitos dispositivos so configurados com limites mais altos. Bitmaps pegar um monte de memria, especialmente para imagens ricas, como fotografias. Por exemplo, a cmera no Galaxy Nexus tira fotos de at 2592x1936 pixels (5 megapixels). Se a configurao de bitmap usado ARGB_8888 (o padro do Android 2.3 em diante), ento carregar esta imagem na memria leva cerca de 19MB de memria (2592 * 1936 * 4 bytes), imediatamente esgotar o limite per-app em alguns dispositivos. Android aplicativo UI freqentemente requerem vrios bitmaps para serem carregados de uma s vez.Componentes como ListView , GridView e ViewPager geralmente incluem vrios bitmaps na tela ao mesmo tempo com muito mais potencial off-screen pronto para mostrar ao toque de um dedo.

Lies
Carregar bitmaps grandes eficiente Esta lio percorre decodificao grandes bitmaps sem exceder o limite de memria por aplicao. Bitmaps processamento off o segmento Processamento Bitmap (redimensionamento, o download de uma fonte remota, etc) nunca deve ter lugar no principal segmento. Esta lio percorre processamento bitmaps em uma discusso de fundo usandoAsyncTask e explica como lidar com questes de concorrncia. Cache de bitmaps Esta lio percorre usando uma memria e cache de bitmap em disco para melhorar a capacidade de resposta e fluidez de sua UI ao carregar vrios bitmaps. Gerenciando a Memria Bitmap Esta lio explica como gerenciar a memria bitmap para maximizar o desempenho do seu aplicativo. Exibindo bitmaps em sua UI Esta lio traz tudo junto, mostrando-lhe como carregar vrios bitmaps em componentes como ViewPagere GridView usando um thread em segundo plano e cache de bitmap.

Carregar bitmaps grandes eficiente


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A

1. Leia Dimenses Bitmap e Tipo 2. Carregue uma verso reduzida na memria

EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip

As imagens vm em todas as formas e tamanhos. Em muitos casos, so maiores do que o necessrio para uma interface de utilizador da aplicao tpica (UI). Por exemplo, o aplicativo Gallery sistema exibe fotos tiradas com a cmera do seu dispositivos Android que so tipicamente resoluo muito maior do que a densidade da tela do seu dispositivo. Tendo em conta que voc est trabalhando com memria limitada, o ideal que voc apenas deseja carregar a verso de baixa resoluo na memria. A verso de baixa resoluo deve corresponder ao tamanho do componente de interface do usurio que exibe. Uma imagem com uma resoluo maior no fornece qualquer benefcio visvel, mas ainda ocupa memria preciosa e incorre em sobrecarga adicional de desempenho devido ao adicional sobre a escala real. Esta lio percorre decodificao grandes bitmaps sem exceder o limite de memria por aplicao carregar uma verso menor subamostrada na memria.

Leia Dimenses Bitmap e Tipo


O BitmapFactory classe fornece vrios mtodos de descodificao ( decodeByteArray () , decodeFile (), decodeResource () , etc), para a criao de um mapa de bits a partir de vrias fontes. Escolha o mtodo de decodificao mais adequado com base na sua fonte de dados de imagem. Estes mtodos tentar alocar memria para o bitmap construdo e, portanto, pode facilmente resultar em uma OutOfMemory exceo. Cada tipo de mtodo de decodificao tem assinaturas adicionais que permitem que voc especifique as opes de decodificao atravs da BitmapFactory.Options classe. Definir o inJustDecodeBounds propriedade paraverdadeiro enquanto decodificao evita a alocao de memria, retornando nulo para o objeto bitmap, mas a criao outWidth , outHeight e outMimeType . Esta tcnica permite que voc leia as dimenses eo tipo de dados de imagem antes da construo (e alocao de memria) do bitmap.
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType;

Para evitar java.lang.OutOfMemory excees, verifique as dimenses de um bitmap antes de decodific-lo, a menos que voc absolutamente confiar na fonte para fornec-lo com os dados da imagem previsivelmente porte que se encaixa confortavelmente dentro da memria disponvel.

Carregue uma verso reduzida na memria

Agora que as dimenses da imagem sejam conhecidos, eles podem ser usados para decidir se a imagem completa deve ser carregado para a memria ou se uma verso subamostrada devem ser carregados em seu lugar. Aqui esto alguns fatores a considerar:

Uso de memria estimado de carregar a imagem completa na memria. Quantidade de memria que voc est disposto a comprometer-se carregar esta imagem dada quaisquer outros requisitos de memria de sua aplicao. As dimenses do alvo ImageView ou componente de interface que a imagem est a ser carregado para. Tamanho da tela e densidade do dispositivo atual.

Por exemplo, no vale a pena uma imagem de 1024x768 pixels carregar na memria, se ele acabar por ser exibido em uma miniatura de 128x96 pixels em um ImageView . Para dizer o descodificador subamostra a imagem, o carregamento de uma verso menor na memria, definirinSampleSize a verdade em sua BitmapFactory.Options objeto. Por exemplo, uma imagem com resoluo de 2048x1536 que decodificado com um inSampleSize de 4 produz um bitmap de aproximadamente 512x384. Carregar isto em memria usa 0.75MB ao invs de 12MB para a imagem completa (assumindo uma configurao de bitmap de ARGB_8888 ). Aqui est um mtodo para calcular o valor de um tamanho de amostra com base na largura e altura alvo:
pblico static int calculateInSampleSize ( BitmapFactory . Opes de opes , / / Raw altura e largura de

int reqWidth ,

int reqHeight )

Calcular propores de altura e largura a altura desejada e

Escolha a menor proporo que o valor inSampleSize, isso vai garantir a / / a imagem final com ambas as dimenses maiores do que ou iguais altura / / solicitado e largura. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio ; } retorno inSampleSize ; }

Nota: Usando potncias de 2 para inSampleSize valores mais rpido e mais eficiente para o decodificador.No entanto, se voc pretende armazenar em cache as verses redimensionadas na memria ou no disco, normalmente ainda vale a decodificao com as dimenses de imagem mais apropriadas para economizar espao. Para usar este mtodo, primeiro decodificao com inJustDecodeBounds definido para verdadeiro , passar as opes e, em seguida, atravs de decodificar novamente usando o novo inSampleSize valor einJustDecodeBounds definido para falso :
pblico esttico Bitmap decodeSampledBitmapFromResource ( Recursos res , int reqWidth , int reqHeight ) { int Resid ,

/ / Primeiro decodificao com inJustDecodeBounds = true para verificar

Calcular inSampleSize opes . inSampleSize = calculateInSampleSize ( opes , reqWidth , reqHeight ); bitmap / / Decode com conjunto inSampleSize opes . inJustDecodeBounds = false ; retorno BitmapFactory . decodeResource ( res , resid , opes ); }

Este mtodo faz com que seja fcil de carregar um mapa de bits de tamanho arbitrariamente grande numImageView que exibe uma miniatura de 100x100 pixels, como mostrado no seguinte exemplo de cdigo:
mImageView . setImageBitmap ( decodeSampledBitmapFromResource ( getResources (), R . id . myimage , ));

100 ,

100

Pode seguir um processo semelhante para descodificar bitmaps de outras fontes, substituindo o apropriado * BitmapFactory.decode mtodo, conforme necessrio.

Bitmaps processamento off o segmento


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Use um AsyncTask 2. Lidar com concorrncia

VOC TAMBM DEVE LER


Projetando para Receptividade Multithreading para o desempenho

EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip

Os * BitmapFactory.decode mtodos, discutidos nas grande carga Bitmaps eficiente lio, no deve ser executado no thread principal UI se a fonte de dados lido do disco ou local de rede (ou mesmo qualquer outra fonte de memria). O tempo que esta demora a carregar dados imprevisvel e depende de uma variedade de factores (velocidade de leitura a partir do disco ou da rede, o tamanho da imagem, a energia do processador, etc.)Se uma dessas tarefas bloqueia o segmento de interface do usurio, o sistema sinaliza sua aplicao como no-responsivos eo usurio tem a opo de fech-la (ver Projetando para Receptividade para mais informaes). Esta lio percorre processamento bitmaps em uma discusso de fundo usando AsyncTask e mostra-lhe como lidar com questes de concorrncia.

Use um AsyncTask

O AsyncTask classe fornece uma maneira fcil de executar algum trabalho em uma discusso de fundo e publicar os resultados de volta no segmento. Para us-lo, criar uma subclasse e substituir os mtodos fornecidos. Aqui est um exemplo de carregar uma imagem grande em uma ImageView usando AsyncTask edecodeSampledBitmapFromResource () :

Use um WeakReference para garantir a ImageView pode ser lixo coletado imageViewReference = new WeakReference < ImageView > ( imageView ); } image / Decode / in

Uma vez concludo, veja se ImageView ainda est por a e definir

O WeakReference ao ImageView garante que o AsyncTask no impede que o ImageView e nada faz referncia de ser lixo coletado. No h nenhuma garantia da ImageView ainda est em torno de quando a tarefa for concluda, ento voc deve tambm verificar a referncia na OnPostExecute () . O ImageView pode no existir mais, se por exemplo, o usurio navega para longe da atividade ou se uma alterao de configurao acontece antes que a tarefa terminar. Para comear a carregar o bitmap de forma assncrona, basta criar uma nova tarefa e execut-lo:
public void loadBitmap(int resId, ImageView imageView) { BitmapWorkerTask task = new BitmapWorkerTask(imageView); task.execute(resId); }

Lidar com concorrncia


Vista componentes comuns, como ListView e GridView introduzir um outro problema quando usado em conjunto com o AsyncTask como demonstrado na seco anterior. Para ser eficiente, com memria, estes componentes reciclar vistas criana como o usurio rola. Se cada exibio criana desencadeia umaAsyncTask , no h garantia de que, quando concluda, a viso associada no tenha j sido reciclados para uso em outro ponto de vista da criana. Alm disso, no h garantia de que a ordem em que as tarefas assncronas so iniciados a ordem em que eles completam.

O blog Multithreading para o desempenho ainda discute lidar com a concorrncia, e oferece uma soluo onde o ImageView armazena uma referncia ao mais recente AsyncTask que mais tarde pode ser verificado quando a tarefa for concluda. Utilizando um mtodo semelhante, a AsyncTask a partir da seco anterior podem ser estendido a seguir um padro similar. Criar um dedicado Drawable subclasse para armazenar uma referncia de volta para a tarefa do trabalhador.Neste caso, um BitmapDrawable utilizado para que uma imagem de substituio pode ser exibida noImageView enquanto a tarefa completa:
static class AsyncDrawable extends BitmapDrawable { private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference; public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { super(res, bitmap); bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask); } public BitmapWorkerTask getBitmapWorkerTask() { return bitmapWorkerTaskReference.get(); } }

Antes de executar o BitmapWorkerTask , voc cria uma AsyncDrawable e vincul-lo ao alvo ImageView :
public void loadBitmap(int resId, ImageView imageView) { if (cancelPotentialWork(resId, imageView)) { final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), mPlaceHolderBitmap, task); imageView.setImageDrawable(asyncDrawable); task.execute(resId); } }

O cancelPotentialWork mtodo referenciado no exemplo de cdigo acima verifica se outra tarefa em execuo j est associado com o ImageView . Se assim for, ele tenta cancelar a tarefa anterior, chamandocancelar () . Num pequeno nmero de casos, os dados do novo tarefa corresponde a tarefa existente e necessita de mais nada para acontecer. Aqui a implementao de cancelPotentialWork :

Cancelar tarefa anterior bitmapWorkerTask . cancelar ( verdadeiro ); mais { / / O mesmo trabalho j est em andamento retorno falso ;

} } / / Nenhuma tarefa associada com o ImageView, ou uma tarefa existente foi cancelada retorno verdadeiro ; }

Um mtodo auxiliar, getBitmapWorkerTask () , usado anteriormente para recuperar a tarefa associada a um determinado ImageView :
private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { if (imageView != null) { final Drawable drawable = imageView.getDrawable(); if (drawable instanceof AsyncDrawable) { final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; return asyncDrawable.getBitmapWorkerTask(); } } return null; }

O ltimo passo atualizar OnPostExecute () em BitmapWorkerTask para que ele verifica se a tarefa for cancelada e se a tarefa atual corresponde a um associado com o ImageView :
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { ... @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } if (imageViewReference != null && bitmap != null) { final ImageView imageView = imageViewReference.get(); final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (this == bitmapWorkerTask && imageView != null) { imageView.setImageBitmap(bitmap); } } } }

Esta aplicao est agora adequado para utilizao em ListView e GridView de componentes, bem como de quaisquer outros componentes que reciclam seus pontos de vista da criana. Basta ligar para LoadBitmaponde voc normalmente definir uma imagem para o seu ImageView . Por exemplo, em um GridView execuo este seria no getView () mtodo do adaptador de apoio.

Cache de bitmaps
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Use um cache de memria 2. Usar um cache de disco 3. Lidar com as mudanas de configurao

VOC TAMBM DEVE LER


Tratamento de alteraes de tempo de execuo

EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip

Carregar um nico bitmap em sua interface de usurio (UI) simples, porm as coisas ficam mais complicadas se voc precisa carregar um conjunto maior de imagens de uma vez. Em muitos casos (por exemplo, com componentes como ListView, GridView ou ViewPager ), o nmero total de imagens no ecr combinado com imagens que pode deslocar rapidamente para a tela essencialmente ilimitado. O uso da memria mantido baixo com componentes como este atravs da reciclagem os pontos de vista da criana medida que se movem para fora da tela. O coletor de lixo tambm libera seus bitmaps carregados, supondo que voc no manter todas as referncias de vida longa. Isso tudo bom e bem, mas a fim de manter um fluido e rpido-carregamento da interface do usurio que voc deseja evitar o tratamento continuamente essas imagens cada vez que voltar na tela. A memria e cache de disco, muitas vezes pode ajudar aqui, permitindo que os componentes para recarregar rapidamente imagens processadas. Esta lio percorre usando uma memria e cache de bitmap em disco para melhorar a capacidade de resposta e fluidez de sua UI ao carregar vrios bitmaps.

Use um cache de memria

A memria cache oferece acesso rpido a bitmaps, ao custo de ocupar memria do aplicativo valioso. OLruCache classe (tambm disponvel na Biblioteca de suporte para o uso de volta API Nvel 4) particularmente adequado para a tarefa de cache de bitmaps, mantendo os objetos referenciados recentemente em uma forte referncia LinkedHashMap e expulsar o membro menos recentemente usado antes do cache excede o seu designado tamanho. Nota: No passado, a implementao de cache de memria popular foi um SoftReference ouWeakReference cache de bitmap, no entanto isso no recomendado. A partir do Android 2.3 (Nvel API 9), o coletor de lixo mais agressivo com a coleta de referncias soft / fraco que os torna bastante ineficaz. Alm disso, antes de Android 3.0 (API Nvel 11), os dados de suporte de um mapa de bits foi armazenado na memria nativa, que no libertada de uma forma previsvel, potencialmente provocando uma aplicao que exceda brevemente os seus limites de memria e de coliso. A fim de seleccionar um tamanho apropriado para um LruCache , um certo nmero de factores que devem ser tidos em considerao, por exemplo:

Como memria intensiva o resto de sua atividade e / ou aplicao? Quantas imagens estaro na tela ao mesmo tempo? Quantos precisam estar disponveis pronto para entrar na tela? Qual o tamanho da tela ea densidade do dispositivo? Uma alta dispositivo extra tela densidade (xhdpi) como Galaxy Nexus vai precisar de um cache maior para manter o mesmo nmero de imagens na memria em comparao com um dispositivo como Nexus S (hdpi). Quais as dimenses e configurao so os bitmaps e, portanto, o quanto de memria cada um vai pegar? Com que frequncia que as imagens ser acessado? Ser que algum ser acessados com mais frequncia do que outros? Se assim for, talvez voc pode querer manter alguns itens sempre na memria ou at mesmo ter vrios LruCache objetos para diferentes grupos de bitmaps. Voc pode equilibrar qualidade contra a quantidade? Por vezes, pode ser mais til para armazenar um maior nmero de mapas de bits de menor qualidade, potencialmente, o carregamento de uma verso de maior qualidade, em outra tarefa em segundo plano.

No h tamanho ou frmula que combina com todas as aplicaes especficas, at voc para analisar o seu uso e chegar a uma soluo adequada. Um cache que muito pequena provoca uma sobrecarga adicional sem nenhum benefcio, um cache que muito grande pode mais uma vez causar java.lang.OutOfMemoryexcees e deixar o resto de sua pouca memria aplicativo para trabalhar com ele. Aqui est um exemplo de criao de uma LruCache para bitmaps:

Obter mxima de memria disponvel VM, ultrapassando este valor ir lanar uma exceo / / OutOfMemory. Armazenado em kilobytes como LruCache leva uma / / int em seu construtor. ltima int MaxMemory = ( int ) ( Runtime . getRuntime (). MaxMemory () / 1024 ); / / Use 1/8th da memria disponvel para esta memria

O tamanho do cache ser medido em kilobytes, em vez de / / nmero de

Nota: Neste exemplo, um oitavo da memria do aplicativo alocado para o cache. Em um dispositivo normal de / hdpi isto um mnimo de cerca de 4MB (32/8). A tela cheia GridView preenchido com as imagens de um dispositivo com resoluo de 800x480 usaria cerca de 1.5MB (800 * 480 * 4 bytes), ento isso seria armazenar em cache um mnimo de cerca de 2,5 pginas de imagens na memria. Ao carregar um bitmap em um ImageView , o LruCache verificada pela primeira vez. Se uma entrada for encontrada, ela ser imediatamente utilizado para atualizar o ImageView , caso contrrio, uma discusso de fundo gerado para processar a imagem:
public void loadBitmap(int resId, ImageView imageView) { final String imageKey = String.valueOf(resId); final Bitmap bitmap = getBitmapFromMemCache(imageKey); if (bitmap != null) { mImageView.setImageBitmap(bitmap); } else { mImageView.setImageResource(R.drawable.image_placeholder); BitmapWorkerTask task = new BitmapWorkerTask(mImageView);

task.execute(resId); } }

O BitmapWorkerTask tambm precisa ser atualizado para adicionar entradas no cache de memria:
classe BitmapWorkerTask ... / imagem / Decode em estende AsyncTask < Integer , Vcuo , Bitmap > {

Usar um cache de disco


A memria cache til para acelerar o acesso a bitmaps vistos recentemente, no entanto, voc no pode confiar em imagens que esto disponveis neste cache. Componentes como GridView com conjuntos de dados maiores podem facilmente encher um cache de memria. Sua aplicao pode ser interrompida por outra tarefa como uma chamada de telefone, e enquanto no fundo ele pode ser morto eo cache de memria destruda. Uma vez que o usurio reinicia, a sua aplicao tem para processar cada imagem novamente. A cache de disco pode ser utilizado nesses casos para persistir bitmaps processados e ajudar a diminuir os tempos de carregamento onde as imagens no esto mais disponveis em um cache de memria. Claro, buscando imagens de disco mais lento que o carregamento da memria e deve ser feito em uma discusso de fundo, como leitura de disco vezes pode ser imprevisvel. Nota: A ContentProvider poderia ser um lugar mais apropriado para armazenar as imagens em cache, se eles so acessados com mais freqncia, por exemplo, em um aplicativo de galeria de imagem. O cdigo de amostra desta classe usa um DiskLruCache execuo que puxada a partir da fonte do Android .Aqui est o exemplo de cdigo atualizado que adiciona um cache de disco, alm do cache de memria existente:

Inicializar cache de memria ... / / Inicializar cache de disco no fundo

Acabado de inicializao mDiskCacheLock . notifyAll (); } retornar nulo ; } } class BitmapWorkerTask ... image / / Decode em estende

/ / Despertar quaisquer segmentos de espera

AsyncTask < Integer ,

Vcuo ,

Bitmap >

Verifique cache de disco no fundo fio Bitmap bitmap = getBitmapFromDiskCache ( ImageKey ); se ( bitmap == nulo ) { / / No foi encontrado no cache de disco / / Processo como normal final, Bitmap bitmap = decodeSampledBitmapFromResource ( getResources (), params [ 0 ], 100 , 100 ));

} / / Adicionar bitmap final

Adicionar ao cache de memria, como antes se ( getBitmapFromMemCache ( chave ) == NULL ) mMemoryCache . colocar ( chave , bitmap ); } / / Alm disso, adicione a disco

Aguarde enquanto o cache de disco iniciado a partir de fundo

Cria um subdiretrio nico do diretrio designado cache do aplicativo. Tenta usar externo / / mas se no for montado, cai de volta no armazenamento interno. pblico esttico Arquivo getDiskCacheDir ( Context contexto , Cordas uniqueName ) / / Verifique se a mdia est montado ou armazenamento built-in, em caso afirmativo, e tentar usar externo o cache dir / / caso contrrio usar cache interno

Nota: Mesmo inicializar o cache de disco requer operaes de disco e, portanto, no deve ter lugar no segmento principal. No entanto, isso no significa que h uma chance de que o cache acessada antes da inicializao. Para resolver isso, na implementao acima, um objeto de bloqueio garante que o aplicativo no l a partir do cache do disco at que o cache foi inicializado. Enquanto a memria cache verificado no segmento de interface do usurio, o cache de disco verificado no segmento de plano de fundo. Operaes de disco nunca deve ter lugar no segmento. Quando o processamento de imagem est completa, o mapa de bits final adicionado memria cache de disco e para utilizao futura.

Lidar com as mudanas de configurao


Alteraes de configurao de tempo de execuo, tais como a mudana de orientao da tela, causar Android para destruir e reiniciar a atividade de correr com a nova configurao (Para mais informaes sobre esse comportamento, consulte Tratamento de alteraes de tempo de execuo ). Voc quer evitar ter que processar todas as imagens novamente para que o usurio tenha uma experincia suave e rpida quando ocorre uma mudana de configurao. Felizmente, voc tem um cache de memria agradvel de bitmaps que voc construiu no Uso um cache de memria seo. Este cache pode ser repassado para a nova instncia de atividade utilizando um fragmentoque preservada pelo telefone setRetainInstance (true) ). Aps a atividade foi recriado, este manteveFragment recolocado e voc ganha acesso ao objeto de cache existente, permitindo que as imagens sejam rapidamente buscar e repovoada nos ImageView objetos. Aqui est um exemplo de manter um LruCache objeto atravs de alteraes de configurao usando umfragmento :

Inicializar o cache aqui como

Para testar isso, tente rodar um dispositivo com e sem reteno do fragmento . Voc deve perceber pouco ou nenhum lag como as imagens preencher a atividade quase que instantaneamente da memria quando voc mantm o cache. Quaisquer imagens que no so encontrados no cache de memria so esperanosamente disponvel no cache de disco, se no, eles so processados como de costume.

Gerenciando a Memria Bitmap


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Gerir Memria no Android 2.3.3 e Baixa 2. Gerir Memria em Android 3.0 e superior

VOC TAMBM DEVE LER


Anlise de memria para aplicativos Android blog post Gerenciamento de memria para Android Apps apresentao do Google I / O Android Projeto: Swipe Visualizaes Android Projeto: Lista Grelha

EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip

Alm das etapas descritas no cache bitmaps , h coisas especficas que voc pode fazer para facilitar a coleta de lixo e reutilizao de bitmap. A estratgia recomendada depende de qual verso (s) do Android que voc est alvejando. OBitmapFun amostra aplicativo includo com esta classe mostra como projetar seu aplicativo para trabalhar de forma eficiente em diferentes verses do Android. Para preparar o terreno para esta lio, aqui est como o gerenciamento de memria do Android bitmap evoluiu:

No Android 2.2 Android (API nvel 8) e inferior, quando ocorre a coleta de lixo, fios de seu aplicativo ficar parado. Isso faz com que um atraso que pode prejudicar o desempenho.Android 2.3 adiciona coleta de lixo simultnea, o que significa que a memria recuperada logo aps um bitmap no mais referenciado. No Android 2.3.3 (API nvel 10) e inferior, os dados de pixel de apoio para um mapa de bits so armazenados na memria nativa. separado do prprio bitmap, que armazenada na pilha Dalvik. Os dados de pixel na memria nativa no liberado de uma maneira previsvel, podendo causar um aplicativo para ultrapassar brevemente os seus limites de memria e de coliso. partir do Android 3.0 (API Nvel 11), os dados de pixel armazenado na pilha Dalvik juntamente com o associado bitmap.

As sees a seguir descrevem como otimizar o gerenciamento de memria bitmap para diferentes verses do Android.

Gerir Memria no Android 2.3.3 e Baixa


No Android 2.3.3 (nvel API 10) e inferior, utilizando reciclagem () recomendado. Se voc est exibindo grandes quantidades de dados de bitmap em seu aplicativo, provvel que voc executar emOutOfMemoryError erros. A reciclagem () mtodo permite que um aplicativo para recuperar a memria o mais rpido possvel. Ateno: Voc deve usar recycle () somente quando tiver certeza de que o bitmap no est mais sendo usado. Se voc chamar de reciclagem () e depois tentar desenhar o bitmap, voc ter o erro: "Canvas: tentando usar um bitmap reciclado" . O seguinte trecho de cdigo d um exemplo de vocao de reciclagem () . Ele usa a contagem de referncia (no variveis mDisplayRefCount e mCacheRefCount ) para controlar se um bitmap est sendo exibido ou no cache. O cdigo recicla o bitmap quando essas condies forem atendidas:

A contagem de referncia tanto para mDisplayRefCount e mCacheRefCount 0. O bitmap no nulo , e ainda no foi reciclada.

particular int mCacheRefCount = 0 ; particular int mDisplayRefCount = 0 ; ... / / Notificar desenhvel o que o estado exibido mudou. / / manter uma contagem para determinar quando o desenhvel j no est

Verifique se reciclar () pode ser chamado. checkstate (); } / / Avisa o drawable que o estado de cache mudou. / / Manter uma contagem para determinar quando o drawable no est sendo

Verifique se reciclar () pode ser chamado. checkstate (); } privado sincronizado vazio checkstate () { / / Se o cache drawable e exibio ref contagem = 0, e este drawable / / foi apresentado, em seguida,

Gerir Memria em Android 3.0 e superior


Android 3.0 (API Nvel 11) introduz o BitmapFactory.Options.inBitmap campo. Se esta opo estiver definida, os mtodos de decodificao que levam o Opes objeto ir tentar reutilizar um bitmap existente ao carregar contedo. Isso significa que a memria do bitmap reutilizada, o que resulta em melhor desempenho e remover tanto a alocao de memria e de-alocao. H algumas ressalvas no uso inBitmap :

O mapa de bits deve ser reutilizado com o mesmo tamanho que o contedo de origem (para assegurar que a mesma quantidade de memria seja usado), e no formato PNG (quer como um recurso ou como um fluxo) ou JPEG. A configurao do bitmap reutilizados substitui a configurao de inPreferredConfig , se definido. Voc deve sempre usar o bitmap retornado do mtodo de decodificao, pois no se pode presumir que a reutilizao do bitmap de trabalho (por exemplo, se h uma incompatibilidade de tamanho).

Salvar um bitmap para usar mais tarde


O trecho a seguir demonstra como um bitmap existente armazenado para possvel uso posterior no aplicativo de exemplo. Quando um aplicativo executado no Android 3.0 ou superior e um bitmap expulso do LruCache , uma referncia suave ao bitmap colocado em um HashSet , para possvel uso posterior cominBitmap :
HashSet < SoftReference < Bitmap >> mReusableBitmaps ; privado LruCache < Cordas , BitmapDrawable > mMemoryCache ; / / Se voc est rodando em Honeycomb ou mais recente, criar / / a HashSet de referncias a reutilizveis

Notificar a entrada removidos que no est sendo

A entrada removido um drawable reciclagem, para notific-la

/ / que foi removido do cache de memria. (( RecyclingBitmapDrawable ) oldValue ). setIsCached ( false ); mais { . / / A entrada removida uma BitmapDrawable padro se ( Utils . hasHoneycomb ()) { / / Estamos rodando em Honeycomb ou mais tarde, ento adicionar o / / para um SoftReference definido para possvel uso com inBitmap

bitmap mais tarde. mReusableBitmaps . adicionar ( novo SoftReference < Bitmap > ( oldValue . GetBitmap () )); } } } .... }

Use um bitmap existente


No aplicativo em execuo, os mtodos de descodificao verificar para ver se h um bitmap existente eles podem usar. Por exemplo:

Se estamos rodando em Honeycomb ou mais recente, tente usar

O prximo trecho mostra a addInBitmapOptions () mtodo que chamado no trecho acima. Ele procura por um bitmap existente para definir como o valor para inBitmap . Note-se que este mtodo s define um valor para inBitmap se encontrar um par adequado (o seu cdigo nunca deve assumir que um jogo vai ser encontrado):
privadas estticos vazio addInBitmapOptions ( BitmapFactory . Opes opes , ImageCache de cache ) { / / inBitmap s funciona com mutveis bitmaps, para forar o decodificador / / retorno mutveis bitmaps. opes . inMutable = verdadeiro ; se ( esconderijo ! = NULL ) { / / Tente encontrar um bitmap para usar inBitmap. Bitmap inBitmap = esconderijo . getBitmapFromReusableSet ( opes ); se ( inBitmap ! = NULL ) { / / Se um bitmap adequado foi encontrado, defina-o como o valor de / / inBitmap. opes . inBitmap = inBitmap ;

} } }

/ / Este mtodo percorre os bitmaps reutilizveis, procura de um / / para usar

Verifique que o item pode ser usado para inBitmap. se ( canUseForInBitmap ( artigo , opes )) { bitmap = artigo ; / / Remover dos conjunto reutilizvel por isso no pode ser usado novamente. iterator . remover (); pausa ; } } } } retorno bitmap ; } } mais { / / remover a partir do conjunto se a referncia foi apagada. iterator . remover ();

Finalmente, este mtodo determina se um mapa de bits candidato satisfaz os critrios de tamanho a ser usado para inBitmap :

Retorna true se "candidato" pode ser usado para inBitmap re-uso com / / "targetOptions". retorno candidato . getWidth () == largura && candidato . getHeight () altura ; }

==

Exibindo bitmaps em sua UI


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Carregar bitmaps em uma Implementao ViewPager 2. Carregar bitmaps em um GridView Implementao

VOC TAMBM DEVE LER


Android Projeto: Swipe Visualizaes

Android Projeto: Lista Grelha

EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip

Esta lio rene tudo de lies anteriores, mostrando-lhe como carregar vrios bitmaps em ViewPager e GridViewcomponentes utilizando um thread em segundo plano e cache de bitmap, ao lidar com a concorrncia e alteraes de configurao.

Carregar bitmaps em uma Implementao ViewPager


O padro de vista de furto uma excelente maneira de navegar a viso de uma galeria de imagem detalhes. Voc pode implementar este padro usando um ViewPager componente apoiado por um PagerAdapter . No entanto, um adaptador de apoio mais adequado a subclasseFragmentStatePagerAdapter que destri e salva o estado dos automaticamente Fragmentos do ViewPager como eles desaparecem fora da tela, mantendo-se o uso de memria para baixo. Nota: Se voc tem um nmero menor de imagens e estamos confiantes de que todos eles se encaixam dentro do limite de memria do aplicativo, em seguida, usando um regular PagerAdapter ouFragmentPagerAdapter poderia ser mais apropriado. Aqui est uma implementao de um ViewPager com ImageView filhos. A principal atividade tem oViewPager eo adaptador:

Um conjunto de dados estticos para fazer o ViewPager

Contm apenas um

Aqui est uma implementao do detalhes Fragment que detm os ImageView filhos. Isto pode parecer uma abordagem perfeitamente razovel, mas voc pode ver as desvantagens desta implementao? Como poderia ser melhorado?

Construtor vazio, exigido conforme Fragment

image_detail_fragment.xml contm apenas um

Carregar imagem em ImageView } }

Espero que voc percebeu o problema: as imagens esto sendo lidos a partir de recursos no segmento interface do usurio, que pode levar a um pedido de suspenso e ser vigor fechado. Usando um AsyncTask conforme descrito no Processamento de bitmaps Off the Tpico UI aula, simples de mover a imagem de carregamento e processamento para uma discusso de fundo:

Clame a ImageDetailActivity para carregar o bitmap em uma discusso de fundo (( ImageDetailActivity ) getActivity ()). LoadBitmap ( RESID , mImageView ); } } }

Qualquer outro tratamento suplementar (como redimensionamento ou imagens buscar a partir da rede) pode ter lugar no BitmapWorkerTask sem afetar a capacidade de resposta da interface do usurio principal. Se a linha de fundo est a fazer mais do que apenas a carga de uma imagem directamente a partir do disco, mas tambm pode ser benfica para adicionar uma memria e / ou o cache de disco, tal como descrito na lioCache bitmaps . Eis as modificaes adicionais para um cache de memria:

inicializar LruCache conforme Use a memria

incluir BitmapWorkerTask atualizado Use um cache de memria seo }

Colocando todos estes pedaos juntos d uma resposta ViewPager aplicao com o mnimo de latncia de carregamento de imagens ea capacidade de fazer tanto ou to pouco processamento em segundo plano em suas imagens, se necessrio.

Carregar bitmaps em um GridView Implementao


O bloco de construo lista grade til para mostrar conjuntos de dados de imagem e pode ser implementado usando um GridView componente em que muitas imagens podem estar na tela a qualquer momento e muitos mais necessidade de estar pronto para aparecer se o usurio rola para cima ou para baixo. Ao implementar este tipo de controle, voc deve garantir que a interface do usurio permanece fluida, uso de memria permanece sob controle e simultaneidade tratado corretamente (devido forma como GridView recicla seus filhos views). Para comear, aqui um padro GridView implementao com ImageView crianas colocadas dentro de umfragmento . Novamente, isso pode parecer uma abordagem perfeitamente razovel, mas o que faria melhor?

Um conjunto de dados estticos para fazer o GridView

Construtor vazio como por Fragment

se no for reciclado, inicializar alguns

Carregar imagem em ImageView retorno imageView ; } } }

Mais uma vez, o problema com esta implementao que a imagem est sendo definido no segmento.Enquanto isto pode funcionar para pequenas imagens simples (devido ao recurso de carga do sistema e cache), se algum processamento adicional precisa ser feito, a interface do usurio sofre uma parada. Processamento e armazenamento em cache mtodos da seo anterior do mesmo assncrona pode ser implementado aqui. No entanto, tambm preciso cuidado com as questes de simultaneidade como oGridView recicla seus filhos views. Para lidar com isso, usar as tcnicas discutidas nos bitmaps processamento off o segmento lio. Aqui est a soluo actualizao:

Cancelar tarefa anterior bitmapWorkerTask . cancelar ( verdadeiro ); mais { / / O mesmo trabalho j est em andamento retorno falso ;

} } / / Nenhuma tarefa associada com o ImageView, ou uma tarefa existente foi

incluir atualizada BitmapWorkerTask classe

Nota: O mesmo cdigo podem facilmente ser adaptado para funcionar com ListView bem. Esta implementao permite flexibilidade na forma como as imagens so processadas e carregado, sem impedir a suavidade da interface do usurio. Na tarefa de fundo que voc pode carregar imagens a partir da rede ou redimensionar grandes fotos da cmera digital e as imagens aparecem como as tarefas concluir o processamento. Para um exemplo completo deste e de outros conceitos discutidos nesta lio, consulte o aplicativo de amostra includo.

A exibio de grficos com OpenGL ES


COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 2.2 (API Nvel 8) ou superior Experimente a construo de umaplicativo Android

VOC TAMBM DEVE LER


OpenGL

EXPERIMENT-LO
Baixe o exemplo
OpenGLES.zip

O quadro Android oferece muitas ferramentas padro para a criao de interfaces grficas de usurio atraentes, funcionais.No entanto, se voc quer mais controle do que o seu aplicativo desenha na tela, ou se aventurar em grficos tridimensionais, voc precisa usar uma ferramenta diferente. As APIs OpenGL ES fornecido pelo framework Android oferece um conjunto de ferramentas para a exibio de high-end, grficos animados que so limitadas somente por sua imaginao e tambm podem se beneficiar da acelerao de unidades de processamento grfico (GPUs) fornecidas em muitos dispositivos Android. Esta classe percorre os conceitos bsicos de desenvolvimento de aplicaes que usam OpenGL, incluindo a instalao, objetos de desenho, mveis elementos desenhados e respondendo ao toque de entrada. O cdigo de exemplo esta classe usa o OpenGL ES 2.0 APIs, que a verso da API recomendada para uso com dispositivos Android atuais. Para mais informaes sobre as verses do OpenGL ES, consulte o OpenGL guia do desenvolvedor. Nota: Tenha cuidado para no misturar ES chamadas de API OpenGL 1.x com OpenGL ES 2.0 mtodos! As duas APIs no so intercambiveis e tentar us-los juntos s resulta em frustrao e tristeza.

Lies
Construindo um Ambiente OpenGL ES Saiba como configurar uma aplicao Android para ser capaz de desenhar grficos OpenGL. Definindo Shapes Aprenda a definir formas e por que voc precisa saber sobre os rostos e sinuosas. Formas de desenho Aprenda a desenhar formas OpenGL em sua aplicao. Aplicando projeo e Camera Visualizaes Aprenda a usar exibies de projeo e cmera para obter uma nova perspectiva sobre os objetos desenhados. Adicionando Movimento Aprenda a fazer movimento bsico e animao de objetos desenhados com OpenGL. Respondendo a eventos de toque

Saiba como fazer a interao bsica com grficos OpenGL.

Construindo um Ambiente OpenGL ES


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Declare OpenGL ES Uso no Manifesto 2. Criar uma atividade para grficos OpenGL ES 3. Construir um objeto GLSurfaceView 4. Construir uma classe Renderer

VOC TAMBM DEVE LER


OpenGL

EXPERIMENT-LO
Baixe o exemplo
OpenGLES.zip

A fim de desenhar grficos com OpenGL ES em seu aplicativo Android, voc deve criar um recipiente vista por eles. Uma das mais simples e direta maneiras de fazer isso implementar tanto a GLSurfaceView e GLSurfaceView.Renderer . AGLSurfaceView um recipiente vista para grficos desenhados com OpenGL e GLSurfaceView.Renderercontrola o que desenhado dentro desse ponto de vista. Para mais informaes sobre essas classes, consulte o OpenGL ESguia do desenvolvedor.
GLSurfaceView apenas uma maneira de incorporar grficos OpenGL ES em sua aplicao. Para uma

visualizao em tela cheia ou quase cheia grficos da tela, uma escolha razovel.Os desenvolvedores que desejam incorporar grficos OpenGL ES em uma pequena parcela de seus layouts deve dar uma olhada em TextureView . Pois, do-it-yourself desenvolvedores reais, tambm possvel construir uma viso OpenGL ES usando SurfaceView , mas isso requer escrever um pouco de cdigo adicional. Esta lio explica como concluir uma implementao mnima de GLSurfaceView e GLSurfaceView.Rendererem uma atividade de aplicao simples.

Declare OpenGL ES Uso no Manifesto


Para que o seu aplicativo para usar o OpenGL ES 2.0 API, voc deve adicionar a seguinte declarao para seu manifesto:
<Utiliza-feature android: glEsVersion = "0x00020000" android: exigido = "true" />

Se o seu aplicativo usa compresso de textura, voc tambm deve declarar que formatos de compresso voc apoiar para que os dispositivos que no suportam formatos de teses no tente executar o aplicativo:
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

Para obter mais informaes sobre formatos de compresso de textura, consulte o OpenGL guia do desenvolvedor.

Criar uma atividade para grficos OpenGL ES

Os aplicativos do Android que utilizam o OpenGL ES tm atividades como qualquer outro aplicativo que possui uma interface de usurio. A principal diferena de outras aplicaes o que voc colocar no layout para sua atividade. Enquanto em muitas aplicaes que voc pode usar TextView , Boto e ListView , em um aplicativo que usa OpenGL ES, voc tambm pode adicionar um GLSurfaceView . O exemplo de cdigo a seguir mostra uma implementao mnima de uma atividade que utiliza umGLSurfaceView como seu ponto de vista primrio:

Criar uma instncia GLSurfaceView e configur-lo / / como o ContentView para esta atividade. mGLView = new MyGLSurfaceView ( este ); setContentView ( mGLView ); } }

Nota: OpenGL ES 2.0 requer Android 2.2 (API Nvel 8) ou superior, para se certificar de suas metas do projeto Android que API ou superior.

Construir um objeto GLSurfaceView


A GLSurfaceView uma viso especializada, onde voc pode desenhar grficos OpenGL ES. Ele no faz muita coisa por si s. O desenho real dos objetos controlado no GLSurfaceView.Renderer que voc definir nesta viso. Na verdade, o cdigo para este objeto to fina, voc pode ser tentado a pular estendendo-o e apenas criar um inalterado GLSurfaceView exemplo, mas no faa isso. Voc precisa estender essa classe, a fim de capturar eventos de toque, que sero abordados no Respondendo a eventos de toque lio. O cdigo essencial para uma GLSurfaceView mnima, ento, para uma implementao rpida, comum apenas criar uma classe interna na atividade que usa-lo:
classe MyGLSurfaceView extends GLSurfaceView {

pblico MyGLSurfaceView ( Context contexto ) { super ( contexto ); / / definir o processador para desenhar sobre a GLSurfaceView setRenderer ( novo MyRenderer ()); } }

Ao usar o OpenGL ES 2.0, voc deve adicionar outra chamada para o seu GLSurfaceView construtor, especificando que voc quer usar a API 2.0:
/ / Criar um contexto OpenGL ES 2.0 setEGLContextClientVersion ( 2 );

Nota: Se voc estiver usando a API OpenGL ES 2.0, certifique-se de declarar isso no seu manifesto do aplicativo. Para mais informaes, consulte Declare OpenGL ES Uso do Manifesto . Uma outra adio opcional para o seu GLSurfaceView implementao para definir o modo de renderizao para desenhar apenas a vista quando h uma mudana em seus dados de desenho usando oGLSurfaceView.RENDERMODE_WHEN_DIRTY configurao:
/ / Processar a vista apenas quando h uma mudana no desenho dados setRenderMode ( GLSurfaceView . RENDERMODE_WHEN_DIRTY );

Essa configurao impede que o GLSurfaceView quadro de ser redesenhado at que voc chamerequestRender () , que mais eficiente para este aplicativo de exemplo.

Construir uma classe Renderer


A implementao do GLSurfaceView.Renderer classe, ou processador, dentro de um aplicativo que usa OpenGL ES onde as coisas comeam a ficar interessantes. Esta classe controla o que desenhado noGLSurfaceView com a qual ele est associado. Existem trs mtodos em um renderizador que so chamados pelo sistema Android, a fim de descobrir o que e como desenhar em um GLSurfaceView :
onSurfaceCreated () - Chamado uma vez para definir o ambiente de OpenGL ES da vista. onDrawFrame () - Chamado para cada redesenhar da vista. onSurfaceChanged () - Chamado se a geometria do ponto de vista muda, por exemplo, quando muda a

orientao da tela do dispositivo. Aqui est uma implementao bsica de um renderizador OpenGL ES, que no faz nada mais do que desenhar um fundo cinza no GLSurfaceView :
pblico classe MyGL20Renderer implementa GLSurfaceView . Renderer { {

pblico vcuo onSurfaceCreated ( GL10 no utilizado , EGLConfig configurao ) / / Define a cor de fundo quadro GLES20 . glClearColor ( 0.5f , 0.5f , 0.5f , 1.0f ); } pblico vazio onDrawFrame ( GL10 no utilizado ) { / / Redesenhar cor de fundo GLES20 . glClear ( GLES20 . GL_COLOR_BUFFER_BIT ); } pblico { GLES20 . glViewport ( 0 , } } 0 , largura , altura ); vazio onSurfaceChanged ( GL10 no utilizado , int largura ,

int altura )

Isso tudo que existe para ela! Os exemplos de cdigo acima criar uma aplicao Android simples que exibe uma tela cinza usando OpenGL. Embora esse cdigo no faz nada de muito interessante, criando essas classes, que lanou as bases que voc precisa para comear a desenhar elementos grficos com OpenGL. Nota: Voc pode se perguntar por que esses mtodos tm um GL10 parmetro, quando voc est usando o OpengGL ES APIs 2.0. Estas assinaturas de mtodos so simplesmente reutilizado para as APIs 2.0 para manter o cdigo do framework Android mais simples. Se voc estiver familiarizado com a APIs OpenGL ES, agora voc deve ser capaz de criar um ambiente de OpenGL ES em seu aplicativo e comear a desenhar grficos. No entanto, se voc precisa de um pouco mais de ajuda para comear com OpenGL, de cabea para as prximas aulas para mais algumas dicas.

Definindo Shapes
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Defina um tringulo 2. Definir uma Praa

VOC TAMBM DEVE LER


OpenGL Baixe o exemplo
OpenGLES.zip

Ser capaz de definir formas de ser elaborado no contexto de uma viso OpenGL ES o primeiro passo na criao de sua obra-prima grficos high-end. Desenhando com OpenGL ES pode ser um pouco complicado, sem saber algumas coisas bsicas sobre como OpenGL ES espera que voc definir objetos grficos. Esta lio explica o sistema de coordenadas OpenGL ES em relao a uma tela do dispositivo Android, o bsico de definio de uma forma, rostos de forma, bem como a definio de um tringulo e um quadrado.

Defina um tringulo
OpenGL ES permite definir objetos desenhados usando coordenadas no espao tridimensional. Ento, antes que voc pode desenhar um tringulo, voc deve definir as suas coordenadas. Em OpenGL, a maneira comum de fazer isso definir um conjunto de vrtices de nmeros de ponto flutuante para as coordenadas. Para a mxima eficincia, voc escreve estas coordenadas em um ByteBuffer , que passado para o pipeline de grficos OpenGL ES para processamento.
class Triangle {

privado

FloatBuffer VertexBuffer ;

/ / nmero de coordenadas por vrtice nesta matriz esttica final, int COORDS_PER_VERTEX = 3 ; estticos flutuador triangleCoords [] = { / / para a esquerda: 0.0f , 0.622008459f , 0.0f , / / top - 0.5f , - 0.311004243f , 0.0f , / / inferior esquerdo 0.5f , - 0.311004243f , 0.0f / / inferior direito

}; / / Set de cores com valores de alfa (opacidade), vermelho, verde, azul e flutuar cor [] = { 0.63671875f , 0.76953125f , 0.22265625f , 1.0f }; pblico Triangle () { / / inicializa o buffer de bytes vrtice de forma coordena ByteBuffer bb = ByteBuffer . allocateDirect ( / / (nmero de valores de coordenadas * 4 bytes por float) triangleCoords . comprimento * 4 ); / / use nativo byte ordem do hardware do dispositivo bb . ordem ( ByteOrder . nativeOrder ()); / / cria um buffer de ponto flutuante do ByteBuffer VertexBuffer = bb . asFloatBuffer (); / / adiciona as coordenadas para a FloatBuffer VertexBuffer . colocar ( triangleCoords ); / / definir o buffer para ler a primeira coordenada VertexBuffer . posio ( 0 ); } }

Por padro, o OpenGL ES assume um sistema de coordenadas onde [0,0,0] (X, Y, Z) especifica o centro daGLSurfaceView quadro, [1,1,0] o canto superior direito do quadro e [- 1, -1,0] canto inferior esquerdo do quadro. Para uma ilustrao deste sistema de coordenadas, consulte o OpenGL ES guia do desenvolvedor. Note-se que as coordenadas desta forma so definidos numa ordem anti-horrio. A ordem de desenho importante porque ele define qual o lado da face frontal da forma que voc normalmente quer ter desenhado, eo rosto de volta, que voc pode optar por no desenhar usando o recurso de rosto abater OpenGL ES. Para mais informaes sobre os rostos e abate, consulte o OpenGL ES guia do desenvolvedor.

Definir uma Praa

Definindo tringulos muito fcil em OpenGL, mas que se voc deseja obter um um pouco mais complexo?Digamos, um quadrado? H um certo nmero de maneiras de fazer isso, mas um caminho tpico para desenhar uma forma tal em OpenGL ES usar dois tringulos desenhados em conjunto:

Figura 1. Desenhar um quadrado com dois tringulos.

Novamente, voc deve definir os vrtices em uma ordem anti-horrio para ambos os tringulos que representam esta forma, e colocar os valores em um ByteBuffer . A fim de evitar definir as duas coordenadas compartilhadas por cada tringulo duas vezes, usar uma lista de desenho para contar a pipeline de grficos OpenGL ES como desenhar esses vrtices. Aqui est o cdigo para esta forma:

classe

Praa

{ FloatBuffer VertexBuffer ; ShortBuffer drawListBuffer ;

privado privado

/ / nmero de coordenadas por vrtice nesta matriz esttica ltima int COORDS_PER_VERTEX = 3 ; estticos flutuador squareCoords [] = { - 0.5f , 0.5f , 0.0f , / / superior esquerdo - 0.5f , - 0.5f , 0.0f , / / canto inferior esquerdo 0.5f , - 0.5f , 0.0f , / / inferior direito 0.5f , 0.5f , 0.0f }; / / superior direito privado curto DRAWORDER [] chamar vrtices = { 0 , 1 , 2 , 0 , 2 , 3 }; / / fim de

pblico Praa () { / / inicializa o buffer de bytes vrtice de coordenadas de forma ByteBuffer bb = ByteBuffer . allocateDirect ( / / (nmero de valores de coordenadas * 4 bytes por

inicializar buffer de bytes para a lista de sorteio ByteBuffer dlb = ByteBuffer . allocateDirect ( / / (nmero de valores de coordenadas * 2 bytes por

Este exemplo d uma espiada no que preciso para criar formas mais complexas com OpenGL. Em geral, voc usa colees de tringulos para desenhar objetos. Na prxima lio, voc aprende como desenhar essas formas na tela.

Formas de desenho
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Inicializar Shapes 2. Desenhar uma forma

VOC TAMBM DEVE LER


OpenGL Baixe o exemplo
OpenGLES.zip

Depois de definir formas a serem desenhadas com OpenGL, voc provavelmente vai querer desenhlos. Desenhar formas com o OpenGL ES 2.0 leva um pouco mais de cdigo do que voc pode imaginar, porque a API fornece uma grande quantidade de controle sobre o processamento pipeline de grficos. Esta lio explica como desenhar as formas que voc definiu na lio anterior usando a API OpenGL ES 2.0.

Inicializar Shapes
Antes de fazer qualquer desenho, voc deve inicializar e carregar as formas que voc pretende desenhar. A menos que a estrutura (as coordenadas originais) das formas que voc usa em sua mudana de programa durante o curso da execuo, voc dever inicializa-la no onSurfaceCreated () mtodo do seu processador para a memria ea eficincia de processamento.
pblico ... vazio onSurfaceCreated ( GL10 no utilizado , EGLConfig configurao ) {

/ / inicializa um tringulo mTriangle = new Triangle (); / / inicializa uma praa mSquare = new Praa (); }

Desenhar uma forma


Desenhar uma forma definida usando OpenGL ES 2.0 requer uma quantidade significativa de cdigo, porque voc deve fornecer um monte de detalhes para o pipeline de processamento de grficos. Especificamente, voc deve definir o seguinte:

Vertex Shader - OpenGL ES cdigo grfico para renderizar os vrtices de uma forma. Fragment Shader - cdigo OpenGL ES para processar o rosto de uma forma com cores ou texturas. Programa - Um objeto OpenGL ES que contm os shaders que voc deseja usar para desenhar uma ou mais formas.

Voc precisa de pelo menos um shader vertex para desenhar uma forma e um fragmento de shader de cor que forma. Estes shaders devem ser respeitadas e depois adicionada a um programa OpenGL ES, que ento utilizado para desenhar a forma. Aqui est um exemplo de como definir shaders bsicos que voc pode usar para desenhar uma forma:
privado ltima seqncia vertexShaderCode = "atributo vec4 vPosition;" + "void main () {" + "gl_Position = vPosition;" + "}" ; privado ltima seqncia fragmentShaderCode = "mediump bia de preciso;" + "uniforme vec4 vColor"; + "void main () {" + "gl_FragColor = vColor;" + "}" ;

Shaders conter OpenGL Shading Language (GLSL), cdigo que deve ser compilado antes de us-lo no ambiente de OpenGL ES. Para compilar este cdigo, crie um mtodo utilitrio na classe renderer:
pblico static int loadShader ( int tipo , Cordas shaderCode ) {

/ / cria um tipo de shader de vrtice (GLES20.GL_VERTEX_SHADER) / / ou um tipo de shader de fragmento (GLES20.GL_FRAGMENT_SHADER) int shader = GLES20 . glCreateShader ( tipo ); / / adiciona o cdigo fonte para o shader e compil-lo GLES20 . glShaderSource ( shader , shaderCode ); GLES20 . glCompileShader ( shader ); retorno shader ; }

A fim de chamar a sua forma, voc deve compilar o cdigo shader, adicion-los a um objeto de programa OpenGL ES e, em seguida, ligar o programa. Faa isso no construtor do objeto desenhado, por isso feito uma nica vez. Nota: Compilando shaders OpenGL ES e vinculando programas caro em termos de ciclos de CPU e tempo de processamento, de modo que voc deve evitar fazer isso mais de uma vez. Se voc no sabe o contedo de seus shaders em tempo de execuo, voc deve construir o seu cdigo de tal forma que eles s so criados uma vez e, em seguida, armazenados em cache para uso posterior.

criar vazio Programa OpenGL ES GLES20 . glAttachShader ( mProgram , vertexShader ); / / adiciona o shader de vrtice para o programa GLES20 . glAttachShader ( mProgram , fragmentShader ); / / adiciona o shader fragmento de programa GLES20 . glLinkProgram ( mProgram ); / / cria OpenGL executveis do programa ES }

Neste ponto, voc est pronto para adicionar as chamadas reais que atraem a sua forma. Desenho formas com OpenGL ES requer que voc especifique diversos parmetros para dizer o pipeline de renderizao que voc quer desenhar e como desenh-la. Desde opes de desenho podem variar de acordo com a forma, uma boa idia ter suas aulas de forma conter sua prpria lgica de desenho. Criar um draw () mtodo para desenhar a forma. Este cdigo define a posio e cor valores de sombreamento de vrtice da forma e shader de fragmento, e, em seguida, executa a funo de desenho.
pblico vazio draw () { / / Adicionar programa para OpenGL ambiente ES GLES20 . glUseProgram ( mProgram ); / / pega pega para vPosition membro do shader de vrtice mPositionHandle = GLES20 . glGetAttribLocation ( mProgram , / / Ativar um identificador para o vrtices do tringulo GLES20 . glEnableVertexAttribArray ( mPositionHandle ); "vPosition" );

/ / Prepare a coordenada tringulo

conseguir lidar com a vColor membro fragmento do shader mColorHandle = GLES20 . glGetUniformLocation ( mProgram , cor / / Set para desenhar o tringulo GLES20 . glUniform4fv ( mColorHandle , uma , cor , 0 );

"vColor" );

/ / Desenha o tringulo GLES20 . glDrawArrays ( GLES20 . GL_TRIANGLES ,

0 , VertexCount );

/ / Desativar conjunto vrtice GLES20 . glDisableVertexAttribArray ( mPositionHandle ); }

Uma vez que voc tem todo esse cdigo no lugar, tirando esse objeto requer apenas uma chamada para o draw () mtodo de dentro do seu renderizador onDrawFrame () mtodo. Quando voc executa o aplicativo, ele deve ser algo parecido com isto:

Figura 1. tringulo desenhado sem uma viso de projeo ou cmara.

Existem alguns problemas com este exemplo de cdigo. Primeiro de tudo, ele no est indo para impressionar seus amigos. Em segundo lugar, o tringulo um pouco achatada e muda de forma quando voc muda a orientao da tela do dispositivo. A razo pela qual a forma enviesada devido ao facto de que os vrtices do objeto no foram corrigidos para as propores da rea da tela, onde a GLSurfaceView exibida. Voc pode corrigir esse problema usando uma projeo e viso da cmera na prxima lio. Por ltimo, o tringulo estacionria, que um pouco aborrecido. No Movimento Adicionando lio, voc faz esta forma girar e fazer um uso mais interessante do pipeline de grficos OpenGL ES.

Aplicando projeo e Camera Visualizaes


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Definir uma projeo 2. Definir uma cmera de viso 3. Aplicar projeo e cmera Transformaes

VOC TAMBM DEVE LER


OpenGL Baixe o exemplo
OpenGLES.zip

No ambiente OpenGL ES, vistas de projeo e cmera permitem que voc exiba objetos desenhados de uma forma que mais se assemelha ao modo como voc v os objetos fsicos com seus olhos. Esta simulao da viso fsica feito com transformaes matemticas de coordenadas de objetos desenhados:

Projeco - Esta transformao ajusta as coordenadas dos objectos desenhados com base na largura e altura daGLSurfaceView onde so exibidos. Sem esse clculo, objetos desenhados por OpenGL ES so distorcidos pelas propores desiguais da janela de exibio. A transformao de projeo normalmente s tem que ser calculado quando as propores da vista OpenGL so estabelecidos ou alterados na onSurfaceChanged ()mtodo do seu representante. Para mais informaes sobre as projees da OpenGL ES e coordenar mapeamento, consulte coordenadas de mapeamento para objetos desenhados . Cmara Vista - Esta transformao ajusta as coordenadas de objetos desenhados com base em uma posio da cmera virtual. importante notar que o OpenGL ES no define um objeto cmera real, mas em vez disso fornece mtodos utilitrios que simulam uma cmera, transformando a exibio de objetos desenhados. A transformao de viso da cmera pode ser calculado apenas uma vez, quando voc estabelecer suaGLSurfaceView , ou pode mudar dinamicamente com base em aes do usurio ou a funo do aplicativo.

Esta lio descreve como criar uma vista de projeo e cmera e aplic-la a formas desenhadas em suaGLSurfaceView .

Definir uma projeo


Os dados para uma transformao de projeco calculado no onSurfaceChanged () o mtodo do seuGLSurfaceView.Renderer classe. O seguinte exemplo de cdigo tem a altura ea largura da GLSurfaceView e usa-lo para preencher uma transformao de projeo Matrix usando o Matrix.frustumM () mtodo:
@ Override pblico vazio onSurfaceChanged ( GL10 no utilizado , GLES20 . glViewport ( 0 , 0 , largura , altura ); flutuador relao =

int largura ,

int altura )

( flutuador ) largura / altura ;

/ / esta matriz de projeo aplicada ao objeto coordenadas / / no onDrawFrame () mtodo Matrix . frustumM ( mProjMatrix , 0 , - relao , proporo , ); }

- 1 ,

1 ,

3 ,

Este cdigo preenche uma matriz de projeo, mProjMatrix que voc pode combinar com uma transformao cmera de viso no onDrawFrame () mtodo, que apresentado na prxima seo. Nota: S a aplicao de uma transformao de projeo de seus objetos de desenho normalmente resulta em uma exposio muito vazio. Em geral, voc deve tambm aplicar uma transformao de viso da cmera, para que qualquer coisa que aparecer na tela.

Definir uma cmera de viso


Completar o processo de transformao de seus objetos desenhados pela adio de uma transformao de viso da cmera, como parte do processo de desenho. No seguinte exemplo de cdigo, a transformao de vista da cmara calculado utilizando a Matrix.setLookAtM () mtodo e, em seguida, combinado com a matriz de projeco anteriormente calculado. As matrizes de transformao combinadas so ento passados para a forma desenhada.
@ Override pblico vazio onDrawFrame ( GL10 no utilizado ) ... / / Definir a posio da cmera (Ver matriz) Matrix . setLookAtM ( mVMatrix , 0 , 0 , 0 , 1.0f , 0,0 f );

- 3 ,

0f ,

0f ,

0f ,

0f ,

/ / Calcular a projeo e vista transformao Matrix . multiplyMM ( mMVPMatrix , 0 , mProjMatrix , / / Desenha forma mTriangle . desenhar ( mMVPMatrix ); }

0 , mVMatrix ,

0 );

Aplicar projeo e cmera Transformaes


Para utilizar a projeo combinado e cmera de viso matriz de transformao mostrado nas sees prvias, modificar o draw () mtodo de seus objetos grficos para aceitar a matriz de transformao combinado e aplic-lo para a forma:
pblico vazio empate ( flutuar [] mvpMatrix ) calculado ... { / / passa na matriz de transformao

/ / obtm lidar com a forma de transformao da matriz mMVPMatrixHandle = GLES20 . glGetUniformLocation ( mProgram , / / Aplicar a projeo e transformao vista GLES20 . glUniformMatrix4fv ( mMVPMatrixHandle , / / desenha o tringulo GLES20 . glDrawArrays ( GLES20 . GL_TRIANGLES , ... } 1 ,

"uMVPMatrix" ); 0 );

falso , mvpMatrix ,

0 , VertexCount );

Depois de ter calculado atravs corretamente e aplicou a projeo e transformaes de vista de cmara, os objetos grficos so desenhados em propores corretas e deve ficar assim:

Figura 1. tringulo desenhado com uma projeo e viso da cmera aplicada.

Agora que voc tem um aplicativo que exibe suas formas em propores corretas, hora de adicionar movimento s suas formas.

Adicionando Movimento
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Rodar uma Forma 2. Ativar renderizao contnua

VOC TAMBM DEVE LER


OpenGL Baixe o exemplo
OpenGLES.zip

Desenhar objetos na tela uma caracterstica bastante bsico de OpenGL, mas voc pode fazer isso com outras classes Framwork grficos Android, incluindo Canvas e Drawableobjetos. OpenGL ES oferece recursos adicionais para mover e transformar objetos desenhados em trs dimenses ou de outras formas nicas para criar experincias de usurio atraentes. Nesta lio, voc dar mais um passo em frente para usar OpenGL ES, aprendendo a adicionar movimento a uma forma de rotao.

Rodar uma Forma

Girando um objeto de desenho com OpenGL ES 2.0 relativamente simples. Voc pode criar uma outra matriz de transformao (a matriz de rotao) e, em seguida, combin-lo com a sua projeo e cmera de viso matrizes tranformation:
privado pblico ... flutuador [] mRotationMatrix = new vazio onDrawFrame ( GL10 gl ) { flutuador [ 16 ];

/ / Cria uma transformao de rotao para o

Combine a matriz de rotao com a projeo e cmera de viso Matrix . multiplyMM ( mMVPMatrix , 0 , mRotationMatrix , 0 , mMVPMatrix , / / Desenha tringulo mTriangle . desenhar ( mMVPMatrix ); }

0 );

Se o seu tringulo no roda aps fazer essas alteraes, certifique-se de ter comentado oGLSurfaceView.RENDERMODE_WHEN_DIRTY configurao, conforme descrito na prxima seo.

Ativar renderizao contnua


Se voc praticou juntamente com o cdigo de exemplo nesta classe a este ponto, certifique-se de comentar a linha que define o modo de renderizao s chamar quando estiver sujo, caso contrrio, OpenGL gira a forma apenas um incremento e aguarda uma chamada para requestRender () do GLSurfaceView recipiente:
pblico MyGLSurfaceView ( Context contexto ) { ... / / Processar a vista apenas quando h uma mudana nos dados de desenho / / setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY) / / comente para autorotao }

A menos que voc tem objetos de mudana, sem qualquer interao do usurio, geralmente uma boa idia ter esse sinalizador ligado. Esteja pronto para tire esse cdigo, porque a prxima aula faz este apelo aplicvel uma vez.

Respondendo a eventos de toque


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Configurar um Listener Toque 2. Expor o ngulo de rotao 3. Aplicar Rotation

VOC TAMBM DEVE LER


OpenGL Baixe o exemplo
OpenGLES.zip

Fazer objetos se movem de acordo com um programa pr-como tringulo do rotativo til para obter um pouco de ateno, mas que se voc quiser ter os usurios interagem com seus grficos OpenGL ES? A chave para fazer o OpenGL ES interativa sensvel ao toque aplicao est expandindo sua implementao GLSurfaceView para substituir oonTouchEvent () para ouvir eventos de toque.

Esta lio mostra como ouvir para eventos de toque para permitir aos usurios girar um objeto OpenGL ES.

Configurar um Listener Toque


A fim de tornar a sua aplicao OpenGL ES responder a eventos de toque, voc deve implementar oonTouchEvent () mtodo em sua GLSurfaceView classe. O exemplo abaixo mostra como a implementao para ouvir MotionEvent.ACTION_MOVE eventos e traduzi-los para um ngulo de rotao de uma forma.
@ Override pblico boolean onTouchEvent ( MotionEvent e ) { / / MotionEvent relatrios de detalhes de entrada da tela de toque / / e outros controles de entrada. Neste caso, voc s / / interessados em eventos onde a posio de toque

sentido de rotao inverso acima da linha mdia se ( y > getHeight () / 2 ) { dx = dx * - 1 ; } / direo / reverso da rotao para a esquerda da linha mdia , se ( x < getWidth () / 2 ) { dy = dy * - 1 ; } mRenderer . mangle + = / 320 requestRender (); } mPreviousX = x ; mPreviousY = y ; retornar verdadeiro ; } ( dx + dy ) * TOUCH_SCALE_FACTOR ; / / = 180.0f

Observe que aps o clculo do ngulo de rotao, este mtodo chama requestRender () para dizer ao representante que hora de tornar o quadro. Esta abordagem o mais eficaz neste exemplo porque o quadro no precisam de ser redesenhada a menos que haja uma alterao na rotao. No entanto, ele no tem qualquer impacto sobre a eficincia, a menos que voc tambm solicitar que o renderizador apenas redesenhar quando as alteraes de dados usando o setRenderMode () mtodo, ento certifique-se esta linha comentada no processador:
pblico MyGLSurfaceView ( Context contexto ) { ... / / Processar a vista apenas quando h uma mudana no desenho dados setRenderMode ( GLSurfaceView . RENDERMODE_WHEN_DIRTY ); }

Expor o ngulo de rotao


O exemplo de cdigo acima requer que voc exponha o ngulo de rotao atravs de seu processador, adicionando um membro do pblico. Desde que o cdigo processador est sendo executado em uma thread separada da thread principal do seu aplicativo de interface de usurio, voc deve declarar esta varivel pblica como voltil . Aqui est o cdigo para fazer isso:
pblico classe MyGLRenderer implementa ... pblico voltil flutuador mangle ; GLSurfaceView . Renderer {

Aplicar Rotation
Para aplicar a rotao gerada pela entrada de toque, comente o cdigo que gera um ngulo e adicionar mangle , que contm o ngulo de entrada gerado toque:
pblico vazio onDrawFrame ( GL10 gl ) { ... / / Cria uma rotao para o tringulo / / long time = SystemClock.uptimeMillis ()% 4000L; ngulo / / bia = 0.090f * ((int) tempo); Matrix . setRotateM ( mRotationMatrix , 0 , mangle ,

0 ,

0 ,

- 1.0f ); 0 );

/ / Combine a matriz de rotao com a projeo e cmera de viso Matrix . multiplyMM ( mMVPMatrix , 0 , mRotationMatrix , 0 , mMVPMatrix , / / Desenha tringulo mTriangle . empate ( mMVPMatrix ); }

Quando voc tiver concludo as etapas descritas acima, execute o programa e arrastar o dedo sobre a tela para girar o tringulo:

Figura 1. Tringulo sendo rodado com a entrada de toque (crculo mostra a localizao de toque).

Adicionando animaes
COMEAR

DEPENDNCIAS E PR-REQUISITOS
Android 4.0 ou posterior Experimente construir um Android User Interface

VOC TAMBM DEVE LER


Animao propriedade

EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip

As animaes podem adicionar elementos visuais sutis que avisam os usurios sobre o que est acontecendo em seu aplicativo e melhorar o seu modelo mental de interface de seu aplicativo. Animaes so especialmente teis quando a tela muda de estado, tais como quando as cargas de contedo ou novas aes se tornam disponveis. Animaes tambm pode adicionar um olhar polido para sua aplicao, o que d a sua aplicao uma sensao de qualidade superior. Tenha em mente, porm, que o uso excessivo de animaes ou utiliz-los na hora errada pode ser prejudicial, como quando eles causam atrasos. Esta classe de treinamento mostra como implementar alguns tipos comuns de animaes que podem aumentar a usabilidade e adicionar um toque sem irritar seus usurios.

Lies

Misturar duas vistas Aprenda a crossfade entre duas vises que se sobrepem. Esta lio mostra como crossfade um indicador de progresso para uma exibio que contm o contedo do texto. Usando ViewPager para Slides de tela Aprenda a animar entre telas adjacentes horizontalmente com uma transio de deslizamento. Exibindo Carto Animations Virar Saiba como animar entre dois pontos de vista com um movimento de inverso. Zoom Vista Saiba como aumentar pontos de vista com uma animao touch-to-zoom. Animando Alteraes de layout Saiba como ativar o built-in animaes quando adicionar, remover ou atualizar exibies criana em um layout.

Misturar duas vistas


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A:

1. Criar as vistas 2. Configure o Animation 3. Crossfade as Visualizaes

EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip

Animaes Crossfade (tambm conhecido como dissolver) desvanecem-se gradualmente para fora um componente UI simultaneamente, desaparecendo em outro. Esta animao til para situaes em que voc quer mudar o contedo ou vistas em seu aplicativo. Crossfades so muito sutis e curta, mas oferecer uma transio fluida de uma tela para a outra.Quando voc no us-los, no entanto, as transies muitas vezes se sentem abrupta ou apressada. Aqui est um exemplo de um crossfade de um indicador de progresso para algum contedo de texto. Animao Crossfade

Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o exemplo Crossfade. Veja os seguintes arquivos para a execuo de cdigo:
src / CrossfadeActivity.java layout / activity_crossfade.xml Menu / activity_crossfade.xml

Criar as vistas

Crie os dois pontos de vista que voc quer crossfade. O exemplo a seguir cria um indicador de progresso e uma exibio de texto de rolagem:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView style="?android:textAppearanceMedium" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" android:padding="16dp" /> </ScrollView> <ProgressBar android:id="@+id/loading_spinner" style="?android:progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content"

android:layout_gravity="center" /> </FrameLayout>

Configure o Animation
Para configurar a animao: 1. Criar variveis de membros para os pontos de vista que voc quer crossfade. Voc precisa dessas referncias mais tarde, quando modificar os pontos de vista durante a animao. 2. Para o ponto de vista que est sendo desapareceu em, defina sua visibilidade para IDO . Isso evita que a vista ocupando espao layout e omite que a partir de clculos de layout, acelerando o processamento. 3. Armazenar em cache o config_shortAnimTime propriedade do sistema em uma varivel de membro. Esta propriedade define a durao padro "curto" para a animao. Esta durao ideal para animaes sutis ou animaes que ocorrem com muita freqncia. config_longAnimTime e config_mediumAnimTimetambm esto disponveis se voc quiser us-los. Aqui est um exemplo usando o layout a partir do trecho de cdigo anterior, como a exibio de contedo de atividade:

Inicialmente ocultar a exibio de contedo. mContentView . setVisibility ( Viso . IDO ); / / Recuperar e cache padro tempo de animao do sistema "short". mShortAnimationDuration = getResources (). getInteger ( android . R . inteiro . config_shortAnimTime ); }

Crossfade as Visualizaes
Agora que as opinies sejam devidamente configurado, crossfade-los, fazendo o seguinte: 1. Para a viso de que est desaparecendo em ajustar o valor alfa para 0 ea visibilidade para VISVEL .(Lembre-se que foi inicialmente definido para IDO ). Isso faz com que o ponto de vista visvel, mas completamente transparente.

2. Para a viso de que est desaparecendo em, animar o seu valor alfa de 0 a 1 . Ao mesmo tempo, para a viso de que est desaparecendo, animar o valor de alfa de 1 a 0 . 3. Usando onAnimationEnd () em um Animator.AnimatorListener , definir a visibilidade da opinio de que foi desaparecendo a IDO . Mesmo que o valor de alfa 0 , definindo a visibilidade da vista a IDO impede a vista ocupando espao layout e omite que a partir de clculos de layout, acelerando o processamento. O mtodo a seguir mostra um exemplo de como fazer isso:

Definir o ponto de vista de contedo para 0% de opacidade, mas visvel, de modo que visvel / / (mas totalmente transparente) durante a animao. mContentView . setAlpha ( 0f ); mContentView . setVisibility ( Viso . VISVEL ); / / Animar o ponto de vista de contedo para 100% de opacidade, e limpar qualquer animao / / ouvinte definido na exibio. mContentView . animar () . alfa ( 1F ) . setDuration ( mShortAnimationDuration ) . setListener ( nulo ); / / Animar o ponto de vista de carga para 0% de opacidade. Aps a animao termina, / / define a sua visibilidade para IDO como uma etapa de otimizao (no vai / / participar de passes de layout,

Usando ViewPager para Slides de tela


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Criar as vistas 2. Crie o Fragmento 3. Adicione ViewPager 4. Personalize a animao com PageTransformer

EXPERIMENT-LO
Faa o download do aplicativo de exemplo

Animations.zip

Slides de tela so as transies entre uma tela inteira para outro e so comuns com UIs como assistentes de configurao ou apresentaes. Esta lio mostra como fazer slides de tela com um ViewPager fornecido pela biblioteca de suporte .ViewPager s pode animar lminas tela automaticamente. Aqui est o que um slide tela parece que as transies de uma tela de contedo para a prxima: Animao de slide tela

Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione a exemplo do slide tela. Veja os seguintes arquivos para a execuo de cdigo:
src / ScreenSlidePageFragment.java src / ScreenSlideActivity.java layout / activity_screen_slide.xml layout / fragment_screen_slide_page.xml

Criar as vistas
Criar um arquivo de layout que voc vai usar mais tarde para o contedo de um fragmento. O exemplo a seguir contm uma viso de texto para exibir algum texto:
<com.example.android.animationsdemo.ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView style="?android:textAppearanceMedium" android:padding="16dp" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" /> </com.example.android.animationsdemo.ScrollView>

Crie o Fragmento
Criar um fragmento de classe que retorna o layout que voc acabou de criar no onCreateView () mtodo.Voc pode, ento, criar instncias desse fragmento da atividade dos pais, sempre que voc precisar de uma nova pgina para exibir para o usurio:
public class ScreenSlidePageFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater.inflate(

R.layout.fragment_screen_slide_page, container, false); return rootView; } }

Adicione ViewPager
ViewPager s tm embutido gestos swipe para a transio atravs das pginas, e eles exibem animaes de slides de tela por padro, ento voc no precisa criar nenhuma. ViewPager uso s PagerAdapter s como uma fonte de novas pginas para exibir, de modo que os PagerAdapter vontade usar a classe fragmento que voc

criou anteriormente. Para comear, crie um layout que contm um ViewPager :


<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" />

Criar uma atividade que faz as seguintes coisas:


Define o ponto de vista do contedo a ser o layout com o ViewPager . Cria uma classe que estende a FragmentStatePagerAdapter classe abstrata e implementa o getItem ()mtodo para fornecer exemplos de ScreenSlidePageFragment como novas pginas. O adaptador de pager tambm exige que voc implemente o getCount () , que retorna a quantidade de pginas que o adaptador criar (cinco no exemplo). Conecta os PagerAdapter ao ViewPager . Manipula o boto Voltar do dispositivo, movendo para trs na pilha virtual de fragmentos. Se o usurio j est na primeira pgina, voltar sobre a atividade de volta empilhar.

pblico classe ScreenSlidePagerActivity estende FragmentActivity { / ** * O nmero de pginas (passos do assistente) para mostrar nesta demonstrao. * / private static finais int NUM_PAGES = 5 ; / ** * O Widget de pager, que lida com animao e permite passando horizontalmente para acesso anterior * e os prximos passos do assistente. * / privado ViewPager mPager ; / ** * O adaptador pager, que fornece as pginas para a exibio pager

Instanciar um ViewPager e uma

Se o usurio est olhando para a primeira etapa, permitem que o sistema para lidar com o boto / / Back. Este acabamento chamadas () sobre essa atividade e aparece a pilha de volta. Super . onBackPressed (); } mais { / / Caso contrrio, selecione a etapa anterior. mPager . setCurrentItem ( mPager . GetCurrentItem () - 1 ); } } / ** * Um adaptador simples pager que representa 5 objetos ScreenSlidePageFragment, em *

Personalize a animao com PageTransformer


Para exibir uma animao diferente da animao de slides de tela padro, implementar oViewPager.PageTransformer interface e fornec-lo com a viso pager. A interface expe um nico mtodo,transformPage () . Em cada ponto de transio da tela, este mtodo chamado uma vez para cada pgina visvel (geralmente h apenas uma pgina visvel) e para pginas adjacentes apenas fora da tela. Por exemplo, se a pgina trs visvel e que o usurio arrasta para a pgina quatro, transformPage () chamado para as pginas dois, trs, e quatro em cada etapa do gesto. Em sua implementao do transformPage () , ento voc pode criar animaes de slides personalizados por determinar quais pginas precisam ser transformados com base na posio da pgina na tela, que obtido a partir da posio de parmetro do transformPage () mtodo. A posio do parmetro indica que uma determinada pgina est localizado em relao ao centro da tela. uma propriedade dinmica, que muda conforme o usurio rola pelas pginas. Quando uma pgina preenche a tela, o seu valor de posio 0 . Quando uma pgina desenhada apenas fora do lado direito da tela, o seu valor de posio 1 . Se o usurio rola a meio caminho entre uma e duas pginas, uma pgina tem uma posio de -0,5 e pgina dois tem uma posio de 0,5. Com base na posio das pginas na tela, voc pode

criar animaes de slides personalizados, definindo as propriedades da pgina com mtodos como setAlpha () ,setTranslationX () , ou setScaleY () . Quando voc tem uma implementao de um PageTransformer , ligue setPageTransformer () com a sua implementao para aplicar as animaes personalizadas. Por exemplo, se voc tem um PageTransformerchamado ZoomOutPageTransformer , voc pode definir suas animaes personalizadas como esta:
ViewPager pager = (ViewPager) findViewById(R.id.pager); ... pager.setPageTransformer(true, new ZoomOutPageTransformer());

Veja o transformador pgina Zoom-out e transformador pgina Profundidade sees para exemplos e vdeos de um PageTransformer .

Transformador pgina Zoom-out


Esta pgina encolhe transformador e desaparece pginas durante o deslocamento entre pginas adjacentes.Como uma pgina fica mais perto do centro, ele cresce de volta ao seu tamanho normal e desaparece pol
ZoomOutPageTransformer exemplo

[-Infinity, -1) / / Esta pgina o caminho para fora da tela para a esquerda. vista . setAlpha ( 0 ); } mais se ( posio <= 1 ) { / / [-1,1] / / Modificar o padro transio de slides para encolher a pgina como

Dimensionar a pgina para baixo (entre MIN_SCALE e 1) vista . setScaleX ( ScaleFactor ); vista . setScaleY ( ScaleFactor ); . / / Desaparecer a pgina em relao ao seu tamanho vista . setAlpha ( MIN_ALPHA + ( ScaleFactor - MIN_SCALE ) / ( 1 - MIN_SCALE ) * ( 1 - MIN_ALPHA )); } mais { / / (1, + infinito] . / / Esta pgina o caminho para fora da tela para a direita vista . setAlpha ( 0 );

} } }

Transformador pgina profundidade


Este transformador pgina usa a animao de slide padro para as pginas esquerda deslizando, enquanto estiver usando uma animao de "profundidade" para pginas deslizando para a direita. Esta profundidade de animao desaparece a pgina para fora e balanas ele para baixo de forma linear.
DepthPageTransformer exemplo

Nota: Durante a animao de profundidade, a animao default (um slide tela) ainda ocorre, ento voc deve neutralizar o slide tela com uma traduo X negativo. Por exemplo:
ver . setTranslationX (- 1 * vista . getWidth () * posio );

O exemplo a seguir mostra como neutralizar a animao de slide tela padro em um transformador pgina de trabalho:

[-Infinity, -1) / / Esta pgina o caminho para fora da tela para a esquerda. vista . setAlpha ( 0 ); } mais se ( posio <= 0 ) { / / [-1,0] / / Use o padro deslizar transio ao mover para a esquerda

(0,1] / / desvanece-se a pgina para fora. vista . setAlpha ( 1 - posio ); / / neutralizar a transio de slides padro vista . setTranslationX ( pageWidth * - posio ); / / Escala a pgina para baixo (entre MIN_SCALE e

(1, + infinito] / / Esta pgina o caminho para fora da tela para a direita. vista . setAlpha ( 0 ); } } }

Exibindo Carto Animations Virar


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A


1. Crie os Animadores 2. Criar as vistas 3. Crie o Fragmento 4. Animar a Flip carto

EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip

Esta lio mostra como fazer um carto de animao flip com animaes fragmento personalizados. Carto vira animado entre as visualizaes de contedo, mostrando uma animao que simula um carto de capotar. Aqui est o que um flip card parece:
Carto de animao flip

Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o carto exemplo Flip. Veja os seguintes arquivos para a execuo de cdigo:
src / CardFlipActivity.java animador / card_flip_right_in.xml animador / card_flip_right_out.xml animador / card_flip_left_in.xml animador / card_flip_left_out.xml layout / fragment_card_back.xml layout / fragment_card_front.xml

Crie os Animadores
Criar as animaes para o carto vira. Voc vai precisar de dois animadores para quando a frente dos anima carto para fora e para a esquerda e em e da esquerda. Voc tambm vai precisar de dois animadores para quando a parte de trs dos anima carto no e para o direito e para fora e para a direita. card_flip_left_in.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Antes de girar, imediatamente definir o alpha a 0.

Rodar.

A meio da rotao (ver startOffset), defina o alpha 1.

card_flip_left_out.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Rodar.

A meio da rotao (ver startOffset), defina o alpha a 0.

card_flip_right_in.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Antes de girar, imediatamente definir o alpha a 0.

Rodar.

A meio da rotao (ver startOffset), defina o alpha 1.

card_flip_right_out.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Rodar.

A meio da rotao (ver startOffset), defina o alpha a 0.

Criar as vistas
Cada lado do "carto" um layout separado que pode conter qualquer contedo que voc deseja, como duas telas de texto, duas imagens, ou qualquer combinao de pontos de vista entre a virar. Voc vai usar os dois layouts nos fragmentos que voc vai mais tarde animar. Os seguintes esquemas de criar um lado de uma placa que mostra o texto:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#a6c" android:padding="16dp" android:gravity="bottom"> <TextView android:id="@android:id/text1" style="?android:textAppearanceLarge" android:textStyle="bold" android:textColor="#fff" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/card_back_title" /> <TextView style="?android:textAppearanceSmall" android:textAllCaps="true" android:textColor="#80ffffff" android:textStyle="bold" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/card_back_description" /> </LinearLayout>

e do outro lado da placa, que apresenta uma ImageView :

<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image1" android:scaleType="centerCrop" android:contentDescription="@string/description_image_1" />

Crie o Fragmento
Criar classes de fragmentos para a frente e de trs do carto. Essas classes devolver os layouts que voc criou anteriormente na onCreateView () mtodo de cada fragmento. Voc pode, ento, criar instncias desse fragmento da atividade dos pais, onde voc quer mostrar o carto. O exemplo a seguir mostra as classes de fragmentos aninhados dentro da atividade de pai que usa-los:
pblico classe CardFlipActivity estende Actividade ... / ** * Um fragmento que representa a parte frontal do {

Um fragmento que representa a parte de trs do

Animar a Flip carto


Agora, voc vai precisar exibir os fragmentos dentro de uma atividade pai. Para fazer isso, primeiro crie o layout de sua atividade. O exemplo a seguir cria um FrameLayout que voc pode adicionar fragmentos em tempo de execuo:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" />

No cdigo de atividade, definir o ponto de vista do contedo a ser o layout que voc acabou de criar. tambm uma boa idia para mostrar um fragmento de padro quando a atividade criada, ento a atividade seguinte exemplo mostra como exibir a frente do carto por padro:
public class CardFlipActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity_card_flip); if (savedInstanceState == null) { getFragmentManager() .beginTransaction() .add(R.id.container, new CardFrontFragment()) .commit(); } } ... }

Agora que voc tem a frente da exibio do carto, voc pode mostrar a parte de trs do carto com a animao flip em um momento apropriado. Criar um mtodo para mostrar o outro lado da placa, que faz o seguinte:

Define as animaes personalizadas que voc criou anteriormente para as transies dos fragmentos. Substitui o fragmento exibido atualmente com um novo fragmento e anima o evento com as animaes personalizadas que voc criou. Adiciona o fragmento apresentado anteriormente para o fragmento de volta empilhar assim, quando o usurio pressiona a volta do boto, o carto vira para trs por cima.

privado vazio flipCard () { se ( mShowingBack ) { getFragmentManager (). popBackStack (); retorno ; } . / / Virar volta mShowingBack = verdadeiro ;

/ / Cria e cometem uma nova transao fragmento que adiciona o fragmento para a parte de trs do / / o carto, usa animaes personalizadas, e faz parte de trs da pilha. do gerente fragmento getFragmentManager () . beginTransaction () / / Substituir as animaes fragmento padro com recursos animador representando / / rotaes quando se muda para a parte de trs do carto, como bem como animador / / recursos representativos de rotaes quando lanando para trs para a frente (por exemplo, quando o / / o boto Voltar do sistema

Substitua os fragmentos atualmente na visualizao recipiente com um fragmento / / representando a prxima pgina (indicado pelo recm-incrementado CurrentPage / / varivel). . substituir ( R . id . recipiente , novo CardBackFragment ())

/ / Adicionar esta transao a pilha de volta, permitindo que os usurios pressionem Voltar / / para obter a parte da frente do carto. . addToBackStack ( nulo ) / / Confirmar a transao. . cometer (); }

Zoom Vista
ANTERIORPRXIMA

ESTA LIO ENSINA VOC A:


1. Criar as vistas 2. Configure a animao Zoom 3. Ampliar a Ver

EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip

Esta lio demonstra como fazer uma animao touch-to-zoom, que til para aplicaes tais como galerias de fotos para animar uma vista de uma miniatura para uma imagem no tamanho que preenche a tela. Aqui est o que a animao touch-to-zoom parece que expande uma miniatura da imagem para preencher a tela: Animao Zoom

Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o exemplo Zoom. Veja os seguintes arquivos para a execuo de cdigo:
src / TouchHighlightImageButton.java (uma classe auxiliar simples que mostra um toque de

destaque em azul quando a imagem pressionado)


src / ZoomActivity.java layout / activity_zoom.xml

Criar as vistas

Crie um arquivo de layout que contm a verso pequena e grande quantidade de contedo que voc deseja ampliar. O exemplo a seguir cria um ImageButton para miniatura da imagem clicvel e uma ImageView que exibe a viso ampliada da imagem:

Este ImageView inicialmente escondido ir realizar a verso expandida / zoom de as imagens acima. Sem transformaes aplicado, ele ocupa toda a tela. Para alcanar a animao "zoom", limites desta viso so animados a partir dos limites do boto miniatura acima, a sua ltima

Configure a animao Zoom


Depois de aplicar o seu layout, configurar os manipuladores de eventos que desencadeiam a animao zoom. O exemplo a seguir adiciona um View.OnClickListener ao ImageButton para executar a animao zoom quando o usurio clica no boto de imagem:
pblico classe ZoomActivity estende FragmentActivity / / Guarda uma referncia para a animao atual, / / para que ele possa ser cancelado a meio caminho. privado Animator mCurrentAnimator ; {

/ / O sistema de tempo de durao "short" de animao, em milissegundos. Esta / / durao ideal para animaes sutis ou animaes que ocorrem / / muito

Ligue cliques na miniatura

Recuperar e armazenar em cache default "curto" tempo de animao do sistema. mShortAnimationDuration = getResources (). getInteger ( android . R . inteiro . config_shortAnimTime ); } ... }

Ampliar a Ver
Agora voc vai precisar para animar do ponto de vista de tamanho normal para a viso ampliada, quando apropriado. Em geral, voc precisa para animar a partir dos limites da vista de tamanho normal para os limites da viso de maior porte. O mtodo a seguir mostra como implementar uma animao de zoom que amplia de uma miniatura da imagem para uma viso ampliada, fazendo as seguintes coisas: 1. Atribuir a imagem de alta resoluo para o "zoom-in" (alargada) escondido ImageView . O exemplo a seguir carrega um grande recurso de imagem no segmento de interface do usurio para a simplicidade. Voc vai querer fazer isso de carga em um segmento separado para evitar o bloqueio no segmento de interface do usurio e, em seguida, definir o bitmap no segmento. Idealmente, o bitmap no deve ser maior do que o tamanho do ecr. 2. Calcule os limites inicial e final para o ImageView . 3. Animar cada um dos quatro posicionamento e dimensionamento propriedades X , Y , ( scale_x e scale_y ) simultaneamente, a partir dos limites de partida para os limites finais. Estes quatro animaes so adicionados a uma AnimatorSet de modo que eles podem ser iniciados simultaneamente. 4. O zoom para fora, executando uma animao semelhante, mas em sentido inverso quando o usurio toca a tela quando a imagem ampliada dentro Voc pode fazer isso adicionando uma View.OnClickListenerao ImageView . Quando clicado, o ImageView minimiza volta para o tamanho da miniatura da imagem e define sua visibilidade para IDO para escond-lo.
privado vazio zoomImageFromThumb ( ltimo Ver ThumbView , / / Se h uma animao em andamento, cancel-lo / / imediatamente e prosseguir com esta. se ( mCurrentAnimator =! nulo ) { mCurrentAnimator . cancelar (); } / / Carregar de alta resoluo "zoom-in" int imageResId ) {

Calcule os limites inicial e final para o zoom-in imagem. / / Esta etapa envolve muita matemtica. Yay,

Os limites de incio so o retngulo visvel mundial da miniatura, / / e os limites finais so o retngulo visvel global do recipiente / / view. Alm disso, defina o ponto de vista recipiente do deslocamento como a origem para os / / limites, uma vez que a origem para a animao de posicionamento / / propriedades (X,

Ajustar os limites passam a ser a mesma proporo como as finais / / limites utilizando a tcnica de "centro de cultura". Isso evita indesejvel / / alongamento durante a animao. Tambm calcular a escala start / / fator (o fator de escala final sempre

Estender comear limites

Estender comear limites

Esconder a miniatura e mostrar o zoom-in vista Quando a animao. / / comea, ele vai posicionar o zoom-in vista no lugar do / / miniatura. ThumbView . setAlpha ( 0f ); expandedImageView . setVisibility ( Viso . VISVEL ) , / / Definir o ponto de piv para scale_x e transformaes scale_y / / para o canto superior esquerdo do zoom-in view (o default / / o centro da viso). expandedImageView . setPivotX ( 0f ); expandedImageView . setPivotY ( 0f ); / / Construir e executar a animao paralela dos quatro traduo e / / propriedades da escala (X, Y, scale_x e

Ao clicar no zoom-in imagem, deve o zoom para baixo / / para os limites originais e mostrar a miniatura em vez de / / o expandida

Animar os quatro posicionamento / propriedades de dimensionamento em paralelo, / / de volta ao seu original

Animando Alteraes de layout


ANTERIORPRXIMA

ESTA LIO ENSINA VOC A:


1. Criar o layout

2. Adicionar, atualizar ou remover itens do layout

EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip

A animao layout uma animao pr-carregado que o sistema executado a cada vez que fizer uma alterao na configurao do layout. Tudo o que voc precisa fazer definir um atributo no layout para dizer ao sistema Android para animar essas mudanas de layout e animaes do sistema-padro so realizadas por voc. Dica : Se voc deseja fornecer animaes de layout personalizado, crie um LayoutTransition objeto e fornec-lo para o layout com a setLayoutTransition () mtodo. Aqui est o que a animao layout padro parece quando adicionar itens a uma lista: Animao de layout

Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o exemplo Crossfade. Veja os seguintes arquivos para a execuo de cdigo: 1. src / LayoutChangesActivity.java 2. layout / activity_layout_changes.xml 3. Menu / activity_layout_changes.xml

Criar o layout
No arquivo XML de layout de sua atividade, defina o android: animateLayoutChanges atribuir a verdadepara o layout que voc deseja ativar animaes para. Por exemplo:
<LinearLayout android: id = "@ + id / recipiente" android: animateLayoutChanges = "true" ... />

Adicionar, atualizar ou remover itens do layout


Agora, tudo o que voc precisa fazer adicionar, remover ou atualizar itens no layout e os itens so animadas automaticamente:
private ViewGroup mContainerView; ... private void addItem() { View newView; ... mContainerView.addView(newView, 0); }

You might also like