• Nenhum resultado encontrado

Android. Interfaces: widgets

N/A
N/A
Protected

Academic year: 2021

Share "Android. Interfaces: widgets"

Copied!
94
0
0

Texto

(1)

Android

(2)

Vida de uma Activity

Acontece entre a primeira chamada para

onCreate até a chamada do finally() que

resulta no evento onDestroy().

Uma Activity irá fazer toda a configuração

do estado de suas propriedades no

OnCreate() e liberar todos os recursos

remanescentes em onDestroy().

(3)

Vida de uma Activity

(4)

Tempo de visibilidade de uma

Activity

Acontece entre uma chamada para onStart()

até uma chamada correspondente para

onStop().

Durante este período o usuário pode ver a

Activity na tela, embora não possa estar em

primeiro plano e interagir com o usuário.

Entre estes dois métodos que você pode

manter os recursos que são necessários para

mostrar a atividade para o usuário.

(5)

Tempo de visibilidade de uma

Activity

(6)

Activity no topo da pilha

Acontece entre uma chamada para

onResume() até uma chamada

correspondente para onPause().

Durante esse tempo, a Activity está na

frente de todas as outras atividades e pode

interagir com o usuário.

(7)

Resumindo...

(8)

Interfaces das Activities

Definição por XML

o

Escolha normalmente usada pelos

desenvolvedores

Programação

(9)

Interface Gráfica com

Usuário

Baseada em

View

e

ViewGroup

View:

base para subclasses denominadas

Widgets

que oferecem uma forma de implementar

os elementos gráficos de um interface

o

TextView, Button , TextEdit, RadioButton, Checkbox, etc

ViewGroup:

container de Views e ViewGroups.

o

base para componentes de

layouts

, como LinearLayout,

FrameLayout, AbsoluteLayout, RelativeLayout,

TableLayout, etc.

(10)

View

Estrutura de dados, cujas propriedades

armazenam dados do layout e determinada

área de interface.

Capaz de gerenciar suas propriedades

como proporção, posição, foco, aparência

(baseado no status), scrolling.

(11)

Relembrando...

Após a criação do projeto, será criada uma

estrutura de diretórios necessária para um

projeto Android.

A pasta src contém os fontes das classe que

representam as Activity, etc...

A pasta gen contém uma classe utilitária

“R.java”, gerada automaticamente

o

Recomenda-se não alterar esta classe

manualmente

o

é utilizada para facilitar a obtenção dos

componentes ou recursos apenas informando o

seu nome.

(12)

Relembrando...

A pasta res contém os recursos que serão

utilizados pela aplicação.

Estes recursos são organizados em pastas

de acordo com o seu propósito:

o

drawable

: deve conter todos os recursos de

imagens (PNG e JPG) utilizados na aplicação.

o

layout

: contém as definições dos layouts

utilizados na aplicação que nada mais são do

que arquivos no formato XML.

o

values

: contém valores estáticos (strings, por

exemplo) que podem ser carregados de um

arquivo XML.

(13)

android.widget

O pacote android.widget reúne elementos

gráficos para serem utilizados para

interação humano aplicação

o

TextView

o

EditText

o

Button

o

Outros...

(14)

Widgets

O pacote android.widget reúne elementos gráficos

para serem empregados para interação

homem-máquina da aplicação.

Arraste um Button da Palette para a tela.

Mantenha o Button selecionado e veja as

propriedades na aba Properties

Procure a propriedade Id e altere para:

@+main/btnNavegar .

(15)

Interface de Usuário

Esta UI contém:

- um container Name;

- um container Address;

- um container Parente;

15

(16)

Editor de Layout

Um ponto interessante na tecnologia

adotada pelo Android:

o

forma que é desenvolvida a interface

o

Em Java costumamos criar interfaces

pelo código

o

Nesta plataforma as interfaces por

(17)

Associando XML ao Código Fonte

Activity gerada no processo

de criação do projeto será a

principal

Arquivo .XML gerado será

carregado no onCreate() da

Activity acima.

(18)

TextView

utilizado para exibir um texto e permitir a

sua edição.

Por padrão sua configuração não permite a

edição, substitui o Label utilizado nas

outras tecnologias.

(19)

EditText

