2012-01-23 39 views
57

thể trùng lặp:
Difference between OnClick() event and OnClickListener?Nút Bấm Listeners trong Android

Tôi bán mới để phát triển Android và khi tôi lần đầu tiên bắt đầu tôi cố gắng tránh sử dụng cách bố trí xml bằng bất kỳ có nghĩa là cần thiết để một số dự án trước đó của tôi liên quan đến các nút tạo rõ ràng một OnClickListener và triển khai nó như một lớp bên trong vô danh. Chẳng hạn như -

final Button button = new Button(this); 
button.setText("Click to change second line of text"); 

OnClickListener buttonListener = new View.OnClickListener() { 
    boolean clicked = false; 
    int numClicks = 0; 

    @Override 
    public void onClick(View v) { 
     if(numClicks > 5) { 
      button.setText("STOP IT"); 
     } 
     numClicks++; 
     if(clicked == false){ 
      clicked = true; 
      tv2.setText("Text Changed on Button Click");  
     } 
     else 
     { 
      clicked = false; 
      tv2.setText("Click again"); 
     }  
    } 
}; 
button.setOnClickListener(buttonListener); 

Nhưng như tôi đã quen thuộc hơn với android, tôi bắt đầu hiểu được giá trị của việc bố trí xml và các nút thực hiện như thế này

<Button 
    android:id="@+id/button1" 
    android:layout_height = "wrap_content" 
    android:layout_width ="wrap_content" 
    android:text = "lets do this" 
    android:onClick = "DoIt" 
    /> 

Trong xml bố trí, nơi DoIt được định nghĩa trong java.

Câu hỏi của tôi là, 2 phương pháp này có hoạt động giống nhau không? Có một OnClickListener được định nghĩa bởi trình biên dịch ở đâu đó đằng sau hậu trường không? Có bất kỳ tính năng nào bạn giao dịch bằng cách này hay cách khác không?

+1

[Đây là một cuộc thảo luận hữu ích ] (http://stackoverflow.com/a/7453469/1154026) Tôi nghĩ rằng sẽ giúp với câu hỏi của bạn. – VicVu

+0

Bạn có thể đặt trình nghe nhấp chuột theo ba cách, 1. thiết lập trình nghe nhấp chuột riêng lẻ cho từng phần tử. 2. Triển khai OnClickListener trong hoạt động. 3. tạo ra một chức năng riêng biệt để xử lý nút bấm và thêm chức năng này trong xml. bạn có thể tìm thấy những ví dụ này tại đây http://wiki.workassis.com/android-three-ways-to-set-click-listener/ –

Trả lời

139

Đây là chính xác như nhau. đã được thêm vào trong API cấp 4 để làm cho nó dễ dàng hơn, nhiều trang web giống như Javascript hơn và thúc đẩy mọi thứ từ XML. Nội dung bên trong sẽ thêm một nút OnClickListener vào Nút gọi phương thức DoIt của bạn.

Đây là những gì sử dụng một android:onClick="DoIt" làm nội bộ:

Button button= (Button) findViewById(R.id.buttonId); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DoIt(v); 
    } 
}); 

Điều duy nhất bạn đánh đổi bằng cách sử dụng , như thường lệ với cấu hình XML, là nó trở nên khó khăn hơn một chút để thêm nội dung động (programatically , bạn có thể quyết định thêm một người nghe hoặc người khác tùy thuộc vào các biến của bạn). Nhưng điều này có thể dễ dàng bị đánh bại bằng cách thêm thử nghiệm của bạn trong phương thức DoIt.

+0

Câu trả lời hay. Cảm ơn bạn đã giải thích những gì Android thực hiện đằng sau hậu trường khi thiết lập gọi lại thông qua XML. –

+5

Cần lưu ý rằng 'android: onClick' sẽ không hoạt động với phương thức được xác định trong một đoạn. Giải pháp tốt nhất imho là chỉ đính kèm các thính giả vào trong đoạn. Để biết thêm thông tin: http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments – adamdport

+0

Cảm ơn bạn đã giải thích ngắn gọn. – JoeYo

0

Mặc dù bạn xác định android: onClick = "DoIt" trong XML, bạn cần đảm bảo hoạt động của bạn (hoặc xem ngữ cảnh) có phương thức công khai được xác định với cùng tên và tham số Xem dưới dạng. Android kết nối các định nghĩa của bạn với triển khai này trong hoạt động. Cuối cùng, việc thực hiện sẽ có cùng mã mà bạn đã viết trong lớp bên trong vô danh. Vì vậy, trong các từ đơn giản thay vì có lớp bên trong và phần đính kèm của người nghe trong hoạt động, bạn sẽ đơn giản có một phương thức công khai với mã thực hiện.

+1

Tôi có nó thực hiện trong java của tôi, tôi chỉ không đăng nó bởi vì phương pháp không liên quan đến câu hỏi. – SmashCode

2

sử dụng XML, bạn cần tự mình đặt trình nghe onclick. Đầu tiên có lớp học của bạn implements OnClickListener sau đó thêm các biến Button button1; sau đó thêm này để bạn onCreate()

button1 = (Button) findViewById(R.id.button1); 
button1.setOnClickListener(this); 

khi bạn thực hiện OnClickListener bạn cần phải thêm các phương pháp di truyền onClick() nơi bạn sẽ xử lý nhấp chuột của bạn

Các vấn đề liên quan