PDM Eventos nos views
Revisión del 18:50 15 nov 2020 de Angelfg (discusión | contribuciones) (→Evento Interface OnCheckedChangeListener no RadioGroup)
Sumario
Introducción
- Neste punto imos ver como xestionar os principais eventos que se poidan producir nos Views que vimos na Unidade 2.
- Lembrar que xa está posta nun punto anterior a explicación de como funcionan as interfaces e como asocialas aos Views empregando o método setOnZZZZZZZ correspondente.
- Nota: En moitos controis, o evento principal que ides querer controlar, será o 'Click' sobre o mesmo. Lembrar que xa vimos no punto anterior que o método que rexistra dito evento está definido na clase View e polo tanto ides poder xestionar da mesma forma o evento Click en calquera View que teñades.
Preparando a Activity
- Imos crear unha única Activity onde estarán todos os Views que imos analizar (o ListView/Spinner/RecyclerView serán analizados na Unidade 4.
- Crea un paquete Eventos e dentro del imos crear unha nova 'Empty Activity' de nome: UD03_01_xesteventos_base de tipo Launcher.
- Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.
Código do Layout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cifprodolfoucha.aprendiendo.Eventos.UD03_01_xesteventos_base">
<TextView
android:id="@+id/txvTextoTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Texto Text View"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/etvTextoEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:hint="Texto Edit Text"
android:inputType="textPersonName"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txvTextoTextView" />
<Button
android:id="@+id/btnBoton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:text="BOTÓN"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageButton
android:id="@+id/imgbtnImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/btnBoton"
app:srcCompat="@android:drawable/star_on" />
<CheckBox
android:id="@+id/chk_Uno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Check Uno"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etvTextoEditText" />
<CheckBox
android:id="@+id/chk_Dos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Check Dos"
app:layout_constraintStart_toEndOf="@+id/chk_Uno"
app:layout_constraintTop_toBottomOf="@+id/etvTextoEditText" />
<CheckBox
android:id="@+id/chk_Tres"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Check Tres"
app:layout_constraintStart_toEndOf="@+id/chk_Dos"
app:layout_constraintTop_toBottomOf="@+id/etvTextoEditText" />
<RadioGroup
android:id="@+id/rgrpGrupoBotons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:checkedButton="@id/rbtnOpcionA"
android:orientation="horizontal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/chk_Uno">
<RadioButton
android:id="@+id/rbtnOpcionA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Opción A)" />
<RadioButton
android:id="@+id/rbtnOpcionB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Opción B)" />
</RadioGroup>
<ToggleButton
android:id="@+id/tbtnToogleBoton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="ToggleButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rgrpGrupoBotons" />
<Switch
android:id="@+id/swbSwitchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tbtnToogleBoton" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabFloatActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@android:drawable/ic_input_add" />
<ImageView
android:id="@+id/imageView"
android:layout_width="114dp"
android:layout_height="97dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:background="#AC2727"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swbSwitchButton"
app:srcCompat="@android:drawable/btn_star_big_on" />
</androidx.constraintlayout.widget.ConstraintLayout>
TextView
- Neste control poderíamos querer facer algo cando clickeamos sobre o texto.
Evento Interface OnClickListener
- Como expliquei anteriormente o evento Click xestionase dende a Interface OnClickListener mediante o método setOnClickListener que se atopa definido na clase View e polo tanto a forma de xestionalo sempre é a mesma.
- Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosTextView(){
TextView textView = findViewById(R.id.txvTextoTextView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TextView tv = (TextView) view;
Toast.makeText(getApplicationContext(),"Premiches no texto:" + tv.getText().toString(),Toast.LENGTH_SHORT).show();
tv.setText("Premiches no TextView");
tv.setTextColor(Color.BLUE);
tv.setTextSize(14);
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosTextView();
}
}
- Liña 5: Chamamos ao método setOnClickListener para 'asociar' o evento Click ao textview. Enviamos un obxecto que implementa a interface OnClickListener de forma anónima (poderíamos facelo a nivel de Activity como xa vimos no punto anterior desta Wiki].
- Liña 8: O view sabemos que é o TextView sobre o que premimos.
- Liña 21: Para que quede con un pouco de orde imos crear un método para xestionar cada un dos views (nunha aplicación non faría falla).
EditText
Evento Interface ClickListener
- Neste view normalmente non queremos xestionar un evento de Click sobre el (se pode facer igual que no caso anterior).
findViewById(R.id.etvTextoEditText).setOnClickListener(new View.OnClickListener() { // Xestionamos o evento de Click cunha interface anónima
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"EditText Pulsado",Toast.LENGTH_LONG).show();
}
});
Evento Interface OnEditorActionListener
- Un evento que se podería querer controlar é a tecla do teclado virtual que indica unha acción.
- Isto se consegue chamando ao método setOnEditorActionListener e pasando como parámetro un obxecto dunha clase que implemente a interface OnEditorActionListener.
- Ao implementar a interface teremos acceso ao método onEditorAction.
- Imos cambiar no deseñador a acción que vai ter no teclado virtual o EditText. Marcaremos a acción 'send':
- Codificación en Java que captura a acción actionSend dun campo de texto (email) e o que fai e recoller o texto desa caixa de texto, o e-mail, e volver a imprimir unha mensaxe nesa mesma caixa de texto.
1 public class UD03_01_xesteventos_base extends AppCompatActivity {
2
3
4 private void xestionarEventosEditText(){
5 EditText editText = findViewById(R.id.etvTextoEditText); // Poñemos final para que poidamos acceder a este obxecto dende dentro do método onEditorAction
6 editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
7 @Override
8 public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
9 // O textView é o texto escrito no EditText. Podemos obter dito texto por calquera dos dous views. Lembrar que a clase EditText deriva de TextView
10 boolean handled = false;
11 if (i == EditorInfo.IME_ACTION_SEND) { // Na clase EditorInfo temos todas as constantes que se identifican con cada tipo de acción
12 String textoEscrito = textView.getText().toString();
13
14 Toast.makeText(getApplicationContext(),textoEscrito,Toast.LENGTH_SHORT).show();
15 handled = true;
16 }
17 return handled;
18 }
19 });
20
21 @Override
22 protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.activity_u_d03_01_xesteventos_base);
25
26 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
27 xestionarEventosEditText();
28 }
29 }
- Liña 4: creamos un obxecto (editText) que apunta ao EditText no que se introduce o dato. Fixarse que está declarado como final para poder acceder a el dentro da interface anónima (realmente, para obter o texto escrito non será necesario)
- Liña 6: chamamos a método Listener (escoitador) do obxecto editText: setOnEditorActionListener ()
- Ese método será chamado cando se realice unha acción nun EditText
- Lembrar que un EditText é unha subclase de TextView
- Por exemplo, cando se prema unha tecla ou cando haxa unha acción IME seleccionada polo usuario.
- Como parámetro váiselle pasar a creación dunha clase anónima que implementa unha interface (OnEditorActionListener) para a cal hai que sobreescribir o único método que ten a interface (onEditorAction()).
- Liñas 11-18: sobreescritura do método OnEditorAction() no que se reciben 3 parámetros:
- O TextView que xerou o evento (v). Neste caso o EditText
- O ID da acción enviada
- E se o evento foi xerado pola tecla Enter ou non (event).
- Comprobamos se o ID da acción é o SEND, nese caso amosamos o texto escrito.
- Este método devolve un boolean indicando se o evento de premer na tecla do teclado virtual debe ser propagado e que outros controis poidan capturar dito evento (isto se fai facendo un return false) ou se indicamos que dito evento xa foi xestionado e non debe propagarse máis (return true).
- Para que o IDE nos cre a clase anónima:
- Escribir a chamada ao método (ollo ; final incluído): editText.setOnEditorActionListener( );
- Escribir new entre os paréntesis: editText.setOnEditorActionListener(new );
- Premer CTRL+Barra espaciadora e xa o sistema completa todo o demais.
- Logo só queda poñer o noso código no método a sobreescribir.
- Lembrar premer SHIFT+CTRL+O para importar os paquetes correspondentes ou podemos facer que o faga automaticamente como xa vimos anteriormente nesta Wiki.
Eventos mínimos a coñecer no EditText
- Xestionar o evento de Click sobre calquera EditText e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity. Como dixen anteriormente no será habitual que o necesitemos.
Button - ImageButton
- O principal evento que queremos xestionar nun botón é o Click sobre o mesmo.
- Este tipo de evento se pode 'implementar' por código ou a través do deseñador.
- A través do deseñador é máis doado pero non se aconsella xa que estamos mesturando aspectos visuais con eventos que se producen no view.
Evento Interface OnClickListener polo deseñador
- Esta opción non está recomendada.
- É a forma máis sinxela de desencadear unha acción pero non é a mais aconsellable xa que estamos a mesturar o deseño coa programación de eventos.
- Imos facelo de dúas formas:
- Creando un método para cada Botón.
- Creando un único método para tódolos botóns. Hai que controlar que botón foi o que se premeu. A xestión dos Click´s a facemos como o indicamos anteriormente.
- O que temos que facer é a nivel gráfico, no deseñador, ir a propiedade onClick do botón e escribir o nome do método ao que queremos que chame cando se preme no botón.
- Agora a nivel de código temos que definir un método con ese nome o un parámetro de tipo View da forma:
public class UD03_01_xesteventos_base extends AppCompatActivity {
public void presBoton(View v){
Button boton = (Button)v;
Toast.makeText(getApplicationContext(),"Premiches o botón con texto " + boton.getText().toString(),Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
}
}
- O parámetro v é o view que provoca o evento click.
- A través del é como sabemos que botón é pulsado se temos varios botóns no deseñador có mesmo nome de método na propiedade onClick.
Nota: Lembrar eliminar a propiedade onClick do deseñador para continuar có manual.
Evento Interface OnClickListener por código
- Dito evento está asociado á interface OnClickListener da clase View.
- Ao implementala temos acceso ao método onClick sendo o parámetro View o view que provocou o evento Click.
- Xa vimos o seu funcionamento no punto anterior da Wiki.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosButton(){
findViewById(R.id.btnBoton).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
Button boton = (Button)view; // Sabemos que é un Button ao facelo mediante interface anónimas
EditText editText = findViewById(R.id.etvTextoEditText);
TextView textView = findViewById(R.id.txvTextoTextView);
Toast.makeText(getApplicationContext(),"Pulsaches o botón con texto " + boton.getText().toString(),Toast.LENGTH_SHORT).show();
textView.setText(editText.getText().toString()); // Pasamos o contido do EditText ao TextView
}
}
);
findViewById(R.id.imgbtnImageButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImageButton boton = (ImageButton) view; // Sabemos que é un ImageButton ao facelo mediante interface anónima
EditText editText = findViewById(R.id.etvTextoEditText);
TextView textView = findViewById(R.id.txvTextoTextView);
Toast.makeText(getApplicationContext(),"Premiches o ImageButton",Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosButton();
}
}
Eventos mínimos a coñecer no Button
- Xestionar o evento de Click sobre calquera Button e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
Button btn = findViewById(R.id.btnBoton); // Referenciamos a un botón que estea no Layout da Activity btn.setOnClickListener(new View.OnClickListener() { // Xestionamos o evento de Click cunha interface anónima @Override public void onClick(View view) { Button boton = (Button) view; // Podemos obter a referencia ao view que provocou o evento do Click Toast.makeText(getApplicationContext(),"Botón Pulsado",Toast.LENGTH_LONG).show(); } });
FloatActionButton
Evento Interface OnClickListener
- Como expliquei anteriormente o evento Click xestionase dende a Interface OnClickListener mediante o método setOnClickListener que se atopa definido na clase View e polo tanto a forma de xestionalo sempre é a mesma.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosFab(){
findViewById(R.id.fabFloatActionButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FloatingActionButton fab = (FloatingActionButton) view; //Neste caso o View é un FAB
TextView textView = findViewById(R.id.txvTextoTextView);
textView.setText("Pulsado o FAB");
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosFab();
}
}
Eventos mínimos a coñecer no FAB
- Xestionar o evento de Click sobre calquera Float Action Button e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
ToggleButton - Switch
- Neste tipo de botóns o evento que nos vai interesar xestionar vai ser cando se preme no botón e se produce un cambio de estado.
- Lembrar que estes botóns teñen dous estados (activado / desactivado).
- Como nos casos anteriores, tamén podemos xestionar o Click, pero é mais correcto empregar a opción anterior.
- Lembrar que xa vimos anteriormente como obter o estado (on/off) deste tipo de botóns empregando o método isChecked().
Evento Interface OnCheckedChangeListener
- Evento que se produce cando hai un cambio de estado no botón.
- Para facer que o Switch/Toggle Button 'escoiten' este tipo de evento temos que chamar ao método setOnCheckedChangeListener() e pasarlle como parámetro un obxecto que implemente a interface OnCheckedChangeListener.
- Fixarse que dita interface pertence a unha clase CompoundButton igual que o método setOnCheckedChangeListener. Polo tanto non está definido a nivel de View e non todos os views implementan dito evento (soamente os CompoundButton).
- Polo tanto non podemos empregar como nos casos anteriores dos botóns: findViewById(R.id.id_switchbutton).setOnCheckedChangeListener() xa que dito método non se atopa.
- Podemos facer o findViewById e gardar a referencia nun obxecto do tipo correspondente e despois chamar ao método, ou se non queremos gardar a referencia nunha variable, teremos que facer un Cast do que devolva o findViewById.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarSwitchToogle(){
((Switch)findViewById(R.id.swbSwitchButton)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Switch swButton = (Switch)compoundButton; // Coidado de non empregar como nome da variable switch
TextView textView = findViewById(R.id.txvTextoTextView);
textView.setText("Premiches no switch con texto " + swButton.getText() + " e o seu novo estado é " + String.valueOf(b));
}
});
((ToggleButton)findViewById(R.id.tbtnToogleBoton)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
ToggleButton toggleButton = (ToggleButton) compoundButton; // Sabemos que é un ToggleButton. Lembra que temos o método compoundButton.getId() para obter o id se facemos a xestión de eventos a nivel de Activity
TextView textView = findViewById(R.id.txvTextoTextView);
textView.setText("Premiches no switch con texto " + toggleButton.getText().toString()+ " e o seu novo estado é " + String.valueOf(b));
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarSwitchToogle();
}
}
Eventos mínimos a coñecer no Switch/ToggleButton
- Xestionar o evento de Click e CheckedChange sobre calquera Switch / ToggleButton e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity. Como dixen anteriormente no será habitual que o necesitemos.
CheckBox
- O CheckBox ten o mesmo comportamento que no caso do Switch / ToggleButton explicado anteriormente.
- Neste tipo de Views o evento que nos vai interesar xestionar vai ser cando se preme no Check e se produce un cambio de estado.
- Lembrar que estes botóns teñen dous estados (activado / desactivado).
- Como nos casos anteriores, tamén podemos xestionar o Click, pero é mais correcto empregar a opción anterior.
- Ao igual que no caso dos Buttons, a xestión do evento Click pódese facer dende o Layout.
- Lembrar que xa vimos anteriormente como obter o estado (on/off) deste tipo de botóns empregando o método isChecked().
Evento Interface OnCheckedChangeListener
- Evento que se produce cando hai un cambio de estado no Check.
- Para facer que un CheckBox 'escoite' este tipo de evento temos que chamar ao método setOnCheckedChangeListener() e pasarlle como parámetro un obxecto que implemente a interface OnCheckedChangeListener.
- Fixarse que dita interface pertence a unha clase CompoundButton igual que o método setOnCheckedChangeListener. Polo tanto non está definido a nivel de View e non todos os views implementan dito evento (soamente os CompoundButton).
- Polo tanto non podemos empregar como nos casos anteriores dos botóns: findViewById(R.id.id_switchbutton).setOnCheckedChangeListener() xa que dito método non se atopa.
- Podemos facer o findViewById e gardar a referencia nun obxecto do tipo correspondente e despois chamar ao método, ou se non queremos gardar a referencia nunha variable, teremos que facer un Cast do que devolva o findViewById.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosCheckBox(){
((CheckBox)findViewById(R.id.chk_Uno)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
CheckBox checkBox = (CheckBox)compoundButton;
Toast.makeText(getApplicationContext(),"Premiches no check con texto " + checkBox.getText().toString() + " e estado a " + String.valueOf(b),Toast.LENGTH_SHORT).show();
}
});
((CheckBox)findViewById(R.id.chk_Dos)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
CheckBox checkBox = (CheckBox)compoundButton;
Toast.makeText(getApplicationContext(),"Premiches no check con texto " + checkBox.getText().toString() + " e estado a " + String.valueOf(b),Toast.LENGTH_SHORT).show();
}
});
((CheckBox)findViewById(R.id.chk_Tres)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
CheckBox checkBox = (CheckBox)compoundButton;
Toast.makeText(getApplicationContext(),"Premiches no check con texto " + checkBox.getText().toString() + " e estado a " + String.valueOf(b),Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosCheckBox();
}
}
Eventos mínimos a coñecer no CheckBox
- Xestionar o evento de Click sobre calquera CheckBox e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
- Xestionar o evento CheckedChange sobre calquera CheckBox e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
RadioButton-RadioGroup
- O RadioButton ten o mesmo comportamento que no caso do Switch / ToggleButton / CheckBox explicado anteriormente.
- Neste tipo de Views o evento que nos vai interesar xestionar vai ser cando se preme no RadioButton e se produce un cambio de estado.
- Lembrar que estes botóns teñen dous estados (activado / desactivado).
- Como nos casos anteriores, tamén podemos xestionar o Click, pero é mais correcto empregar a opción anterior.
- Ao igual que no caso dos Buttons, a xestión do evento Click pódese facer dende o Layout.
- Lembrar que xa vimos anteriormente como obter o estado (activado / desactivado) deste tipo de botóns empregando o método isChecked().
Evento Interface OnCheckedChangeListener no RadioButton
- Evento que se produce cando hai un cambio de estado nun RadioButton concreto.
- Para facer que un RadioButton 'escoite' este tipo de evento temos que chamar ao método setOnCheckedChangeListener() e pasarlle como parámetro un obxecto que implemente a interface OnCheckedChangeListener.
- Fixarse que dita interface pertence a unha clase CompoundButton igual que o método setOnCheckedChangeListener. Polo tanto non está definido a nivel de View e non todos os views implementan dito evento (soamente os CompoundButton).
- Polo tanto non podemos empregar como nos casos anteriores dos botóns: findViewById(R.id.id_switchbutton).setOnCheckedChangeListener() xa que dito método non se atopa.
- Podemos facer o findViewById e gardar a referencia nun obxecto do tipo correspondente e despois chamar ao método, ou se non queremos gardar a referencia nunha variable, teremos que facer un Cast do que devolva o findViewById.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosRadioButton(){
((RadioButton)findViewById(R.id.rbtnOpcionA)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Toast.makeText(getApplicationContext(),"Pulsado o radiobutton rbtnOpcionA e ten de estado " + String.valueOf(b),Toast.LENGTH_SHORT).show();
}
});
((RadioButton)findViewById(R.id.rbtnOpcionB)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Toast.makeText(getApplicationContext(),"Pulsado o radiobutton rbtnOpcionB e ten de estado " + String.valueOf(b),Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosRadioButton();
}
}
- Fixarse que ao executar a aplicación vos van saír dúas mensaxes. Cando o radiobutton Opción a) pasa de true a false e cando o radiobutton Opción b) pasa de false a true.
- Esta sería unha forma de facelo, pero veremos a continuación que en vez de crear un Listener por cada radiobutton, imos a facer que sexa o RadioGroup o que escoite o cambio de estado e informe de cal radiobutton cambiou de estado (esta será a forma correcta de facelo).
Evento Interface OnCheckedChangeListener no RadioGroup
- Evento que se produce cando hai un cambio de estado nun RadioGroup e se chamará a dito evento cando calquera RadioButton que estea dentro do RadioGroup cambie de estado.
- Para facer que un RadioGroup 'escoite' este tipo de evento temos que chamar ao método setOnCheckedChangeListener() dp RadioGroup e pasarlle como parámetro un obxecto que implemente a interface OnCheckedChangeListener do ViewGroup.
- Fixarse que dita interface pertence a unha clase ViewGroup igual que o método setOnCheckedChangeListener.
- Polo tanto non podemos empregar como nos casos anteriores dos botóns: findViewById(R.id.id_viewgroup).setOnCheckedChangeListener() xa que dito método non se atopa.
- Podemos facer o findViewById e gardar a referencia nun obxecto do tipo correspondente e despois chamar ao método, ou se non queremos gardar a referencia nunha variable, teremos que facer un Cast do que devolva o findViewById.
- Se consultamos a guía de referencia de Android podemos observar como o método da interface OnCheckedChangeListener se chama onCheckedChanged e ten como segundo parámetro o id do radiobutton que cambiou de estado.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosRadioGroup(){
((RadioGroup)findViewById(R.id.rgrpGrupoBotons)).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
RadioButton radioButton = findViewById(i);
switch(i){
case R.id.rbtnOpcionA:
Toast.makeText(getApplicationContext(),"Pulsado o radiobutton rbtnOpcionA e ten de estado " + String.valueOf(radioButton.isChecked()),Toast.LENGTH_SHORT).show();
break;
case R.id.rbtnOpcionB:
Toast.makeText(getApplicationContext(),"Pulsado o radiobutton rbtnOpcionB e ten de estado " + String.valueOf(radioButton.isChecked()),Toast.LENGTH_SHORT).show();
break;
}
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosRadioGroup();
}
}
- Nota:
- A diferenza de xestionar os eventos por cada RadioButton, no que premer noutro provocaba dous eventos, aquí soamente se captura o evento de seleccionar un radiobutton.
- Indicar que se por defecto está seleccionado o radiobutton a nivel gráfico (do layout) isto non provoca a execución do evento de click ou de cambio de estado.
- Se queremos que se provoque dito evento, non debemos de seleccionar ningún radiobutton no deseño e no código facer unha chamada ao método check(int id) do RadioGroup despois de rexistrar o listener.
Eventos mínimos a coñecer no RadioButton / RadioGroup
- Xestionar o evento de Click sobre calquera RadioButton e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
- Xestionar o evento de CheckedChangeListener sobre calquera RadioButton e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
- Xestionar o evento de CheckedChangeListener sobre o RadioGroup e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity.
// Exemplo de xestión de evento sobre un RadioButton concreto
((RadioButton)findViewById(R.id.rbtnOpcionB)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { // Referenciamos a un RadioButton do Layout e asociamos un listener
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Toast.makeText(getApplicationContext(),"Cambiado estado de rbtnOpcionB:" + b,Toast.LENGTH_SHORT).show();
}
});
// Exemplo de xestión de evento sobre un RadioGroup
((RadioGroup)findViewById(R.id.rgrpGrupoBotons)).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { // Referenciamos a un RadioGroup do Layout e asociamos un listener
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
RadioButton rb = findViewById(i); // Podemos obter unha referencia ao RadioButton dentro do RadioGroup que cambia de estado
switch (i){
case R.id.rbtnIOpcionA:
Toast.makeText(getApplicationContext(),"Cambiado estado Opción A: " + String.valueOf(rb.isChecked()),Toast.LENGTH_SHORT).show();
break;
case R.id.rbtnOpcionB:
Toast.makeText(getApplicationContext(),"Cambiado estado Opción B: " + String.valueOf(rb.isChecked()),Toast.LENGTH_SHORT).show();
break;
}
}
});
ImageView
- No caso dos Image imos poder querer xestionar o evento Click sobre a imaxe (por exemplo para lanzar a cámara do dispostivo) ou o evento LongClick que se produce cando mantemos durante un ou dous segundos premido o View.
- Ao igual que o OnClickListener, OnLongClickListener é unha interface que vai poder estar asociada a calquera View e polo tanto se vai poder empregar en calquera.
Evento Interface OnClickListener
- Como expliquei anteriormente o evento Click xestionase dende a Interface OnClickListener mediante o método setOnClickListener que se atopa definido na clase View e polo tanto a forma de xestionalo sempre é a mesma.
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosImageView(){
findViewById(R.id.imageView).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Premiches na imaxe",Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosImageView();
}
}
Evento Interface OnLongClickListener
- Cando sobre unha vista se preme por duración de 1 segundo ou máis lánzase o evento LongClick que é capturado polo método onLongClick() asociado á interface OnLongClickListener.
- Igual que fixemos con a forma de xestionar un Click sobre un View, agora deberemos facer uso do método setOnLongClickListener() o cal permite 'rexistrar' a interface que xestiona o evento.
- Dito método espera recibir como parámetro un obxecto dunha clase que implemente a interface OnLongClickListener.
- Podemos facelo de forma anónima ou implementando dito interface nunha clase calquera ou na propia Activity.
- Ao facelo deberemos de implementar o método da interface que neste caso é o método onLongClick().
- Como dixen antes, o método setOnLongClickListener está definido na clase View e polo tanto calquera View vai poder rexistrar este evento.
- O método onLongClick() devolve un booleano para poder comprobar se o evento se consumou ou non. Se chegamos a premer por un segundo (ou máis) ou non.
- Devolve true se puidemos capturar o evento e xa non fai nada máis.
- Devolve false se non se puido capturar o evento e continua chamando a outros escoitadores tipo on-Click.
- NOTA: Como paso previo a realizar o exemplo, copia unha imaxe a /res/drawable/ de nome imaxeimageview.png.
- Lembra que xa vimos na UD2 do ImageView como cargar unha imaxe.
Código da Activity:
public class UD03_01_xesteventos_base extends AppCompatActivity {
private void xestionarEventosImageView(){
findViewById(R.id.imageView).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Premiches na imaxe",Toast.LENGTH_SHORT).show();
}
});
findViewById(R.id.imageView).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
ImageView imageButton = (ImageView) view; // O view que provocou o evento foi o ImageView
imageButton.setImageResource(R.drawable.imaxeimageview);
return true; // Non queremos que faga o Click a continuación
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u_d03_01_xesteventos_base);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // Para que non apareza o teclado virtual
xestionarEventosImageView();
}
}
- Liñas 4-9: Método onClick. Non ten nada diferente ao visto.
- Liñas 14-18: Método onLongClick.
- Fixarse que dito método devolve un boolean. O que indica este boolean é se queremos que o evento siga 'propagándose'. No exemplo, despois de facer o LongClick, produciría o evento Click.
- Se devolvemos true estamos indicando que xa xestionamos o evento e non queremos que siga propagándose (por iso non fai a chamada ao método onClick).
- Podedes probar a cambiar o return por: return false
- Comprobar como despois de facer o LongCLick tamén vai chamar ao evento Click.
Eventos mínimos a coñecer no ImageView
- Xestionar o evento de Click e LongClick sobre calquera ImageView e sabelo facer empregando interfaces anónimas ou implementando a interface na Activity. Como dixen anteriormente no será habitual que o necesitemos.
ListView-Spinner
- A xestión de eventos destes controis o veremos na UD4-Adaptadores.
Outros métodos de interese
- Podemos facer que un determinado View sexa ou non clickable da forma:
- Desabilitando dito view:
- Por programación chamando ao método setEnabled(boolean)
- No layout, poñendo como propiedade do view: android:enabled="false"
- Pasando como obxecto no método o valor null da forma:
- view.setOnClickListener(null)
- view.setOnLongClickListener(null)
- Poñendo na propiedade do view: android:clickeable="false" (tamén desactiva o click) ou a propiedade android:longClickable="false" para desactivar soamente o long click.
- Lembrar que se empregamos esta opción e temos a nivel de código o método setOn(Long/Click)Listener posto, ditas propiedades pasan a ter o valor true outra vez, como xa vimos no TextView e teremos que chamar ao método setClickable(false).
Enlace a la página principal de la UD3
Enlace a la página principal del curso
-- Ángel D. Fernández González -- (2020).