Baixe o app para aproveitar ainda mais
Prévia do material em texto
Conteúdos - Eventos em Android - Exemplos e exercícios Programação para Dispositivos Móveis Método onCreate • Quando criamos nossos layouts com XML, é necessário um código Java que esteja relacionado com os elementos da interface e que consiga acessar esses elementos. • A classe R.java faz a ponte nessa ligação do XML com o Java • Ao criar um novo projeto para Android, é criado automaticamente um arquivo de Layout (res -> layout -> nomedolayout.xml) e uma classe Java (java –> nome_do_pacote -> nome_da_classe.java • Observe que na classe Java de uma tela, existe um método OnCreate: Método onCreate • No método onCreate(Bundle) iniciamos nossa Activity e também é onde definimos o layout do aplicativo através do método setContentView. • Após carregar o layout, é possível acessar seus elementos utilizando o método findViewById(). Isso pode ser feito no método onCreate e em outros métodos e eventos. • Em uma Activity gerada pelo Android Studio, é possível observar que o código em onCreate já vem com um layout configurado: setContentView(R.layout.activity_main); • A classe R.java faz a ligação de todos os recursos da aplicação em atributos Java. • Os elementos do layout podem ser usados no nosso código Java. Cada elemento da View possui uma classe Java associada. Por exemplo, se no código XML tivermos um elemento EditText, para acessar esse componente no código Java, é preciso criar um objeto com a classe EditText. Acessando elementos do layout • Para acessar os elementos do layout, utilizaremos os atributos fornecidos pela classe R.java através do id, usando o método findViewById. Com a referência ao objeto, podemos executar os métodos da classe específica. Classe obj = (Classe)findViewById(R.id.nomeDoElemento); • Exemplos: EditText v1 = (EditText) findViewById(R.id.editv1); EditText v2 = (EditText) findViewById(R.id.editv2); TextView r = (TextView) findViewById(R.id.textresp); Button btnsomar = (Button) findViewById(R.id.button1); Button btnmult = (Button) findViewById(R.id.button2); Eventos • Todos os aplicativos precisam tratar eventos. Estes eventos são geralmente disparados pelo usuário quando interage com a UI, ou até mesmo através de algum sensor. • Os eventos são o mecanismo que podemos usar para coletar dados da interação do usuário com a UI. • Para trabalhar com eventos, é necessário configurar um listener (ouvinte). • Os listener são classes dedicadas a tratamento de eventos, como por exemplo, o clique em um botão que aciona o evento/método onClick(). • Podemos tratar os eventos de três formas: 1. Associando um método no layout XML. 2. Através de classes anônimas: programamos o evento diretamente no objeto. 3. Através de um método único para todos os elementos que receberão atenção a eventos, implementando um Listener. Eventos • Event Listener São interfaces que possuem métodos que são acionados pelo Android quando o usuário interage com a UI. Geralmente são registrados em algum componente do layout. • Event handlers Quando um evento registrado ocorre em um elemento, o event listener chama um método que irá fazer alguma ação, manipular/atender esse evento. Esse método é conhecido como event handler (manipulador de evento). Eventos frequentes • onClick() é acionado pelo OnClickListener() quando o usuário clica ou toca em algum elemento. • onLongClick() é acionado pelo OnLongClickListener() quando o usuário clica ou toca em algum elemento por mais de 1 segundo ("click longo"). • onFocusChange() é acionado pelo OnFocusChangeListener() quando um elemento ganha ou perde o foco. • onTouch() é acionado pelo OnTouchListener() quando o usuário toca em um componente. É semelhante ao onClick, porém com este evento podemos verificar ações diferenciadas para UP, DOWN e MOVE, por exemplo. • onMenuItemClick() é acionado pelo OnMenuItemClickListener() quando o usuário seleciona um item de menu. Outros eventos Como mencionado, existem outros tipos de eventos. Por exemplo, Android prevê atender o evento de click longo: onLongClick, bastante útil. Frequentes, também, são os eventos: onKey (usar setOnKeyListener) e onTouch (usar setOnTouchListener). public class Eventos extends Activity { public void onCreate(Bundle savedInstanceState) { ... final Button botao = (Button) findViewById(R.id.btnmult); botao.setOnLongClickListener (new View.OnLongClickListener() { public boolean onLongClick(View v) { Toast.makeText(Eventos.this, "\nMuito bem! Evento click longo \n", Toast.LENGTH_LONG).show(); return true; } }); } ... } Eventos em outros objetos O evento onClick não é exclusivo para botões. No exemplo mostrado a seguir atendemos este evento para trocar, na execução do programa, a figura mostrada no objeto ImageView foto1, que faz parte do visual de uma Activity. public class Sobre extends Activity { private boolean flag = false; public void onCreate(Bundle savedInstanceState) { ... final ImageView foto1 = (ImageView) findViewById(R.id.foto1); foto1.setImageResource(R.drawable.onp); foto1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (!flag) foto1.setImageResource(R.drawable.ong); else foto1.setImageResource(R.drawable.onp); flag = !flag; } }); ... } } <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#990000"> ... <ImageView android:id="@+id/foto1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="3px" /> ... </RelativeLayout> Event handler no XML • Para inserir o evento click no XML, utilize o atributo android:onClick="nomeDoMetodo" Na Activity que usa o layout, implemente o método abaixo seguindo exatamente a mesma assinatura, alterando somente o nome do método. public void nomeDoMetodo(View view) { // instruções } Event handler no XML ... <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="28dp" android:onClick="calcularSoma“ android:text="Soma" /> ... public void calcularSoma(View v){ float v1 = Float.parseFloat(((EditText)findViewById(R.id.editv1)) .getText().toString()); float v2 = Float.parseFloat(((EditText) findViewById(R.id.editv2)) .getText().toString()); TextView r = (TextView)findViewById(R.id.textresp); r.setText("A soma é: " + (v1+v2)); } Event listener com classe anônima • É possível implementar a atenção de eventos através de classes anônimas internas para cada elemento que queremos chamar o event handler. • Primeiro devemos 'setar' o listener no objeto, logo em seguida implementar o event handler com a chamada classe anônima. Em forma geral: objeto.set[event listener](new View.[event listener](){ @Override public [tipo][nome do event listener] (View v){ ... } }); Event listener com classe anônima ... <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="28dp" android:text="Soma" /> ... ... private Button btns; ... protected void onCreate(Bundle savedInstanceState) { ... btns = (Button)findViewById(R.id.button1); //... pegar as referências r, v1, v2 btns.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ r.setText(Float.parseFloat( v1.getText().toString())+ Float.parseFloat( v2.getText().toString())+""); } }); } private Button btns; no XML Event Listener com método único • Podemos também, implementar somente um método para um event listener e com isso atender esse evento para diversos objetos que estarão associados ao mesmo listener. • Para isso é necessário primeiro implementarna classe o respectivo listener. Utilize o implements e o nome da interface que necessita. • Em seguida set o event listener no objeto que deseja atender eventos. • Implemente o respectivo event handler. Em forma geral: public class NomeClass extends AppCompatActivity implements View.On[event listener] @Override public [tipo] on[event handler](View v) { ... } objeto.set[event listener](this); Event Listener com método único para vários objetos ... <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="28dp" android:text="Soma" /> ... public class Exe1 extends AppCompatActivity implements View.OnClickListener { private Button btns; protected void onCreate(Bundle savedInstanceState) { ... btns = (Button)findViewById(R.id.button1); btns.setOnClickListener(this); //... podemos atender o evento onClick para outros botões } @Override public void onClick(View v) { if (v.getId() == R.id.button1) { r.setText(Float.parseFloat(v1.getText().toString()) + Float.parseFloat(v2.getText().toString()) + ""); } } } Trabalhando com RadioButton <RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/estado_civil"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Solteirx" android:id="@+id/solteiro" android:checked="false" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Casadx" android:id="@+id/casado" android:checked="false" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Viúvx" android:id="@+id/viuvo" android:checked="false" /> </RadioGroup> Trabalhando com CheckBox <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Terror" android:id="@+id/terror" android:checked="false" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ação" android:id="@+id/acao" android:checked="false" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Comédia" android:id="@+id/comedia" android:checked="false" /> Trabalhando com RadioButton • Veja abaixo como acessar os elementos de tipo RadioButton, ou seja, como verificar qual é a opção selecionada pelo usuário. Observe que estado_civil é o id do grupo de radiobuttons e solteiro e casado são os id dos radiobuttons. int est_civil = ((RadioGroup)findViewById( R.id.estado_civil)).getCheckedRadioButtonId(); if (est_civil == R.id.solteiro) { Toast.makeText(this,"Opc Solteiro",Toast.LENGTH_LONG).show(); } else if (est_civil == R.id.casado){ ... } else { ... } Trabalhando com CheckBox boolean terror = ((CheckBox)findViewById(R.id.terror)).isChecked(); if (terror) { Toast.makeText(this,"\n Você selecionou a opção TERROR.\n", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this,"\n A opçao de TERROR não está selecionada.\n", Toast.LENGTH_LONG).show(); } String result = ""; result += "Terror check : "+ ((CheckBox)findViewById(R.id.terror)).isChecked(); ... Toast.makeText(this, result,Toast.LENGTH_LONG).show(); //ver próx. slide Veja abaixo como acessar os elementos de CheckBox: Atender evento click em um CheckBox ou RadioButton @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CheckBox chkbox = ( CheckBox ) findViewById( R.id.checkBox ); final TextView txt = ( TextView ) findViewById( R.id.textView); chkbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txt.setText("Boa esta promoção mesmo!"); } }); } Atender evento quando um CheckBox mudou de estado @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CheckBox chkbox = ( CheckBox ) findViewById( R.id.checkBox); final TextView txt2 = ( TextView ) findViewById( R.id.textView2); chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) txt2.setText("Mudou de opinião, que bom!"); else txt2.setText("Pense bem, não desista, esta promoção é boa!"); } }); } • Uma caixa de mensagem simples para dar avisos ao usuário. Janela Toast Toast toast = Toast.makeText(contexto, texto, duracao); toast.show(); Toast.makeText(contexto, texto, duracao).show(); ou Toast.makeText(this,"\n A opção de TERROR não está selecionada.\n",Toast.LENGTH_LONG).show(); Toast.makeText(view.getContext(),"\n A opção de TERROR não está selecionada.\n",Toast.LENGTH_LONG).show(); Exemplos Snackbar Uma caixa de mensagem simples para dar um retorno ao usuário. FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Opção futura enviar e-mail", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); “Snackbars provide lightweight feedback about an operation. They show a brief message at the bottom of the screen on mobile and lower left on larger devices. Snackbars appear above all other elements on screen and only one can be displayed at a time. They automatically disappear after a timeout or after user interaction elsewhere on the screen…” https://developer.android.com/reference/android/support/design/widge t/Snackbar.html “Floating action buttons are used for a special type of promoted action. They are distinguished by a circled icon floating above the UI…” https://developer.android.com/reference/android/support/design/widge t/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/Snackbar.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html Exercícios 1) Crie uma calculadora conforme o layoutabaixo. Crie o método OnClick para cada botão, utilizando o conceito de classe anônima (método 2. descrito neste material). obj.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ...... } }); Exercícios 2) Crie uma calculadora conforme o layout abaixo. Associe o método setOnClickListener(this) ao botão, em seguida crie o método onClick para avaliar qual opção dos radiobuttons foi selecionada e faça a respectiva operação (método 3. descrito neste material). . Exercícios 3) Uma seguradora quer disponibilizar para seus clientes um app Android com os formulários para solicitação de orçamento, crie uma Activity com seis (6) arquivos de layouts, conforme descrito abaixo: – Layout 1 (main): layout com seus dados NOME e RGM e uma imagem de um logotipo, insira 6 botões nesse layout (Principal, Auto, Portáteis, Empresarial, Residencial e Viagem), procure trabalhar os botões com imagem (atributo drawable) – Layout 2 (Formulário de Cotação – Auto) – Layout 3 (Formulário de Cotação - Equipamentos Portáteis) – Layout 4 (Formulário de Cotação - Seguro Empresarial) – Layout 5 (Formulário de Cotação - Seguro Residencial) – Layout 6 (Formulário de Cotação - Seguro Viagem) – Cada botão deverá chamar um método que mostrará o layout escolhido na tela, utilize nesses métodos o setContentView e o respectivo layout. – OBS: coloque os mesmos botões em todos os arquivos de layout. • ■ 100 Exercic103 RGM: 1111111 Fulano da Silva � ÜJ PRINCIPAL AUTO PORTÁTEIS A -ê 111 EMPRESARIAL RESIDENCIAL VIAGEM •■ 100 Exercic103 Auto ... ÜJ PRINCIPAL AUTO PORTÁTEIS A -ê 111 EMPRESARIAL RESIDENCIAL VIAGEM • ■ 100 Exercic103 RESIDENCIAL � ÜJ PRINCIPAL AUTO PORTÁTEIS A ê 111 EMPRESARIAL RESIDENCIAL VIAGEM •■ 100 Exerc1c103 PORTÁTEIS � [l:J PRINCIPAL AUTO PORl"ÁTeS A -ê 111 EMPRESARIAL RESIDENCIAL VIAGEM •■ 100 Exerc1cio3 VIAGEM � PRINCIPAL AUTO PORTÁTEIS A -ê • EMPRESARIAL RESIDENCIAL VIAGEM • ■ 100 Exercic103 EMPRESARIAL � C'o PRINCIPAL AUTO PORTÁTEIS & -ê 111 EMPAESAAIAL RESIDENCIAL VIAGEM public void openPortateis(View view) { //Evento click do button2. //Outra estratégia para resolver este exercício poderia ser selecionar //sempre o mesmo layout em activity_main.xml, alterar as cores de background //de dois botões, alterar os textos dos TextView internos e, opcionalmente, //alterar o título da Activity. Isto deverá ser feito em todos os botões, //mas evitaria ter que criar seis layouts diferentes. //Por exemplo, para o botão (button2) dos portáteis, colocaríamos esta lógica: setContentView(R.layout.activity_main); ((Button)findViewById(R.id.button0)).setBackgroundColor(Color.rgb(220,220,220)); ((Button)findViewById(R.id.button2)).setBackgroundColor(Color.rgb(51,181,229)); ((TextView)findViewById(R.id.textView1)).setText("Seguradora Lopes"); ((TextView)findViewById(R.id.textView2)).setText("PORTÁTEIS"); setTitle("Seguradora - PORTÁTEIS"); //para alterar o título da Activity } Outra estratégia para resolver este exercício Bibliografia sugerida sobre Android • ANDROID. Android Developers. Disponível em http://developer.android.com. • LECHETA, RICARDO R. Google Android, Aprenda a criar aplicações para dispositivos móveis com o Android SDK. São Paulo: Novatec, 2010. • MEDNIEKS, Z. et. al. Desenvolvimento de Aplicações Android. São Paulo: Novatec, 2009. • LEE, Wei-Meng. Introdução ao Desenvolvimento de Aplicativos para o Android. Rio de Janeiro: Editora Ciência Moderna, 2011
Compartilhar