Overriding Method Yang Ada di Activity

User berinteraksi dengan UI dengan dua level yaitu: level activity dan level view. Pada level activity, class Activity akan menyediakan method-method yang bisa kita override. Beberapa method yang umum yang bisa kita override di activity antara lain adalah:
  • onKeyDown – dipanggil bila ada key yang ditekan dan tidak ditangani oleh view apapun yang ada di dalam activity.
  • onKeyUp – dipanggil bila ada key yang dilepas dan tidak ditangani oleh view apapun yang ada dalam activity.
  • onMenuItemSelected – dipanggil bila ada item menu yang dipilih oleh user (lihat latihan tentang topik “Menampilkan Menu, Options Menu, dan Context Menu”)
  • onMenuOpened – dipanggil bila ada menu yang dibuka oleh user (lihat latihan tentang “Menampilkan Menu”)
Untuk menunjukkan bagaimana activity berinteraksi dengan user, contoh berikut akan melakukan ‘override’ pada beberapa method yang ada pada class Activity.

1. Kita buat project baru dan kita beri nama UIActivity.

2. Kita modifikasi dan tambahkan kode berikut pada file ‘activity_main.xml’:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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"
android:orientation="vertical"
tools:context="id.co.blogspot.diansano.uiactivity.MainActivity">

<TextView
android:layout_width="214dp"
android:layout_height="wrap_content"
android:text="Nama Anda" />

<EditText
android:id="@+id/txt1"
android:layout_width="214dp"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn1"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:text="OK" />

<Button
android:id="@+id/btn2"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:text="Cancel" />
</LinearLayout>
3. Kita modifikasi dan tambahkan kode berikut pada file “MainActivity.java”:
package id.co.blogspot.diansano.uiactivity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
"Tengah keypad di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
"Panah kiri di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
"Panah kanan di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
"Panah atas di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
"Panah bawah di-klik",
Toast.LENGTH_LONG).show();
break;
}
return false;
}
}
4. Jalankan pada emulator Android Studio

5. Ketika activity muncul, ketikkan suatu teks di dalam ‘EditText’. Kemudian, klik panah bawah atau atas, kiri, kanan. Perhatikan pesan yang muncul di layar.

Penjelasan:

Ketika activity di-load, kursor akan ada di ‘EditText’, karena sedang mendapatkan fokus. Di dalam class “MainActivity”, kita me-override method ‘onKeyDown’ dari class ‘Activity’ :
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
"Tengah keypad di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
"Panah kiri di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
"Panah kanan di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
"Panah atas di-klik",
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
"Panah bawah di-klik",
Toast.LENGTH_LONG).show();
break;
}
return false;
}
Di Android, dimanapun kita menekan key pada perangkat, view yang sedang menjadi fokus akan mencoba menangani event yang dihasilkan. Dalam hal ini, bila ‘EditText’ mendapatkan fokus dan kita menekan suatu key, ‘EditText’ akan menangani event yang dihasilkan dan menampilkan karakter yang kita tekan pada view tersebut. Tetapi,bila kita menekan key panah ke bawah atau atas, ‘EditText’ tidak akan menangani ini, dan sebaliknya melewatkan event ini ke activity. Dalam hal ini, method ‘onKeyDown()’ dipanggil. Dalam latihan ini ketika key panah ditekan akan menampilkan pesan bahwa key panah ditekan (di-klik). Perhatikan bahwa fokus kemudian pindah ke view berikutnya, yaitu tombol ‘OK’.

Menariknya, bila view ‘EditText’sudah memiliki suatu text di dalamnya dan kursor ada di ujung akhir teks, maka ketika men-klik panah kiri tidak akan memicu method ‘onKeyDown()’; melainkan kursor akan pindah satu karakter ke kiri. Ini disebabkan view ‘EditText’ sudah menangani event tersebut. Sebaliknya bila kita menekan panah kanan saat kursor ada di ujung akhir teks, maka method ‘onKeyDown()’ dipanggil (karena saat itu view ‘EditText’ tidak sedang menangani event tersebut). Hal yang sama juga berlaku ketika kursor ada di ujung awal ‘EditText’. Dengan men-klik panah kiri maka akan memicu method ‘onKeyDown()’, dan men-klik panah kanan akan memindahkan kursor satu karakter ke kanan.

Ketika fokus sedang ada pada tombol ‘OK’, menekan tombol panah tengah tidak akan menampilkan pesan di layar, karena view ‘Button’ tersebut sedang menangani event klik sehingga event tersebut tidak diambil oleh method ‘onKeyDown()’.

Perhatikan juga bahwa method ‘onKeyDown()’ mengembalikan nilai ‘boolean’. Seharusnya kita mengembalikan nilai ‘true’ bila kita ingin memberitahukan ke sistem bahwa kita sudah selesai dengan event tersebut dan bahwa sistem seharusnya tidak memproses berikutnya lebih lanjut. Contohnya, perhatikan latihan di bawah ini bila kita mengembalikan nilai ‘true’ pada masing-masing key.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
"Tengah keypad di-klik",
Toast.LENGTH_LONG).show();
//break;
return true;

case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
"Panah kiri di-klik",
Toast.LENGTH_LONG).show();
//break;
return true;

case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
"Panah kanan di-klik",
Toast.LENGTH_LONG).show();
//break;
return true;

case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
"Panah atas di-klik",
Toast.LENGTH_LONG).show();
//break;
return true;

case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
"Panah bawah di-klik",
Toast.LENGTH_LONG).show();
//break;
return true;
}
return false;
}
Bila kita mencobanya kita akan tahu bahwa kita tidak lagi bisa menavigasi antar view dengan menggunakan tombol panah.

No comments: