Cách thích hợp để triển khai giao diện OnClickListener cho nhiều nút


10

Hoạt động Android của tôi chứa nhiều nút mà tất cả đều cần OnClickListener. Tôi đã thấy rất nhiều cách khác nhau để làm điều này như:

  • Triển khai giao diện trong lớp hoạt động
  • Tạo một lớp riêng thực hiện giao diện
  • Xác định một lớp bên trong ẩn danh cho mỗi nút.

Tôi đã thấy nhiều ví dụ về mỗi cách tiếp cận. Tuy nhiên, tôi không rõ tại sao một cách tiếp cận sẽ được sử dụng thay vì cách tiếp cận khác. Là sự khác biệt giữa các cách tiếp cận này theo phong cách hoặc có những lý do làm cho một cách tiếp cận tốt hơn?

Câu trả lời:


6

Như với nhiều thứ, cách tiếp cận chính xác phụ thuộc vào những gì bạn đang cố gắng làm cho nút cụ thể và những gì bạn đang làm với hoạt động.

Lớp hoạt động thực hiện giao diện :
Đây là một tùy chọn tốt khi bạn chỉ có một loại tác vụ để thực thi khi trình nghe này được gọi. Một ví dụ về điều này sẽ là một hình thức đơn giản với một số trường và nút lưu. Tôi không muốn người nghe sự kiện của tôi kiểm tra nguồn của sự kiện để quyết định những gì thực sự cần phải được thực hiện. Tôi biết rằng một số người có thể nói đây là một phong cách, nhưng tôi tin rằng bằng cách không yêu cầu người nghe thực hiện kiểm tra này làm cho mã dễ theo dõi hơn vì bạn sẽ biết chính xác những gì được gọi cho mỗi sự kiện.

Một lớp khác thực hiện giao diện :
Như tôi đã nói ở trên, tôi thích tùy chọn này hơn khi tôi có nhiều mục có thể kích hoạt cùng một sự kiện. Mở rộng ví dụ trên, cho phép thêm một nút rõ ràng cũng yêu cầu người nghe nhấp chuột. Tạo một trình lắng nghe tạo ra các hành động lưu và một trình xử lý tạo ra các hành động rõ ràng. Mỗi người nghe chỉ được thêm vào các thành phần sẽ tạo ra hành động đó.

Việc thực hiện này có một lợi ích bổ sung mà bạn có thể sử dụng nếu bạn quan tâm. Lợi ích là nó ngăn các lớp khác kích hoạt sự kiện bên trong lớp hoạt động của bạn. Vì phương thức giao diện phải công khai, bất kỳ ai có tham chiếu đến lớp đều có thể kích hoạt sự kiện. Nếu bạn muốn kiểm soát chi tiết tốt về những người có thể làm những gì trong ứng dụng, một lớp riêng sẽ ngăn bất kỳ ai có tham chiếu đến hoạt động để kích hoạt biểu mẫu của bạn bị xóa hoặc lưu (hoặc có khả năng phá vỡ mã nếu người nghe sử dụng nguồn, nhưng không xử lý đầu vào xấu).

Một lớp bên trong ẩn danh thực hiện giao diện :
Đây thực sự chỉ là một cách cụ thể để xây dựng tùy chọn thứ hai sử dụng một lớp khác làm triển khai. Tùy chọn này thậm chí có thể hạn chế hơn nữa những người có quyền truy cập để kích hoạt sự kiện vì không ai khác có thể tạo một thể hiện của lớp. Tuy nhiên, tôi nghĩ yếu tố quan trọng hơn giữa hai lựa chọn là số lượng công việc đang được thực hiện. Xóa một vài trường văn bản là một hoạt động đơn giản và dễ dàng. Tuy nhiên, quá trình lưu for có thể liên quan đến một số nhiệm vụ là bạn đang xác thực đầu vào (mà bạn nên làm), ghi vào cơ sở dữ liệu để lưu trữ các giá trị và kích hoạt một số hành động lưu bài đăng. Trong trường hợp này, tạo một lớp riêng với tệp riêng sẽ cung cấp sự phân chia rõ ràng hơn giữa biểu mẫu đầu vào và xử lý dữ liệu. Điều này lần lượt giữ mã biểu mẫu thay vì một tệp lớn hơn với nhiều lớp bên trong được lồng bên trong.


Wow, cảm ơn phản hồi của bạn. Về mặt chi phí, việc tạo ra nhiều lớp người nghe có tốn kém hơn không?
slayton

@slayton: Sẽ luôn có chi phí cho dù bạn làm gì. Câu hỏi nên là "Sự khác biệt có quan trọng với bạn không?" Có nhiều trọng lượng để tạo ra nhiều đối tượng hơn, nhưng thời gian thực hiện sẽ lâu hơn nếu người nghe của bạn phải đi qua một danh sách các nguồn để quyết định những gì thực sự phải làm. Nếu việc sử dụng bộ nhớ và hiệu suất là quan trọng đối với bạn, thì bạn nên lập hồ sơ mã và quyết định điều gì là tốt nhất dựa trên yêu cầu của bạn. Tuy nhiên, tôi sẽ nghi ngờ rằng đây sẽ là cổ chai của mã của bạn. Cho đến khi được hiển thị khác, làm cho quyết định của bạn làm cho mã rõ ràng hơn và được tổ chức tốt hơn.
unolysampler

3

Cách thứ tư là đặt thuộc tính onClick trong bố cục:

<Button android:onClick="clickHandlerForButtonX" />

có phương thức tương ứng này trong Hoạt động:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

Thật thú vị, tôi không biết bạn có thể làm điều đó. Mặc dù đây có vẻ là một cơ chế cụ thể của Android để xử lý các nhấp chuột.
slayton

Tôi thường đi với "Giao diện thực hiện lớp hoạt động", theo cách đó, bạn có tất cả các công cụ liên quan đến nhấp chuột ở cùng một nơi.
orjan

phương pháp đặc biệt này không hoạt động với các mảnh.
Rahul Tiwari
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.