Herdeiro de TextView

sua configuração permite a edição de texto

por padrão,

o

similar ao TextBox (Framework .NET) ou

o

do JTextFied (Java).

(20)

Button

Controle utilizado para disponibilizar ações

ao usuário

Pode assumir o comportamento

o

clicável (click-button) ou

o

pressionado com estado (push-button).

(21)

Exemplo

Neste novo projeto vamos exigir um texto

e ao clicar no botão o texto será

transformado em um texto todo maiúsculo.

(22)
(23)

Exercício

(24)

ToggleButton

botão que exibe um estado "ON" ou "OFF"

no qual o usuário pode pressionar e alterar

o estado caso queira.

Exemplo:

o

Crie um projeto simples com um ToggleButton

na tela, e a medida que ele pressiona ou libera

vamos escrever no output a ação executada.

(25)

Solução

(26)

RadioButton e RadioGroup

RadioButton

: botão de dois estados: marcado ou

desmarcado.

o

Quando está desmarcado, o usuário pode pressionar e marcar.

o

Depois de marcado o RadioButton não pode ser desmarcado pelo

usuário pela interface (diretamente).

o

Não faz sentido usar um RadioButton isolado.

Utiliza-se grupos de RadioButtons associados em um

RadioGroup

,

o

Quando o usuário marca um RadioButton, o RadioGroup

automaticamente desmarca os demais.

o

Utiliza-se o RadioGroup para gerenciar um conjunto de

RadioButton no qual exigimos uma escolha do usuário dentre o

(27)

Exemplo

O usuário vai ter um RadioGroup na tela, e

a medida que ele marca as opções vamos

escrever na própria tela usando uma

janelinha Toast

(28)
(29)

Código no onCreate

29

// Como sempre, pegando os objetos da interface e

// armazenando em atributos da classe

this

.

rdgGrupoOp01

= (RadioButton)

this

.findViewById(R.main.

rdgGrupoOp01

);

this

.

rdgGrupoOp02

= (RadioButton)

this

.findViewById(R.main.

rdgGrupoOp02

);

this

.

rdgGrupoOp03

= (RadioButton)

this

.findViewById(R.main.

rdgGrupoOp03

);

// Criando os eventos, só que em vez de criar um evento

// para cada componente conforme os demais exemplos

// vou criar um único tratador de evento (ver o código a seguir)

this

.

rdgGrupoOp01

.setOnClickListener(

this

.

rdgGrupo_Click

);

this

.

rdgGrupoOp02

.setOnClickListener(

this

.

rdgGrupo_Click

);

this

.

rdgGrupoOp03

.setOnClickListener(

this

.

rdgGrupo_Click

);

// Marcar como a Opção 1 como padrão

(30)

Tratador de eventos

/**

* Tratador do evento Click para todos as opções Radio

*/

private

RadioButton.OnClickListener

rdgGrupo_Click

=

new

