2011-10-24 30 views
20

Tôi bắt đầu chương trình một chút trong android, Tôi có 3 nút trong một hoạt động.Phương thức OnClick cho Android cho nhiều nút?

tôi thấy một số mã ví dụ mà gán cùng OnClick kiện cho tất cả các nút (ngay cả khi họ thực hiện hành động hoàn toàn khác nhau) và trong phương pháp Switch(id) case trường hợp ...

cách tiếp cận tốt hơn là gì? một phương pháp onClick và chuyển đổi hoặc nhiều phương pháp, một phương pháp cho mỗi nút?

Cảm ơn.

Trả lời

19

Nếu bạn muốn giảm bớt các dòng mã sau đó sử dụng View's OnClick() with switch statement và nếu bạn muốn xử lý độc lập toàn bộ nhấp chuột (để dễ dàng hiểu và duy trì code) sau đó sử dụng riêng biệt tất cả button's onClick().

Cập nhật:

Nếu bạn đã khai báo các nút trong tệp xml bố cục hoạt động của mình, chứ không phải viết thuộc tính android:onClick="" với cùng tên phương thức cho tất cả các nút và triển khai phương thức đó trong hoạt động của bạn. Bây giờ bạn có một phương pháp cho tất cả các nút và trong phương pháp đó phân biệt các nút với id.

Ví dụ:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" > 
    <Button android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 1" /> 
    <Button android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 2" /> 
    <Button android:id="@+id/button3" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 3" /> 
</LinearLayout> 

Bây giờ trong hoạt động của bạn thực hiện buttonOnClick như,

public void buttonOnClick(View view) 
{ 
switch(view.getId()) 
{ 
    case R.id.button1: 
    // Code for button 1 click 
    break; 

    case R.id.button2: 
    // Code for button 2 click 
    break; 

    case R.id.button3: 
    // Code for button 3 click 
    break; 
} 
} 

Hoặc bạn có thể áp dụng tương tự trường hợp chuyển đổi cho các nút bấm tự động được thêm vào trong hoạt động của bạn, như thay vì buttonOnClick bạn phải sử dụng đã triển khaionClick của OnClickListerner.

6
this.btnAddFriedtoFacebook = (Button) this.findViewById(R.id.btnAddFriedtoFacebook); 
this.btnAddFriedtoFacebook.setOnClickListener(this.backButtonClickListener); 

public OnClickListener backButtonClickListener = new OnClickListener() 
{ 
public void onClick(final View view) 
{ 
    if (view == MatchInfoActivity.this.btnBack) 
    { 
     MatchInfoActivity.this.finish(); 
    } 
    if(view == MatchInfoActivity.this.btnAddFried){ 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     MatchInfoActivity.this.startActivity(i); 
    } 
    if(view == MatchInfoActivity.this.btnAddBuddy){ 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     MatchInfoActivity.this.startActivity(i); 
    } 
} 
}; 

Đây là cách hay.

+0

Anh ấy không hỏi cách xử lý các nhấp chuột, chỉ kỹ thuật nào trong số hai kỹ thuật mà anh ấy đã biết là được ưu tiên. – goto10

2

Tôi nghĩ rằng việc đăng ký onClick trong xml (bố cục) là cách tiếp cận tốt hơn.

EDIT:

Tìm thấy chủ đề liên quan:

  1. Best practice for defining button events in android
  2. best practices for handling UI events
+0

Tôi nghĩ có một chút lạ lùng khi đặt nó trong XML vì đó là hành vi giao diện người dùng duy nhất hoạt động theo cách này. Có thể nếu nó giống iOS hơn, nơi bạn thiết lập tất cả các trình xử lý giao diện người dùng của mình từ trình thiết kế giao diện người dùng, điều đó sẽ có ý nghĩa hơn. – goto10

34

Sử dụng theo cách này:

@Override 
public void onCreate(Bundle savedInstanceState) { 
     button1.setOnClickListener(onClickListener); 
     button2.setOnClickListener(onClickListener); 
     button3.setOnClickListener(onClickListener); 
} 

private OnClickListener onClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case R.id.button1: 
        //DO something 
      break; 
      case R.id.button2: 
        //DO something 
      break; 
      case R.id.button3: 
        //DO something 
      break; 
     } 

    } 
}; 
+0

lý do tại sao bạn sử dụng final? –

+0

Đó là phương pháp trừu tượng. Tôi nghĩ chúng ta không cần phải quan tâm. –

+0

Làm thế nào chúng ta có thể làm điều đó nếu chúng ta có các nút trong các hoạt động khác nhau? – Bran

0

Đã đăng ký sự kiện onClick trong bố cục XML và sau đó xử lý nó trong mã. Đây là cách tôi sẽ làm điều đó:

<Button 
android:id="@+id/btplus" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Click me" 
android:onClick="onBtnClicked"> 

Phương pháp trong.lớp

public void onBtnClicked(View v) { 
     switch (v.getId()) { 
     case R.id.btplus: 
      Toast.makeText(getApplicationContext(), "Plus is clicked" + "+", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.btminu: 
      Toast.makeText(getApplicationContext(),"Minus is clicked" + "-", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
     } 
    } 
0

Thêm vào câu trả lời @Nguyen.

findViewById(R.id.buttonOne).setOnClickListener(buttonClickListener); 
.... .... .... .... 
findViewById(R.id.buttonN).setOnClickListener(buttonClickListener); 

private View.OnClickListener buttonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.buttonOne: 
       // do something 
       break; 
      .... .... .... .... 
      case R.id.buttonN: 
       // do something 
       break; 
     } 
    } 
}; 

Điều này có thể hữu ích, nếu bạn không muốn khởi chạy biến nút, nhưng muốn theo dõi sự kiện nhấp nút. Cảm ơn!

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