2012-03-14 24 views
5

Tôi là một người mới bắt đầu cho Android, trong khi thiết onclick người nghe vào một nút, những gì hiện tham số truyền vào có nghĩa là:Android setOnclicklistener tham số

btn1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    });  

như vậy, "mới OnClickListener()" nó sẽ chuyển qua một phương pháp thì đó không phải là một vật thể sao?
nếu nó không phải là một đối tượng; thì làm cách nào để chúng tôi sử dụng từ khóa "mới"?
lý do tại sao "onclick()" được gọi trực tiếp mà không sử dụng từ khóa "này" hoặc tên lớp của nó.

+0

Hi ODO chúng tôi đang đi qua một đối tượng như một argument.Basically chúng tôi đang tạo ra lớp bên trong mà ghi đè phương pháp onClick. –

Trả lời

0

OnClickListener()

là một giao diện. Với từ khóa mới, bạn khai báo một đối tượng mới của một lớp bên trong vô danh sẽ thực hiện giao diện. Đó là câu hỏi cơ sở cho

java

hơn android. Bạn nên cân nhắc đọc về

giao diện java

12

OnClickListener là một interface và bằng cách sử dụng new OnClickListener() như tham số cho btn1.setOnClickListener nó thực sự đang tạo ra một Anonymous Inner Class mà thực hiện OnClickListener . Và phương pháp onClick phải cần được khai báo vì nó là phương thức trừu tượng bên trong lớp giao diện đó. Bất kỳ mã nào bạn viết bên trong onClick sẽ được thực hiện khi nhấn nút.


Cập nhật

để làm điều đó bằng Anonymous lớp bên trong một đối tượng:

//declaring OnClickListener as an object 
private OnClickListener btnClick = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
}; 

//passing listener object to button 
btn1.setOnClickListener(btnClick); 

để làm điều đó mà không sử dụng Anonymous lớp:

public class YourActivity extends Activity implements OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Button b = new Button(this); 

     //setting listener to button 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
} 

Sự khác biệt duy giữa các phương pháp này là, nếu nút của bạn có chứa nhấp chuột mã sự kiện được cho là hợp lệ/có sẵn cho nút đó, sau đó bạn có thể sử dụng lớp bên trong như bạn đang làm trong mã của bạn (vì nó dễ làm ngay). Tuy nhiên nếu có nhiều nút yêu cầu cùng một mã được thực hiện trên sự kiện onClick thì bạn có thể định nghĩa người nghe làm đối tượng và chuyển nó cho họ.

+0

có cách nào để thêm người nghe onlcick ngoài các lớp ẩn danh không? tôi có thể khai báo nó bên ngoài chữ ký phương thức và chỉ truyền đối tượng? cho tôi mẫu mã xin vui lòng. –

+0

vâng, chắc chắn. kiểm tra câu trả lời cập nhật của tôi – waqaslam

+0

Tuy nhiên, một lớp bên trong vô danh :) –

0

OnClickListener là một giao diện. Nó có nghĩa là nếu bạn thiết lập nó inline bạn đã tạo ra một lớp vô danh mà chỉ là implimenting giao diện bên trong phương thức set.

Nếu bạn muốn tạo lớp học OnClick.Bạn sẽ làm một cái gì đó như thế này:

class OnButtonClick implements OnClickListener{ 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
    } 

} 

Sau đó, bạn có thể sử dụng:

OnButtonClick obc = new OnButtonClick(); 
textView.setOnClickListener(obc); 

Đây là Java hơn android, Tìm hiểu về giao diện và lớp Inner

1

Interface định nghĩa cho một callback được được gọi khi một lần xem được nhấp.

void void onClick (Xem v) Được gọi khi lượt xem được nhấp.

2

Để khởi tạo đối tượng của giao diện hoặc lớp trừu tượng, bạn cần ghi đè tất cả các phương thức không được triển khai của nó (phương pháp trừu tượng). Bạn có thể ghi đè lên các phương thức trừu tượng bằng cách sử dụng lớp ẩn danh hoặc định nghĩa một lớp mở rộng lớp trừu tượng/thực hiện giao diện và ghi đè lên các phương thức trừu tượng. Tuy nhiên, để làm cho nó rõ ràng hơn, bạn có thể làm điều đó như thế này:

OnClickListener l = new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
}); 
btn1.setOnClickListener(l); 

và sử dụng một lớp riêng biệt, bạn có thể làm điều đó như thế này:

btn1.setOnClickListener(new MyOwnListener()); 

// ... 

public class MyOwnListener implements OnClickListener 
{ 
    // ... 

    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
} 
Các vấn đề liên quan