RadioButton.OnClickListener() {

public void

onClick(View v) {

String str =

"Opção 1 : "

+

rdgGrupoOp01

.isChecked() +

"\n"

;

str +=

"Opção 2 : "

+

rdgGrupoOp02

.isChecked() +

"\n"

;

str +=

"Opção 3 : "

+

rdgGrupoOp03

.isChecked();

// O Toast será estudado mais a frente, apenas use ele

// para exibir uma pequena janela com um texto

Toast.makeText(Main.

this

, str, Toast.

LENGTH_SHORT

).show();

(31)

CheckBox

Ao contrário do RadioButton o CheckBox

pode estar sozinho, ter mais de um

CheckBox marcado ao mesmo tempo, e

até não ter nenhum marcado.

Não requer controlador de grupo.

(32)

Exemplo

O usuário vai marcar CheckBox dizendo se

(33)

Código do onCreate

33

public void

onCreate(Bundle savedInstanceState) {

super

.onCreate(savedInstanceState);

setContentView(R.layout.

main

);

// Como sempre, pegando os objetos da interface e

// armazenando em atributos da classe

this

.

ckbCachorro

= (CheckBox)

this

.findViewById(R.main.

ckbCachorro

);

this

.

ckbGato

= (CheckBox)

this

.findViewById(R.main.

ckbGato

);

// Criando os eventos, só que em vez de criar um evento

// para cada componente conforme os demais exemplos

// vou criar um único tratador de evento (ver o código

// mais abaixo)

this

.

ckbCachorro

.setOnClickListener(

this

.

rdgGrupo_Click

);

this

.

ckbGato

.setOnClickListener(

this

.

rdgGrupo_Click

);

}

(34)

Tratador do evento Click

/**

* */

private

CheckBox.OnClickListener rdgGrupo_Click =

new

CheckBox.OnClickListener() {

public void

onClick(View v) {

String str =

"Possui cachorros : "

+ ckbCachorro.isChecked() +

"\n"

;

str +=

"Possui gatos : "

+ ckbGato.isChecked();

Toast.makeText(Main.

this

, str, Toast.LENGTH_SHORT).show();

}

(35)

Spinner

Este componente possui um nome diferente em

cada tecnologia:

o

JComboBox

o

DropDownList

o

ComboBox

É um controle que permite a seleção de itens de

uma lista, porem seu estado adormecido tem a

aparência de uma caixa (com a descrição

selecionada) associado a um botão, neste botão

uma imagem de um triangulo.

(36)

Exemplo

Neste projeto o usuário deverá escolher uma

palavra de uma lista de palavras.

// crie a activity implementando os eventos para tratar a escolha do spinner

public class Main extends Activity implements

AdapterView.OnItemSelectedListener{ ....

// Resgatando a referência do objeto

Spinner spinner = (Spinner) findViewById(R.id.spinner1); // Criando um Adapter com os itens do array

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

android.R.layout.simple_dropdown_item_1line, OPCOES); // Passando o Adapter com as opções para o Spinner

spinner.setAdapter(adapter); // Criando o evento Selected

(37)

Código

37 /**

* Evento que ocorre quando algum item é selecionado */

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { // Exibindo a seleção feita pelo usuário

Toast.makeText(parent.getContext(), "Você escolheu: " +

OPCOES[position], Toast.LENGTH_LONG).show(); }

/**

* Evento que ocorre quando a lista é aberta mais o usuário não seleciona nada */

public void onNothingSelected(AdapterView parent) { // Não faça nada

}

// Array montado só para ter as opções

private static final String[] OPCOES = new String[] { "Cadeira", "Braço", "Cor", "Encosto", "Mola", "Estofada", "Azul", "Vermelha" , "Rodinha"};

(38)

Atenção

O evento do Spinner só deve ser usado

quando a ação do usuário sobre ele influenciar

a tela ou os atributos da classe.

Se for uma escolha com posterior ação de

salvar (em um botão por exemplo) então

pegue o valor somente neste momento.

Use o método getSelectedItemPosition().

Spinner s = (Spinner)findViewById(R.id.spinner1);

int x = s.getSelectedItemPosition();

(39)

Data e Hora

DatePicker

o

Componente destinado a edição de uma data

contendo Ano, Mês e Dia.

o

Possui botões grandes, visto que nesta

plataforma não seu usa as famosas “canetinhas”

e sim as pontas dos dedos.

(40)

Data e Hora

TimePicker

o

Componente destinado a edição de Hora e

(41)

Exemplo

Este aplicativo que permite

que o usuário selecione uma

data e uma hora e clique

num botão “OK”.

Quando clicar, exibir uma

mensagem com os valores

selecionados no DatePicker

e TimePicker.

(42)

Código

// Recuperando objeto Data

DatePicker dtpData = (DatePicker)

this

.findViewById(R.main.dtpData);

// Alterando o objeto data

dtpData.updateDate(1972, 06, 12);

// Resgatando o controle Button e criando um evento par ele

Button btnVer = (Button)

this

.findViewById(R.main.btnVer);

btnVer.setOnClickListener (

new

OnClickListener() {

public void

onClick(View v) {

btnVer_Click(v);

}

(43)

Código

43 /**

* Evento que ocorre quando botão é pressionado */

public void btnVer_Click(View v) {

// Resgatando a referência

DatePicker dtpData = (DatePicker)this.findViewById(R.main.dtpData); TimePicker pthHora = (TimePicker)this.findViewById(R.main.pthHora); // Utilizando os métodos getMonth(), getDatyOfMonth(), getYear(),

getCurrentHour() e getCurrentMinute

// para pegar os valores dos controles alterados pelo usuário

Toast.makeText(this, "Data: " + dtpData.getDayOfMonth() + "/" + dtpData.getMonth() + "/" + dtpData.getYear() + "\nHora: " +

pthHora.getCurrentHour() + ":" + pthHora.getCurrentMinute(), 30).show(); }});

(44)

CalendarView

Widget desenvolvido para exibir e selecionar uma

ou mais datas

Este componente só pode ser utilizado a partir da

(45)

Chronometer

Implementa um temporizador simples.

Iniciamos a contagem a partir da chamada

do método start() e paralisamos a

contagem chamando o método stop().

(46)

Código

public void btnIniciarParar_Click(View v) {

// Os métodos Start() e Stop() alteram o status do Cronometro if(ligado)

this.chronometer.stop(); else

this.chronometer.start(); // Comutar o valor apenas

ligado = !ligado; }

public void btnZerar_Click(View v){

this.chronometer.stop();

// Zeramos o contador usando stBase()

this.chronometer.setBase(SystemClock.elapsedRealtime());

ligado = false; }

(47)

ImageView

Classe que reúne membros destinados a exibição

de imagem.

Uma imagem pode ser carregada dentro da

própria aplicação como uma Resource ou ser

carregado a partir de um caminho dentro do

Android

Você pode organizar os recursos (Resources) do

projeto Android baseado em vários critérios de

configurações, incluindo a língua, a região, as

características da tela, métodos de entrada, etc..

47

(48)

ImageView

A plataforma Android possui um mecanismo muito robusto para o

carregamento dos recursos apropriados em tempo de execução,

imagine que precisamos exibir um logo na tela inicial, podemos criar

três versões do logo com densidades diferentes, seriam adicionados

nas pastas:

o

drawable-hdpi : imagens de alta densidade,

o

drawable-mdpi : de média densidade e

o

drawable-ldpi de baixa densidade.

Então nossas três versões de logo ficarão em:

o

/res/drawable-ldpi/meuLogo.png

o

/res/drawable-mdpi/meuLogo.png

(49)

ImageView

Crie um projeto com 3 imagens diferentes,

com o mesmo nome e teste em

densidades diferentes (para poder ver que

ele busca as imagens em pastas

diferentes)

(50)

ImageView

(51)

ImageView

Adicione um botão para trocar a imagem.

51

Button btnCarregar = (Button)

this

.findViewById(R.main.btnCarregar);

btnCarregar.setOnClickListener(

new

OnClickListener(){

public void

onClick(View v)

{

btnCarregar_Click(v);

}

});

public void

btnCarregar_Click(View v)

{

ImageView img = (ImageView)

this

.findViewById(R.main.imgLogo);

// Usamos o método setImageResource() par alterar a imagem quando

// ela está anexada ao projeto

img.setImageResource(R.drawable.outraImagem);

(52)

ImageView

Para usar uma imagem do sdcard

public void btnCarregar_Click(View v) {

ImageView img = (ImageView) this.findViewById(R.main.imgLogo); // Caminho da imagem

String imgPath = "/sdcard/outraImagem.jpg"; // Cria um File para validar se existe arquivo

File imgFile = new File(imgPath); if (imgFile.exists() ){

// Criamos um Bitmap

Bitmap myBitmap = BitmapFactory.decodeFile(imgPath); // método setImageBitmap() altera a imagem anexada img.setImageBitmap(myBitmap);

} else {

// Imagem padrão, pois não existe a imagem que procuramos img.setImageResource(R.drawable.icon);

(53)

ImageButton

ImageButton realmente é uma junção de

botão e imagem,

o

terá bordas como um botão e uma imagem

dentro,

(54)

AutoCompleteTextView

AutoCompleteTextView

permite que o

usuário digite uma determinada informação,

exibindo opções de palavras;

Ou seja, a medida que o usuário digita a

palavra desejada a aplicação sugere opções.

Para caixa de texto com palavras simples o

AutoCompleteTextView é o componente

indicado.

(55)

AutoComplete

(56)

MultiAutoCompleteTextView

Estende de AutoCompleteTextView,

disponibiliza ao usuário uma série de opções,

incluindo a opção de utilizar um

MultiAutoCompleteTextView.Tokenizer para

selecionar as opções sugeridas.

(57)

Exercícios

Crie um projeto no qual o usuário deverá

digitar algumas palavras e o sistema deverá

ajudar exibindo uma lista de possíveis

palavras.

Comece montando um atributo na classe

Main.java do tipo array de String (linha 30),

neste array vamos adicionar as possíveis

opções que eu acredito que o usuário

encontre quando estiver em campo.

(58)

Exercício: Lay-out

<

AutoCompleteTextView

android:id=

"@+main/txtAuto"

android:layout_width=

"match_parent"

android:layout_height=

"wrap_content"

/>

<

MultiAutoCompleteTextView

android:id=

"@+main/txtMulti"

android:layout_width=

"match_parent"

android:layout_height=

"wrap_content"

android:completionThreshold=

"1"

/>

(59)

Código

59

public class Main extends Activity {

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// Criando um Adapter para associar a um array de opções mais prováveis

ArrayAdapter<String> adapter = new

ArrayAdapter<String>(this,

android.R.layout.simple_dropdown_item_1line, OPCOES);

// Resgatando o objeto (definido no XML)

AutoCompleteTextView txtAutoComplete =

(AutoCompleteTextView)this.findViewById(R.main.txtAuto); MultiAutoCompleteTextView txtMultiAutoComplete =

(60)

Código

// Passando o Adapter para os dois objetos

txtAutoComplete.setAdapter(adapter);

txtMultiAutoComplete.setAdapter(adapter);

// Passando um Tokenizer para o Multi

txtMultiAutoComplete.setTokenizer(

new

MultiAutoCompleteTextView.CommaTokenizer());

}

private static final

String[]

OPCOES

=

new

String[] {

"Cadeira"

,

"Braço"

,

"Cor"

,

"Encosto"

,

"Mola"

,

"Estofada"

,

"Azul"

,

"Vermelha"

,

"Rodinha"

(61)

MultiAutoComplete

(62)

Crie EspaçoTokenizer

public class EspacoTokenizer implements Tokenizer {

// Precisamos sobrescrever 3 métodos, o primeiro está relacionado // com a localicação do final do Token

@Override

public int findTokenEnd(CharSequence text, int cursor) {

int pos = text.toString().indexOf(' ', cursor);

return (pos < 0) ? (text.length() - 1) : (pos - 1); }

// O segundo está relacionado com o início da sequência

@Override

public int findTokenStart(CharSequence text, int cursor) {

int pos = text.toString().lastIndexOf(' ', cursor);

return (pos < 0) ? 0 : (pos + 1); }

(63)

Espaço Tokenizer

63

// O terceiro deve avaliar a palavra escolhida e escolher

// o Token que será usado após

@Override

public

CharSequence terminateToken(CharSequence text) {

String textStr = text.toString();

// Se o texto excolhido finaliza com espaço então não vamos fazer nada

// caso contrário vamos adicionar um espaço no final

if

(textStr.endsWith(

" "

))

return

textStr;

else

return

textStr +

" "

;

}

}

(64)

Código da Activity

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

android.R.layout.simple_dropdown_item_1line, OPCOES);

// Resgatando o objeto (definido no XML)

AutoCompleteTextView txtAutoComplete =

(AutoCompleteTextView)this.findViewById(R.main.txtAuto); MultiAutoCompleteTextView txtMultiAutoComplete =

(MultiAutoCompleteTextView)this.findViewById(R.main.txtMulti);

// Passando o Adapter para os dois objetos

txtAutoComplete.setAdapter(adapter); txtMultiAutoComplete.setAdapter(adapter);

// LINHA ALTERADA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Repare que estou fazendo uma instancia de EspacoTokenizer()

(65)

ListView

Componente simples e de fácil

manipulação exibe uma coluna única,

geralmente 6 itens por tela

Para usar, basta colar um componente na

tela e programar os eventos e a carga de

seus dados.

(66)

Código

Carregando com dados já conhecidos:

private

String[]

lista

= { "primeiro", "segundo", "terceiro",

"quarto","quinto", "sexto" };

lstV

= (ListView)

this

.findViewById(R.id.

listView1

);

// usando o adaptador padrao

lstV

.setAdapter(

new

ArrayAdapter<String>(

this

,

(67)

Código

Carregando com dados a serem obtidos:

67

lstV = (ListView) this.findViewById(R.id.listView1);

// criando um adapter

ArrayAdapter<String> array = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);

// usando o adaptador padrao

lstV.setAdapter(array);

// carregando com os dados

array.add("Opcao 1"); array.add("Opcao 2"); array.add("Opcao 3"); array.add("Opcao 4");

(68)

Código dos eventos

lstV.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> arg0, View arg1,

int arg2, long arg3) {

if (lstV.getSelectedItem() != null) {

AlertDialog.Builder dialogo =

new AlertDialog.Builder(ListActivity.this);

dialogo.setTitle("Contato selecionado");

dialogo.setMessage(lstV.getSelectedItem().toString()); dialogo.setNeutralButton("OK", null);

dialogo.show(); }

} });

(69)

Código dos eventos

69

lstV.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView<?> arg0, View arg1,

int arg2, long arg3) {

// TODO Auto-generated method stub

Toast.makeText(ListActivity.this, lstV.getSelectedItem().toString(), Toast.LENGTH_SHORT) $ .show(); } @Override

public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub

Toast.makeText(ListActivity.this,

"Selecione uma opção!",

Toast.LENGTH_SHORT).show();

} });

