2013/11/21

Widget-ek sortzen dituzten ebentuen kudeaketa

Erabiltzaileak interfazearekin elkarreragiten duen momentuan, adibidez pantailako botoi bat pultsatzean, ebentuak deitzen diren gertaerak sortzen dira. App-ek ebentu horien aurrean erreakzionatzeko gaitasuna dute Listener izeneko objektuak kudeatuz.

Listener ak View class-eak eskeintzen dituen interfazeak dira eta mota ezberdinak existitzen dira, hala nola jarraian azaltzen diren hauek:

  • View.OnClickListener: klik ebentuaren aurrean erantzuten duten horiek dira.
  • View.OnLongClickListener:  klik luzearen ebentuaren aurrean erantzuten duten horiek dira.
  • View.OnFocusChangeListener: fokua hartzearen edota galtzearen prozesuari erantzuten duten horiek dira.
  • View.OnKeyListener: elementuak fokua badu teklatuaren pultsazioen aurrean erreakzionatuko duten horiek dira.
  • View.OnTouchListener: erabiltzaileak elementu bat ukitzean edo soltatzean sortzen den ebentua da.
  • View.OnCreateContextMenuListener: pultsazio luze baten ondoren agertzen den laster-menuari erantzuten diona da.



Interfaze edo listener horietako bakoitzak metodo bat implementatzen du. Metodo horri ebentua gertatzen den unean deituko zaio eta App-ak programatzaileak metodo edo funtzio horren barruan aurreikusi duena egingo du.

Beraz ebentu bat kudeatu nahi bada derrigorrez honako 3 pausu hauek jarraitu beharko dira:

Elementua edo objektua (botoia, testua, irudia,...widget-ak orokorrean) instanziatu edo erreferentziatu.
Elementuari listener-a ezarri.
Listener-ak implementatzen duen metodoa definitu eta garatu.

Ikus dezagun guzti hau adibide batekin. Kasu honetan lortu nahi dena botoi bat klikatzerakoan Toast mezu bat azaltzea izango da. Horretarako honako interfazea eta logika aplikatuko da:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

   <Button 
        android:id="@+id/button1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/toast"
        android:layout_centerInParent="true"
        />

</RelativeLayout>


 package com.proeiktua.lehenengoproiektua;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  setContentView(R.layout.activity_main);
  
  final Button button1 = (Button) findViewById(R.id.button1);

  button1.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View arg0) {
    Toast.makeText(button1.getContext(),
      "KAIXO",
      Toast.LENGTH_SHORT).show();
   }
  });
 }
}

Button-a RelativeLayout baten barnean kokaturik dagoenez interfazearen erdian zentratuko da android:layout_centerInParent="true" parametroaren bitartez. Button-aren instanziazioa findViewById-rekin egiten da xml kodean definitu den id-a pasaz. setOnClickListener metodoarekin button-ari klik ClickListener-a ezartzen diogu eta azkenik Toast-a ezarritako Listener-aren barneko onClick metodoan definitzen da.

I. Ilustrazioan ikus daiteke proiektu hau exekutatzerakoan lortzen den efektua.

I. Ilustrazioa: Klik ebentu baten adibidea