Bắt sự kiện Button trong Android
Các sự kiện (event) là một cách hữu ích để tương tác giữa người dùng với các thành phần của ứng dụng. Ví dụ như sự kiện nhấn vào một nút hoặc chạm vào màn hình… Bài hướng dẫn này sẽ hướng dẫn một số phương pháp để bắt và xử lý sự kiện trong Android. Show Để có thể phát hiện và xử lý một sự kiện từ người dùng, mình giới thiệu 5 cách:
Cả 5 cách này về bản chất là đều implement các Event Interface. Tùy vào kiến trúc dự án, thói quen lập trình mà bạn có thể chọn một cách để làm. Chúng ta bắt đầu nhé! Nội dung chính của bài viết
Tương ứng với mỗi một sự kiện của người dùng, sẽ có hàm tương ứng để xử lý và lắng nghe. Mình lấy ví dụ:
Trong số các hàm sự kiện này, có lẽ Bài
viết này mình sẽ tập trung trình bày cách khác nhau để bắt và xử lý sự kiện Để minh họa cho bài viết, mình sẽ tạo một layout activity_main.xml có TextView và Button như bên dưới: Nếu bạn muốn tìm hiểu sâu hơn về cách thiết kế layout thì đọc bài viết này: Layout trong Android và cách thiết kế layout hỗ trợ đa màn hình Bài viết này sẽ thực hiện một ví dụ đơn giản để minh họa như sau: Mỗi khi người dùng chạm vào Button thì sẽ thay đổi nội dung dưới TextView. Trong MainActivity.kt, bạn sẽ import các thư viện cơ bản sau import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; Protip: Android Studio có thể tự import cho bạn những viện cần thiết bằng cách đưa chuột vào chỗ text nào bị gạch chân màu đỏ rồi nhất Alt+ Enter. OK, bộ khung đã xong, chúng ta sẽ cùng thử lần lượt các cách phát hiện và xử lý sự kiện trong Android. Các cách xử lý sự kiện (Event Handling) trong AndroidCách 1: Tạo riêng Member ClassChúng ta tạo một inner class trong Activity và đặt tên là HandleClick. HandleClick sẽ implemetent một interface có tên là class MainActivity:AppCompatActivity() { protected fun onCreate(savedInstanceState:Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //attach an instance of HandleClick to the Button findViewById(R.id.button1).setOnClickListener(HandleClick()) } private inner class HandleClick:View.OnClickListener { fun onClick(arg0:View) { val btn = arg0 as Button //cast view to a button // update the TextView text (findViewById(R.id.textView) as TextView).setText("You pressed " + btn.getText()) } } } Cách 2. Tạo riêng InterfaceChúng ta khai báo một biến kiểu class MainActivity:AppCompatActivity() { private val handleClick = object:View.OnClickListener() { fun onClick(arg0:View) { val btn = arg0 as Button val tv = findViewById(R.id.textView) as TextView tv.setText("You pressed " + btn.getText()) } } protected fun onCreate(savedInstanceState:Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //attach an instance of HandleClick to the Button findViewById(R.id.button1).setOnClickListener(handleClick) } } 🤗 Dành cho bạn: Intent trong Android: Vai trò và cách sử dụng Cách 3. Sử dụng Anonymous Inner ClassCách này đơn giản là chúng ta khởi tạo luôn một instance của Cách làm này rất hữu dụng khi bạn muốn viết code nhanh, và phần xử lý sự kiện này không tái xử dụng ở đâu trong dự án. Một số bạn chưa có kinh nghiệm có thể thấy code này khá khó hiểu. Nhưng thực ra, về bản chất cũng giống như các cách trên là đều tạo instance của class MainActivity:AppCompatActivity() { protected fun onCreate(savedInstanceState:Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //attach an instance of HandleClick to the Button findViewById(R.id.button1).setOnClickListener(object:View.OnClickListener() { fun onClick(arg0:View) { val btn = arg0 as Button val tv = findViewById(R.id.textView) as TextView tv.setText("You pressed " + btn.getText()) } }) } } Cách 4. Implement trực tiếp trên ActivityActivity cũng có thể implement luôn class main:AppCompatActivity(), View.OnClickListener { protected fun onCreate(savedInstanceState:Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //attach an instance of HandleClick to the Button findViewById(R.id.button1).setOnClickListener(this) } fun onClick(arg0:View) { val btn = arg0 as Button val tv = findViewById(R.id.textView) as TextView tv.setText("You pressed " + btn.getText()) } } Cách 5. Sử dụng thuộc tính onCLick trong View LayoutTừ API level 4 (Android 1.6) trở
đi, tên của một hàm có thể được gán vào thuộc tính Sau đó thì hàm đó được viết trong Activity như sau class MainActivity:AppCompatActivity() { fun onCreate(savedInstanceState:Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } fun handleClick(arg0:View) { val btn = arg0 as Button val tv = findViewById(R.id.textView) as TextView tv.setText("You pressed " + btn.getText()) } } Lưu ý: Tham số của hàm được định nghĩa trong thuộc tính của layout luôn là View. Ví dụ: trong layout mình đặt tên hàm là handleClick thì trong Activity hàm đó phải là Với cách này thì code của bạn sẽ khá gọn, không cần phải gọi Cuối cùng, cách làm này chỉ áp dụng cho sự kiện Tổng kếtNhư vậy, mình đã chia sẻ với các bạn các cách phổ biến nhất để xử lý sự kiện trong Android. Với cá nhân mình, thì cách 4 là hay sử dụng nhất. Các Listener nên đóng gói trong Activity và không nên share Listener giữa các Activity. Các bạn có thể tham khảo các bài viết khác trong khóa học: Tự học lập trình Android trong 24 giờ của mình để hiểu thêm nhé. Bài viết sau sẽ là hướng dẫn toàn tập về Service trong Android. Nếu các bạn có cách xử lý sự kiện trong Android nào khác hay ho hơn thì chia sẻ bên dưới để mọi người cùng học hỏi nhé. Đừng quên share bài viết để mình có động lực tiếp tục hoàn thành khóa học nhé |