(70)

Exercício

(71)

ListView para seleção

múltipla

71

// usando multipla escolha

ArrayAdapter<String> array = new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_multiple_choice);

// precisa informar que a escolha é múltipla

lstV.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

if (lstV.getChoiceMode()==ListView.CHOICE_MODE_MULTIPLE) {

lista_ItemClick(v, pos); }

private void lista_ItemClick(View v, int pos) {

String word = ( (lstV.isItemChecked (pos)) ? "selecionada" : "desselecionada");

Toast.makeText(ListActivity.this, "Opção "+word+": " + lstV.getItemAtPosition(pos), 300).show(); }

(72)

ExpandableListView

Listas com sublistas;

Para usá-la precisamos criar um Adapter para fornecer

os dados para a Lista

o

Lembram-se do ListView?

o

Pois é, precisamos de um Adapter que forneça os elementos

raízes e os filhos.

// criando um adapter

ArrayAdapter<String> array =

new

ArrayAdapter<String>(

this

,

android.R.layout.

simple_list_item_1

);

// usando o adaptador padrao

lstV

.setAdapter(

array

);

(73)

MyAdapter

73

public class MyAdapter extends BaseExpandableListAdapter {

private String[] groups = { "Cara Feias", "Caras Pintadas" };

private String[][] caras = { { "Ze", "Juca", "Cido", "Joca" }, { "Leo", "Fefa", "Cuca" } };

public ExpandListActivity main; // construtor

public MyAdapter(ExpandListActivity main) {

this.main = main;

}

// Retorna um elemento da matriz dado o grupo e a posição do filho

@Override

public Object getChild(int groupPosition, int childPosition) {

return caras[groupPosition][childPosition];

(74)

MyAdapter

@Override

public

boolean

hasStableIds() {

return

true

;

}

@Override

// Todos podem ser selecionados

public

boolean

isChildSelectable(

int

groupPosition,

int

childPosition) {

return

true

;

(75)

MyAdapter

75

// Retorna uma TextView para montagem da lista

private TextView getGenericView() {

// LayoutParams é um objeto utilizado para passar parâmetros para o layout // MATCH_PARENT é o tamanho do elemento, utilizado a partir da API

// vamos usar tamanho 25, mais lembre-se que quanto maior, lista menos // elementos quanto menor, fica mais difícil selecionar

AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 25);

// Cria a TextView para a Activity e passa os parametros

TextView textView = new TextView(main); textView.setLayoutParams(lp);

// Vamos centralizar o texto

textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);

// dar 5 pixels para a esquerda para não colar na tela

textView.setPadding(5, 0, 0, 0); return textView;

(76)

MyAdapter

@Override

// retorna o nro de filho no grupo

public int getChildrenCount(int groupPosition) { return caras[groupPosition].length; }

@Override

// Retorna um grupo dado sua posição no array

public Object getGroup(int groupPosition) { return groups[groupPosition]; }

@Override

// Retorna o numero de grupos existentes no array de grupos

public int getGroupCount() { return groups.length; }

@Override

// Retorna o numero da posição do grupo

public long getGroupId(int groupPosition) { return groupPosition;

(77)

MyAdapter

77

// Retorna uma View para o grupo, vimos que existe o getChildView // esse método faz a mesma coisa porem par grupos, você pode // querer ter um layout diferente para grupo

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getGenericView();

// Para manter o layout diferente vou exibir o número de filhos

textView.setText( getGroup(groupPosition).toString() + " (" + getChildrenCount(groupPosition) + ")"); // Será vermelho textView.setTextColor(Color.RED); textView.setTextSize(14);

// Terá a fonte em negrito

textView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);

return textView; }

(78)

MyAdapter

// Retorna uma View para o grupo, vimos que existe o getChildView // esse método faz a mesma coisa porem par grupos, você pode // querer ter um layout diferente para grupo

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getGenericView();

// Para manter o layout diferente vou exibir o número de filhos

textView.setText( getGroup(groupPosition).toString() + " (" + getChildrenCount(groupPosition) + ")"); // Será vermelho textView.setTextColor(Color.RED); textView.setTextSize(14);

// Terá a fonte em negrito

textView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);

