Có nhiều cách để “bắt” sự kiện click vào 1 button trong lập trình android, tùy từng trường hợp cụ thể để ta lựa chọn cách viết thích hợp nhất.
Trong tut này tôi sử dụng IDE là Eclipse.
Tạo 1 project Android application với file giao diện chính là activity_main.xml, activity chính là MainActivity.java, dưới đây là các cách để lắng nghe sự kiện cho 1 button:
-
Inline Listener
Trong giao diện chúng t thêm 1 button với các thuộc tính như sau:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="myEvent"
android:text="ClickMe!" />
Trong đó android:onClick="myEvent" để đăng ký phương thức sẽ xử lý khi button1 được click.
Trong file MainActivity.java chúng ta xây dựng 1 phương thức có tên myEvent và truyền cho phương thức này 1 View
public void myEvent(View view) {
// Xử lý khi button được click
Toast.makeText(MainActivity.this, "Button clicked!", Toast.LENGTH_LONG)
.show();
}
Khi đó: nếu button1 được click thì phương thức myView sẽ được gọi.
2. Inline Anonymous Listener
Vẫn với button như trên nhưng ta bỏ thuộc tính android:onClick="myEvent"
Khi đó để xử lý được sự kiện khi ta click vào button1, trong file MainActivity.java trong phương thức onCreate ta cần đăng ký sự kiện click cho button1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_clickme = (Button) findViewById(R.id.button1);
btn_clickme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// Xử lý khi button được click
Toast.makeText(MainActivity.this, "Button clicked!",
Toast.LENGTH_LONG).show();
}
});
}
3. Activity is Listener
- Trong cách viết sự kiện này thì Activity sẽ implements interface có kiểu sự kiện (rất nhiều loại interface). Ở đây Tôi chỉ ví dụ trường hợp cho Button các trường hợp khác các bạn tự tìm hiểu và suy luận ra.
File xml vẫn như ví dụ 2.
public class MainActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_clickme = (Button) findViewById(R.id.button1);
btn_clickme.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// Xử lý khi button được click
Toast.makeText(MainActivity.this, "Button clicked!", Toast.LENGTH_LONG)
.show();
}
}
4. Listener is Variable
- Tương tự như Activity Is listener, nhưng khác ở chỗ thay vì implement interface cho Activity thì nó lại được lưu trữ vào một biến có kiểu Listener trong activity. Làm cách này thì ta có thể chia sẻ chung một biến sự kiện cho các control khác nhau.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OnClickListener myListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "Button clicked!", Toast.LENGTH_LONG)
.show();
}
};
Button btn_clickme = (Button) findViewById(R.id.button1);
btn_clickme.setOnClickListener(myListener);
}
5. Explicit listener class
Trường hợp này ta tách riêng một class đóng vai trò là class sự kiện riêng.
- Khi nào lượng coding trong ứng dụng khổng lồ và phức tạp thì ta nên tách class sự kiện riêng để dễ quản lý.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_clickme = (Button) findViewById(R.id.button1);
btn_clickme.setOnClickListener(new myListener());
}
private class myListener implements OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "Button is clicked!",
Toast.LENGTH_SHORT).show();
}
}
}
.