Child pages
  • 6. Eseménykezelés
Skip to end of metadata
Go to start of metadata

A szép komponensek és a tetszetős elrendezések mit sem érnek, ha nem értesülünk a bekövetkezett eseményekről, s nem reagálunk rájuk. Ha csak a képernyőre és a beviteli perifériákra szorítkozunk, akkor az esemény érkezhet az érintőképernyőről vagy a (virtuális)billentyűzetről. Ehhez jönnek a komponensek eseményei, amikor lenyomunk egy gombot, fókuszt váltunk a felületen vagy karaktert írunk vagy törlünk.

6.1. A kattintás

Egy grafikus felhasználói interfész leglényegesebb eseménye a kattintás, a legtöbb komponensnek van a kattintás lekezeléséhez metódusa, bár a kattintás tipikusan a gombokhoz való esemény, lássunk egy példát rá:

main.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent">
  <TextView android:id="@+main/label"
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:text=""/>
  <Button android:id="@+main/button"
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:text="Click me!"/>
</LinearLayout>

 A hozzá tartozó program se túl hosszú:

MainActivity.java
public class MainActivity extends Activity implements View.OnClickListener
{

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

    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.main.button);
    button.setOnClickListener(this);
  }

  @Override
  public void onClick(View view)
  {
    TextView textView = (TextView) findViewById(R.main.label);
    textView.setText("Hey, I'm here!");
  }
}

A program implementálja a View.OnClickListener interfészt, s megvalósítja annak onClick metódusát. Ebben a metódusban egyszerűen kiírjuk a label azonosítójú TextView komponensre, hogy "Hey, I'm here!". Ahhoz, hogy működjön a dolog, hozzá hozzá kell rendelnünk a nyomógombhoz az OnClickListener implementációt, ezt a setOnClickListener metódussal tudjuk megtenni. Lássuk az eredményt:

Felmerül a kérdés, hogy hogyan tudjuk megkülönböztetni a kattintás forrását, erre szolgál az onClick metódus view paramétere:

Java forrás
@Override
public void onClick(View view)
{
  TextView textView = (TextView) findViewById(R.main.label);

  switch (view.getId())
  {
    case R.main.button1:
      textView.setText("Click from button one...");
      break;
    case R.main.button2:
      textView.setText("Click from button two...");
      break;
    case R.main.button3:
      textView.setText("Click from button three...");
      break;
  }
}

Természetesen ehhez létre kell hoznunk három nyomógombot, illetve mind a háromhoz hozzá kell rendelni az eseménykezelőt, csak ezek után tudunk a kattintás forrása után érdeklődni a komponenes azonosítóját felhasználva:

6.2. Az érintés

Az érintőképernyő megköveteli az érintés kezelését, ez leginkább az egérmutató követéséhez hasonlít a desktop világban, ám annál több információt tudunk kinyerni - ha támogatja azt a hardver illetve a platform. Az Android által támogatott plusz információk közül az egyik az érintés erőssége (pressure), a másik az érintés kiterjedése (size), ám nem minden hardver támogatja ezeket az információkat. A példaprogram tekintetében tegyünk egy teljes felületet beborító TextView komponenst a képernyőre:

main.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent">
  <TextView android:id="@+main/label"
          android:layout_height="fill_parent"
          android:layout_width="fill_parent"
          android:text=""/>
</LinearLayout>

Majd írjuk meg hozzá az alábbi kis programocskát:

MainActivity.java
public class MainActivity extends Activity implements View.OnTouchListener
{

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

    setContentView(R.layout.main);

    TextView textView = (TextView) findViewById(R.main.label);
    textView.setOnTouchListener(this);
  }

  @Override
  public boolean onTouch(View view, MotionEvent event)
  {
    float x = event.getX();
    float y = event.getY();
    float p = event.getPressure();
    float s = event.getSize();

    TextView textView = (TextView) findViewById(R.main.label);
    textView.setText("x: " + x + ", y: " + y + ", p: " + p + ", s: " + s);

    return true;
  }
}

Ez a pár soros program mindössze annyit csinál, hogy lekérdezi és kiírja az érintés négy jellemzőjét:

Szintén érintőképernyőhöz köthető esemény a hosszú érintés, amelyre legtöbb esetben egy felbukkanó menü a válasz, de ne szaladjunk ennyire előre, elégedjünk meg egy puszta üzenettel:

MainActivity.java
public class MainActivity extends Activity implements View.OnLongClickListener
{

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

    setContentView(R.layout.main);

    TextView textView = (TextView) findViewById(R.main.label);
    textView.setOnLongClickListener(this);
  }

  @Override
  public boolean onLongClick(View view)
  {
    TextView textView = (TextView) findViewById(R.main.label);
    textView.setText("Why do you touch me?!");

    return true;
  }
}