(79)

Exercício

Altere o Exercício de ListView para usar

uma ExpandableListView

(80)

GridView

Exibe Views na forma de grade

Todas as colunas têm a mesma

largura

Faz scrolling do conteúdo

Atributos

(81)

WebView e WebSettings

WebView

o

Apresenta uma página de web

o

Usa o mesmo componente que o navegador do celular

o

Necessário permissão android.permission.INTERNET

WebSettings

o

Permite configurar o WebView

Permite JavaScript, Salvar senhas, etc.

Métodos principais

(82)

Exercício - WebView

Criar um projeto que abra uma página da web

o

Dentro do método onCreate() da Activity

WebView web = new WebView(this);

WebSettings webSettings = web.getSettings();

webSettings.setSavePassword(false);

webSettings.setSaveFormData(false);

webSettings.setJavaScriptEnabled(true);

webSettings.setSupportZoom(false);

web.loadUrl("http://www.google.com.br");

setContentView(web);

(83)

Exercício - WebView

Altere o AndroidManifest.xml

83

<?xml version="1.0" encoding="utf-8"?>

<manifest ... >

<application ... >

<activity ... >

...

</activity>

</application>

<uses-permission

android:name="android.permission.INTERNET" />

</manifest>

(84)

Gallery e ImageSwitcher

