Android Activity Ivan Nicoli
Activity Representa a tela de uma aplicação Classe filha da classe android.app.activity Deve ser declarada sempre no AndroidManifest.xml Obrigatória a implementação do método oncreate(bundle) e neste método é obrigatória a chamada do método setcontentview(view)
Navegação entre telas A navegação entre Activities (Telas) se dá por meio de um Intent. Existem dois métodos que permitem a chamada de novas Activities: startactivity(intent): Abre uma Activity de maneira independente. startactivityforresult(intent, codigo): Abre uma Activity aguardando um retorno
Exercício 1 Navegação (1/4) Crie um novo projeto no Eclipse, parâmetros: ProjectName: ExemplosActivity Target: Google Apis (Plataform 2.2) Package Name: br.edu.facear.exemplosactivity Activity: Desmarque a opção de criação.
Exercício 1 Navegação (2/4) Crie duas novas classes que herdam a classe Activity, com os nomes: Tela1Activity Tela2Activity Adicione a declaração de ambas no AndroidManifest.xml Adicione o category do tipo LAUNCHER no Intent da Activity Tela1Activity.
Exercício 1 Navegação (3/4) Na Activity Tela1Activity adicione a seguinte implementação do método oncreate(bundle): @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Button b = new Button(this); b.settext("clique aqui para ir a próxima tela"); b.setonclicklistener(this); setcontentview(b); } Faça com que a Activity implemente a Interface OnClickListener e adicione o seguinte método na mesma: public void onclick(view arg0) { Intent i = new Intent(this,Tela2Activity.class); startactivity(i); }
Exercício 1 Navegação (4/4) Na Activity Tela2Activity adicione a seguinte implementação do método oncreate(bundle): @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); TextView tv = new TextView(this); tv.settext("olá, Seja bem Vindo!"); setcontentview(tv); } Execute a aplicação.
Passagem de parâmetros entre Activities A passagem de parâmetros entre Activities é realizada por meio de um Objeto da classe android.os.bundle Este objeto se comporta de maneira semelhante a uma HashMap do Java por meio do padrão "chave x valor". Para adicionar os parâmetros, são utilizados os métodos putstring, putdouble, putint, putboolean, putchar, dentre outros...
Exercício 2 Parâmetros (1/2) Altere o método onclick da classe Tela1Activity adicionando as linhas de passagem de parâmetros: public void onclick(view arg0) { Intent i = new Intent(this, Tela2Activity.class); Bundle b = new Bundle(); b.putstring("nome", "Ivan"); i.putextras(b); } startactivity(i);
Exercício 2 Parâmetros (2/2) Altere o método oncreate(bundle) da classe Tela2Activity adicionando as linhas de obtenção de parâmetros: @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); TextView tv = new TextView(this); Intent i = getintent(); tv.settext("olá, seja bem vindo "+ i.getextras().getstring("nome")); } this.setcontentview(tv);
Passagem de Parâmetros 2 Para simplificar o código é possível chamar o método putextra(chave, tipo) diretamente do objeto que será passado para o método startactivity Da mesma maneira na Activity destino é possível chamar o Método getextras<tipo>(chave), para se obter o valor, exemplo: getintent().getstringextra("nome")
Exercício 3 Parâmetros 2 (1/2) Altere o método onclick da classe Tela1Activity para simplificar a passagem de parâmetros: public void onclick(view arg0) { Intent i = new Intent(this, Tela2Activity.class); i.putextra("nome", "Ivan"); } startactivity(i);
Exercício 3 Parâmetros 2 (2/2) Altere o método oncreate(bundle) da classe Tela2Activity para simplificar a obtenção de parâmetros: @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); TextView tv = new TextView(this); tv.settext("olá, seja bem vindo "+ getintent().getstringextra("nome")); } this.setcontentview(tv);
ListActivity exibição de uma lista de itens na tela Subclasse da classe Activity. Utilizada para simplificar a construção de telas com o objetivo de exibir uma lista de itens. Não é necessário chamar o método setcontentview, pois este já é chamado internamente. É necessário chamar o método setlistadapter(listadapter) Possui métodos que facilitam a captura de eventos bem como os elementos selecionados, é o caso do método onlistitemclick()
Exercício 4 - Criando uma lista de Nomes Crie uma nova classe chamada ListNomesActivity que herde a classe android.app.listactivity e adicione a seguinte implementação: @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); String[] nomes = new String[] {"Nome 1", "Nome 2", "Nome 3"}; ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, nomes); setlistadapter(arrayadapter); } @Override protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick(l, v, position, id); Toast.makeText(this, "Foi selecionado o item " + this.getlistadapter().getitem(position).tostring(), Toast.LENGTH_SHORT); }
Exercício 5 Menu de Activities Crie uma nova classe que herde a classe ListActivity, chamada ListMenuActivity. Simplifique a declaração de Activities no AndroidManifest.xml, deixando-as no seguinte padrão: <activity android:name=".tela1activity"></activity> Crie um menu para cada uma das Activities: ListNomesActivity, Tela1Activity, Tela2Activity. Crie um elemento Sair: Quando chamado, a implementação deste elemento deve ser simplesmente a invocação do método finish() da classe Activity
SimpleCursorAdapter Assim como o ArrayAdapter o SimpleCursorAdapter é outra implementação da classe ListAdapter Pode ser associada a uma ActivityList se passado como parâmetro para o método setlistadapter. Mapea colunas de Cursor com um determinado elemento de um layout XML. Um Cursor é semelhante a um ResultSet do JDBC. Utilizando-se da interface Cursor é possível percorrer registros, como, por exemplo, a lista de contatos do celular ou o retorno de um banco de dados.
Exercício 6 Acessando Contatos (1/2) Crie uma nova classe que herde a classe ListActivity, chamada ListaContatosActivity. Altere a classe MenuActivity para que seja possível abrir esta atividade. No arquivo AndroidManifest.xml, adicione a declaração: <uses-permission android:name="android.permission.read_contacts"/> Copie o arquivo res/layout/main.xml e cole renomeando para res/layout/contatos.xml. Adicione o atributo android:id="@+id/nome" na tag TextView do arquivo res/layout/contatos.xml e remova o atributo android:text="@string/hello"
Exercício 6 Acessando Contatos (2/2) Na classe ListaContatosActivity, adicione a seguinte implementação: ListAdapter adapter; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Uri uri = ContactsContract.Contacts.CONTENT_URI; Cursor c = getcontentresolver().query(uri, null, null, null, null); startmanagingcursor(c); String[] colunas = new String[] {ContactsContract.Contacts.DISPLAY_NAME}; int[] campos = new int[] {R.id.nome}; adapter = new SimpleCursorAdapter(this, R.layout.contatos, c, colunas, campos); setlistadapter(adapter); } @Override protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick(l, v, position, id); Cursor c = (Cursor) adapter.getitem(position); String nomecoluna = ContactsContract.Contacts.DISPLAY_NAME; String nome = c.getstring(c.getcolumnindexorthrow(nomecoluna)); Toast.makeText(this, "Contato Selecionado : " + nome, Toast.LENGTH_SHORT).show(); }
SimpleAdapter Exibição de valores fixos em uma lista SimpleAdapter é outra implementação de um ListAdapter. O SimpleAdapter recebe como parâmetro uma lista java.util.list. Cada item da lista deve ser entendido como uma linha da View. Cada linha da Lista fornecida ao SimpleAdapter deve possuir um HashMap cujas chaves devem estar mapeadas com os ids dos componentes da tela.
SimpleAdapter Exibição de valores fixos em uma lista Chave1 Valor1 Chave2 Valor2 Chave1 Valor3 Chave2 Valor4 Chave1 Valor5 Chave2 Valor6 Chave1 Nome1 Chave2 Nome2 XML Nome1, Nome2 java.util.hashmap java.util.list
Exercício 7 ListActivity com SimpleAdapter (1/2) Crie uma nova classe, chamada ListSimpleAdapterActivity que seja filha da classe ListActivity. Altere a classe MenuActivity para que seja possível abrir esta atividade. Adicione a nova atividade no arquivo AndroidManifest.xml
Exercício 7 ListActivity com SimpleAdapter (1/2) Na implementação da classe ListSimpleAdapterActiviy, adicione: @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); for (int i = 0; i < 10; i++) { HashMap<String, String> item = new HashMap<String, String>(); item.put("nome", "Nome " + i); item.put("fone", "Fone " + i); list.add(item); } String[] from = new String[] {"nome", "fone"}; int[] to = new int[] {android.r.id.text1, android.r.id.text2}; setlistadapter(new SimpleAdapter(this, list, android.r.layout.two_line_list_item, from, to)); } @Override protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick(l, v, position, id); Toast.makeText(this, "Você selecionou o elemento: " + this.getlistadapter().getitem(position).tostring(), Toast.LENGTH_SHORT).show(); }
Exercício 8 SimpleAdapter com XML customizado Crie uma classe chamada ListSimpleAdapter2Activity que seja filha da classe ListActivity Copie o arquivo res/layout/contatos.xml e cole renomeando para contatos_simple_adapter.xml Copie o TextView e cole duas vezes totalizando 3 componentes TextView. Adicione o atributo android:id="@+id/nome" no primeiro e android:id="@+id/fone" no último Remova o atributo android:id no TextView do meio e adicione o atributo android:text=" - " Altere o atributo android:orientation do LinearLayout para horizontal. Altere todas os atributos de TextView de android:layout_width="fill_parent" para android:layout_width="wrap_content" Implemente a classe ListSimpleAdapter2Activity de forma que funcione de forma semelhante a classe ListSimpleAdapterActivity
MapActivity Assim como a classe android.app.listactivity a classe com.google.android.maps.mapactivity também é filha da classe Activity. Ela foi criada com o intuito de simplificar a criação de uma aplicação que se integra com o Google Maps. A criação de uma Activity que acessa o Google Maps difere em dois pontos da criação de uma Activity Normal: É necessário criar uma classe filha da classe MapActivity ao invés da classe Activity O método setcontentview deve receber um MapView
Exercício 9 Mapa Facear (1/3) Para utilizar o MapView é necessário utilizar um código do GoogleMaps que é obtido pelo md5 do certificado da aplicação. Para fins de desenvolvimento o Eclipse gera um certificado digital automaticamente (Não é possível publicar um aplicativo com este certificado no GooglePlay), para visualizá-lo acesse o diretório presente em Windows>Preferences>Android>Build Abra um prompt de comando e digite o comando: keytool -list -alias androiddebugkey -keystore <path_to_debug_keystore>.keystore -storepass android -keypass android Acesse o endereço: http://code.google.com/android/maps-api-signup.html Adicione seu Certificate fingerprint (MD5) e clique em Generate API KEY
Exercício 9 Mapa Facear (2/3) Crie uma nova classe filha de MapActivity, adicione a seguinte implementação: @Override protected void oncreate(bundle icicle) { super.oncreate(icicle); MapView map = new MapView(this, "0wKikE_9QhXqX6w3nlDP71NU52m55LxDh50Bo4A"); MapController mc = map.getcontroller(); mc.setzoom(20); double latitude = -25.538814*1E6; double longitude = -49.362275*1E6; GeoPoint point = new GeoPoint((int)latitude, (int)longitude); mc.setcenter(point); map.setsatellite(true); map.setclickable(true); this.setcontentview(map); }
Exercício 9 Mapa Facear (3/3) No arquivo AndroidManifest.xml, adicione, dentro da tag <application> a entrada: <uses-library android:name="com.google.android.maps"/> No mesmo arquivo, dentro da tag <manifest>, adicione a entrada: <uses-permission android:name="android.permission.internet"/> Tome as demais medidas de forma que a Activity se torne funcional
Exercício 10 Torre Eiffel Crie um MapActivity, utilizando a sugestão do gerador de códigos do GoogleMaps: <com.google.android.maps.mapview android:layout_width="fill_parent" android:layout_height="fill_parent" android:apikey="0wkike_9qhxqx6w3nldp71nu52m55lxdh50bo4a" /> Que traga a imagem da Torre Eiffel.
Fim