A program eredményeképpen hosszabb érintés után meg fog jelenni a "Why do you touch me?" szöveg.

6.3. A fókuszváltás

Gyakori feladat, hogy egy beviteli mező elhagyásakor, vagy belelépésekor végrehajtsunk valamilyen eseményt, például ellenőrizzük a tartalmát, hogy megfelel-e a kívánalmainknak és rögtön jelezzük ezt a felhasználó számára. Amikor egy beviteli mező megkapja a "figyelmet", akkor keletkezik egy fókusz-esemény, amelyre fel tud iratkozni bármelyik komponens a setOnFocusListener metódus meghívásával. Nézzük a példaprogramot:

main.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent">
  <TextView android:id="@+main/label"
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:text=""/>
  <EditText android:id="@+main/edit1"
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:text=""/>
  <EditText android:id="@+main/edit2"
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:text=""/>
</LinearLayout>

A két beviteli mező elé tettünk egy egyszerű címkét, ebben fogjuk megjelentetni, hogy éppen melyik beviteli mező az aktív:

MainActivity.java
public class MainActivity extends Activity implements View.OnFocusChangeListener
{

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

    setContentView(R.layout.main);

    EditText editText1 = (EditText) findViewById(R.main.edit1);
    editText1.setOnFocusChangeListener(this);
    EditText editText2 = (EditText) findViewById(R.main.edit2);
    editText2.setOnFocusChangeListener(this);
  }

  @Override
  public void onFocusChange(View view, boolean hasFocus)
  {
    TextView textView = (TextView) findViewById(R.main.label);
    if (hasFocus)
    {
      switch (view.getId())
      {
        case R.main.edit1:
          textView.setText("Focus is in the first EditView");
          break;
        case R.main.edit2:
          textView.setText("Focus is in the second EditView");
          break;
      }
    }
  }
}

A program futása során mindig az a szöveg jelenik meg a címkében, amelyik beviteli mező az aktív:

-.- folytatása következik -.-

      
      
Page viewed times
  • No labels

10 Comments

  1.  Az eddigi cikkek nagyon jók voltak, várom a folytatást.
  2. Hahó! Sziasztok!

    Mikor lesz folytatás? Nagyon várom már!

  3. Előbb az érintés, aztán a kattyintás! Nem de? :)

  4. Totál kezdő vagyok, itt miket kell importálni? Mert nem nagyon akar összejönni az implementálásnál nem találja a View típust.

    1. import android.view.View; 

      rájöttem. :)

  5. Jók a cikkek, sokat segítettek..:) Az activity-k hez javasolnám, az olyan példát, ahol az egyik esemény egy másik activity-t (másik class-t) hív meg és a másik végeztével visszajön az eredetire. (na ezzel szórakoztam egy darabon). A másik ami szerintem érdekes lenne, az, hogy hogyan olvassunk be adatokat távoli szerverről/adatbázisból. Amennyire én jutottam az, az, hogy nem direkt sql kapcsolat kell (ill nem javallott). Ha jól értem a soap féleség egy lehetőség, de sajna nemigen értem még..:)

  6. Nagyon tetszenek a cikkeid, régóta olvasom őket, és sokat tanultam már belőlük.  Csak nemrég regisztráltam, de látom már egy ideje nem volt feltéve új hír :) ( pedig igértél fal down-t is :P )
    Nem követelőzésképp mondtam, csak remélem nem hagy alább az alkotói kedved se progolás, se cikkírás terén :)

    Így tovább, várjuk az okosításod. [ +1 Like ]

    Üdv: Trigal

  7.  Kérdéseim vannak, bár lehet nem mindegyik pont ide illik. Mindenesetre én nagyok hálás lennék minden válasznak.

    1. Ezt a implements View.OnClickListener kiegészítést kötelező berakni? Mi történik ha lehagyom, akkor nem lehet simán felülírni az onClicket?
    2. Az első példában az onClick  inputja nincs használva (View view), akkor ki is törölhetem akár? Persze akkor úgy is hívnám meg, azaz this nélkül.
    3. A MainActivity egy osztály. Mikor vagy minek hatására példányusol, ha egyáltalán? Azzal hogy bekerül a manifest xml-be? Mondhatjuk, hogy az oncreate az a konstruktor?
    4. Rendesen össze vagyok zavarodva mi is ez a this. Három megfejtésem is van. Egy: a this az adott osztály aktuális példányára mutat. Kettő: a this az aktuális példánynak a Context őse. Három: ebben a példában a this valahogy View típusú. Mi az igazság és hogy vannak ezek összefüggésben?
  8. Anonymous

    Lesz még folytatás? (smile)