Gallery

o

Mostra lista de componentes com rolagem horizontal

o

Mantém o componente selecionado sempre no centro

ImageSwitcher

(85)

ProgressBar

Exibe um indicador de progresso de uma operação

Estilos como percentual ou indeterminado

Estilos (atributo style no XML):

85

?android:progressBarStyle (padrão) Indeterminado circular de tamanho médio ?android:progressBarStyleSmall Indeterminado circular de tamanho pequeno

?android:progressBarStyleLarge Indeterminado circular de tamanho grande

(86)

ProgressBar

Métodos

setProgress(int) Determina o nível de progresso para uma barra percentual

setSecondaryProgress(int) Determina o nível secundário de progresso para uma barra percentual

(87)

ProgressBar - Exemplo

<ProgressBar style="?android:progressBarStyleSmall"

android:layout_width="wrap_content“ android:layout_height="wrap_content" />

<ProgressBar style="?android:progressBarStyle"

android:layout_width="wrap_content“ android:layout_height="wrap_content" />

<ProgressBar style="?android:progressBarStyleLarge"

android:layout_width="wrap_content“ android:layout_height="wrap_content" />

87

(88)

ProgressBar - Exemplo

<ProgressBar style="?android:progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:indeterminate="true" />

<ProgressBar style="?android:progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:indeterminate="false"

