Android Interfaces: widgets
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(). 2
Vida de uma Activity 3
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. 4
Tempo de visibilidade de uma Activity 5
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. 6
Resumindo... 7
Interfaces das Activities Definição por XML o Escolha normalmente usada pelos desenvolvedores Programação o Usada para criação dinâmica de telas 8
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. 9
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. 10
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 o Recomenda-se não alterar esta classe manualmente é utilizada para facilitar a obtenção dos componentes ou recursos apenas informando o seu nome. 11
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 o o drawable: deve conter todos os recursos de imagens (PNG e JPG) utilizados na aplicação. layout: contém as definições dos layouts utilizados na aplicação que nada mais são do que arquivos no formato XML. values: contém valores estáticos (strings, por exemplo) que podem ser carregados de um arquivo XML. 12
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... 13
Widgets O pacote android.widget reúne elementos gráficos para serem empregados para interação homemmá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. Aproveite e também altere o Text para Navegar. 14
Interface de Usuário Esta UI contém: - um container Name; - um container Address; - um container Parente; 15
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 padrão são feitas em arquivos.xml. 16
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. 17
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. 18
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). 19
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). Por padrão o comportamento é click-button. 20
Exemplo Neste novo projeto vamos exigir um texto e ao clicar no botão o texto será transformado em um texto todo maiúsculo. 21
Exercício 22
Exercício 23
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. 24
Solução 25
RadioButton e RadioGroup RadioButton : botão de dois estados: marcado ou desmarcado. o o Quando está desmarcado, o usuário pode pressionar e marcar. 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 o Quando o usuário marca um RadioButton, o RadioGroup automaticamente desmarca os demais. Utiliza-se o RadioGroup para gerenciar um conjunto de RadioButton no qual exigimos uma escolha do usuário dentre o grupo, ou seja, exigir uma escolha somente. 26
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 27
Lay-out do formulário 28
Código no oncreate // 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 this.rdggrupoop01.setchecked(true); 29
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(); 30
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. 31
Exemplo O usuário vai marcar CheckBox dizendo se tem gatos e cachorros 32
Código do oncreate 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); 33
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(); 34
Spinner Este componente possui um nome diferente em cada tecnologia: o o o JComboBox DropDownList 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. 35
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 spinner.setonitemselectedlistener(this); } 36
Código /** * 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"}; 37
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(); 38
DatePicker o o Data e Hora Componente destinado a edição de uma data contendo Ano, Mês e Dia. Possui botões grandes, visto que nesta plataforma não seu usa as famosas canetinhas e sim as pontas dos dedos. 39
TimePicker Data e Hora o Componente destinado a edição de Hora e Minuto. 40
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. 41
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); } }); } 42
Código /** * 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(); }}); } 43
CalendarView Widget desenvolvido para exibir e selecionar uma ou mais datas Este componente só pode ser utilizado a partir da versão 11 da API (Android 3.0). 44
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(). 45
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; 46
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
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 o o drawable-hdpi : imagens de alta densidade, drawable-mdpi : de média densidade e drawable-ldpi de baixa densidade. Então nossas três versões de logo ficarão em: o o o /res/drawable-ldpi/meulogo.png /res/drawable-mdpi/meulogo.png /res/drawable-hdpi/meulogo.png 48
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) 49
ImageView Altere a densidade do dispositivo: 50
ImageView Adicione um botão para trocar a imagem. 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); } 51
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); } } } 52
ImageButton ImageButton realmente é uma junção de botão e imagem, o terá bordas como um botão e uma imagem dentro, 53
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. 54
AutoComplete 55
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. 56
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. 57
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" /> 58
Código 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 = (MultiAutoCompleteTextView)this.findViewById(R.main.txtMulti); 59
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" }; 60
MultiAutoComplete 61
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); } 62
Espaço Tokenizer } // 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 + " "; } 63
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() txtmultiautocomplete.settokenizer(new EspacoTokenizer()); 64
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. 65
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, android.r.layout.simple_list_item_1, lista)); 66
Código Carregando com dados a serem obtidos: 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"); 67
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(); } }); } 68
Código dos eventos 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(); } }); 69
Exercício Crie uma activity para exibir uma ListView 70
ListView para seleção múltipla // 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(); } 71
ExpandableListView Listas com sublistas; Para usá-la precisamos criar um Adapter para fornecer os dados para a Lista o Lembram-se do ListView? // criando um adapter ArrayAdapter<String> array = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1); // usando o adaptador padrao lstv.setadapter(array); o Pois é, precisamos de um Adapter que forneça os elementos raízes e os filhos. 72
MyAdapter 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]; } 73
@Override public boolean hasstableids() { return true; } MyAdapter @Override // Todos podem ser selecionados public boolean ischildselectable(int groupposition, int childposition) { return true; } 74
MyAdapter // 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; } 75
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; } 76
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); return textview; } 77
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); return textview; } 78
Exercício Altere o Exercício de ListView para usar uma ExpandableListView 79
GridView Exibe Views na forma de grade Todas as colunas têm a mesma largura Faz scrolling do conteúdo Atributos 80
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 81
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); 82
Exercício - WebView Altere o AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest... > <application... > <activity... >... </activity> </application> <uses-permission android:name="android.permission.internet" /> </manifest> 83
Gallery e ImageSwitcher Gallery o Mostra lista de componentes com rolagem horizontal o Mantém o componente selecionado sempre no centro ImageSwitcher o Exibe imagens e cria efeitos ao alterná-las 84
ProgressBar Exibe um indicador de progresso de uma operação Estilos como percentual ou indeterminado Estilos (atributo style no XML):?android:progressBarStyle?android:progressBarStyleSmall?android:progressBarStyleLarge?android:progressBarStyleHorizontal (padrão) Indeterminado circular de tamanho médio Indeterminado circular de tamanho pequeno Indeterminado circular de tamanho grande Barra horizontal indeterminado ou com percentual 85
ProgressBar Métodos setprogress(int) Determina o nível de progresso para uma barra percentual setsecondaryprogress(int) boolean isindeterminate() Determina o nível secundário de progresso para uma barra percentual Retorna true se for indeterminado 86
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
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" android:progress="45" android:secondaryprogress="80" /> 88
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(); 89
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) void dismissdialog(int id) void removedialog(int id) Dialog oncreatedialog (id, Bundle) Tenta mostrar o Dialog para o id chamando oncreatedialog() se necessário, e em seguida onpreparedialog(). Retorna true em caso de sucesso. Fecha o Dialog criado por showdialog() com o id especificado. Se nenhum Dialog com o id tiver sido mostrado lança IllegalArgumentException. Remove qualquer referência para o Dialog especificado. Caso esteja sendo exibido, ele é fechado antes. Callback chamado quando um Dialog deve ser criado para o id especificado. Implementado pelo desenvolver. void onpreparedialog(id, Dialog, Bundle) Callback que permite que o Dialog seja preparado antes de ser apresentado. Por exemplo, configurar alguma varíavel. 90
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 91
AlertDialog Exibe um alerta ao usuário Conteúdo e botões de escolha personalizados Classe AlertDialog.Builder para construir alertas 92
AlertDialog seticon(int resid) settitle(string) setmessage(string) setpositivebutton(string, listener) setnegativebutton(string, listener) Determina o ícone a ser mostrado Determina o título do alerta Mensagem a ser mostrada no interior do alerta Texto do botão positivo (Sim, Yes, Ok, etc) Texto do botão negativo (Não, No, etc) setitems(string [], listener) setsinglechoiceitems(string [], int checkeditem, listener) setcancelable(boolean) show() cancel() Items a serem mostrados para usuário selecionar Determina lista de RadioButtons a serem mostrados ao usuário Alerta cancelável ou não. Cancelável significa que usuário não pode fechar com botão voltar. Exibe o alerta para o usuário Cancela o alerta Nota: listener é uma instância de DialogInterface.OnClickListener 93
AlertDialog - Exemplos 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(); CharSequence[] items = {"Red", "Green", "Blue"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.settitle("pick a color"); builder.setitems(items, new DialogInterface.OnClickListener() {... } ); builder.show(); 94