Chắc hẳn khi mới bắt đầu lập trình Android thì các bạn đều tìm hiểu cách click button để bắt 1 sự kiện nào đó. Có nhiều cách bắt sự kiện lắm nhé, và bạn cùng mình tìm hiểu bắt sự kiện trong android nhé.
Giả sử có cái Layout như sau:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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=".MainActivity">
<Button
android:id="@+id/btn_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bấm em đi anh" />
</LinearLayout>
Ở button trên mình sẽ đặt cho nó một cái id là btn_click
để chúng ta có thể tìm lại được nó trong activity.
Trong activity chúng ta sẽ tìm button bằng hàm findViewById
:
public class MainActivity extends AppCompatActivity {
Button button; //Khai báo một button
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.btn_click); //Tìm lại button
}
}
Bắt trực tiếp
bạn dùng hàm setOnClickListener để set trực tiếp. Phương pháp này trông có vẻ nhìn đáng sợ nhưng là cách làm nhanh tay lẹ mắt nhất trong android.
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.btn_click); //nạp button
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"Bạn đã click",Toast.LENGTH_SHORT).show();
}
});
}
}
Bắt sự kiện trong XML
Phương pháp này trong có vẻ ngầu ngầu hơn 1 tí và đồng thời nó clean hơn 1 tí. Trông đỡ đáng sợ.
Những thứ bạn cần làm là vào XML khai báo là có cái android:onClick="TEN_FUNCTION" thì trong code java bạn chỉ cần tạo 1 hàm TEN_FUNCTION là xong, lúc click nó sẽ chạy.
Đặc biệt Phương pháp này khá tiện cho việc kế thừa nhiều view cùng 1 sự kiện click.
Xml như sau:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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=".MainActivity">
<Button
android:onClick="hamOnClickThongBao"
android:id="@+id/btn_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click" />
</LinearLayout>
Sau khi thêm dòng android:onClick="hamOnClickThongBao"
thì trong xml báo lỗi hoặc nếu không báo lỗi thì run code cũng lỗi 😄 , bạn hover vào và bấm override phương thức còn thiếu hamOnClickThongBao
thì sẽ ok nhé.
Sau khi nó sinh ra 1 function trong java code thì bạn chỉ bõ code bạn muốn vào trong đó. Như sau:
public void hamOnClickThongBao(View view) {
Toast.makeText(MainActivity.this,"Bạn đã click btn hamOnClickThongBao ",Toast.LENGTH_SHORT).show();
}
Với cách này thì mình không khuyến khích dùng cho lắm.
Đôi khi 1 app mobile có nhiều button cần bắt sự kiện bạn hoàn toàn có thể handle trong cùng 1 hàm. Và mục này dùng cho việc xử lý button dạng như chung: bạn chỉ cần implements interface View.OnClickListener => nó văng lỗi bảo bạn cần phải override method onclick để handle lại sự kiện onclick của interface.
Lưu ý to bự: Cái view nào bạn muốn nó chạy được sự kiện onclick bạn phải gọi hàm này: button.setOnClickListener(this);
Code java lúc này như sau :
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.btn_click);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"Bạn đã click",Toast.LENGTH_SHORT).show();
}
}