android:progress="45" />

<ProgressBar style="?android:progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:indeterminate="false"

(89)

Toast

Exibição de alertas por tempo determinado

Sem interação com usuário

View personalizada

Toast toast = new Toast(this);

toast.setDuration(Toast.LENGTH_LONG);

toast.setView(view);

toast.show();

Apenas mensagem de texto

Toast.makeText(this, “Mensagem”, Toast.LENGTH_SHORT).show();

(90)

Dialogs

Usado para abrir janelas na tela

Recomendado usar os métodos a seguir para que a Activity

gerencie o ciclo de vida do Dialog.

boolean showDialog(int id, Bundle) Tenta mostrar o Dialog para o id chamando onCreateDialog() se necessário, e em seguida onPrepareDialog(). Retorna true em caso de sucesso.

void dismissDialog(int id) Fecha o Dialog criado por showDialog() com o id especificado. Se nenhum Dialog com o id tiver sido mostrado lança

IllegalArgumentException.

void removeDialog(int id) Remove qualquer referência para o Dialog especificado. Caso esteja sendo exibido, ele é fechado antes.

Dialog onCreateDialog (id, Bundle) Callback chamado quando um Dialog deve ser criado para o id especificado. Implementado pelo desenvolver.

(91)

ProgressDialog

Janela para mostrar o progresso de uma operação

Como usar sem os métodos anteriores

o

Mostrar o Dialog

dialog = ProgressDialog.show(contexto, titulo, msg, bool indet);

indet = se é indeterminado ou não (percentual)

o

Feche o Dialog, quando concluir

dialog.dismiss();

o

Alterar o progresso (se indet = true)

dialog.setProgress(int v)

v entre 0 e 10000

(92)

AlertDialog

Exibe um alerta ao usuário

Conteúdo e botões de escolha personalizados

Classe AlertDialog.Builder para construir alertas

(93)

AlertDialog

93

setIcon(int resId) Determina o ícone a ser mostrado setTitle(String) Determina o título do alerta

setMessage(String) Mensagem a ser mostrada no interior do alerta setPositiveButton(String, listener) Texto do botão positivo (Sim, Yes, Ok, etc) setNegativeButton(String, listener) Texto do botão negativo (Não, No, etc)

setItems(String [], listener) Items a serem mostrados para usuário selecionar setSingleChoiceItems(String [],

int checkedItem, listener)

Determina lista de RadioButtons a serem mostrados ao usuário

setCancelable(boolean) Alerta cancelável ou não. Cancelável significa que usuário não pode fechar com botão voltar.

show() Exibe o alerta para o usuário cancel() Cancela o alerta

(94)

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setMessage("Are you sure you want to exit?");

builder.setCancelable(false);

builder.setPositiveButton("Yes", ...);

builder.setNegativeButton("No“, ...);

AlertDialog alert = builder.create();

AlertDialog - Exemplos

CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Pick a color");

builder.setItems(items,

Referências

Documentos relacionados

Porque a segunda marca é uma evidente imitação da primeira, deve ser decretada a anulação do seu registo, por violação do disposto nos artigos 93.°, n.° 12.°, 94.° e 172.°

Indicador [PROGRAM AUTO] 44 PP 0.0 0.0 AUTO WB AUTO WB AUTO ISO AUTO ISO 14M Número de imagens armazenáveis (p. 49) Ecrã (ecrã de modo standby) Se o indicador [PROGRAM AUTO] não

Resumo - Teoriza-se sobre a importância da restauração como uma ferramenta para a conservação ambiental através do uso de técnicas nucleadoras capazes de facilitar o

Nos tempos atuais, ao nos referirmos à profissão docente, ao ser professor, o que pensamos Uma profissão indesejada por muitos, social e economicamente desvalorizada Podemos dizer que

O objetivo da Medicina Tradicional Chinesa é encontrar a harmonia do individuo, não isolando apenas um agente da doença, mas sim procurar um padrão de desarmonia e o

RESUMO - O trabalho objetivou avaliar a qualidade das sementes de arroz utilizadas pelos agricultores em cinco municípios (Matupá, Novo Mundo, Nova Guarita, Alta Floresta e Terra

Os valores de cotas obtidos pelos três receptores foram comparados com os valores de cotas calculadas com base nos dados provenientes dos levantamentos com a

A partir da análise das filmagens das aulas dos professores participantes da pesquisa e das discussões realizadas nos encontros formativos, tem sido possível