2009-10-01 61 views
40

Hãy nói rằng tôi có một vài nút trong một LinearLayout, 2 trong số đó là:Android: Sử dụng câu lệnh SWITCH với setOnClickListener/onClick cho hơn 1 nút?

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit)); 

tôi đăng ký setOnClickListener() trên cả trong số họ:

mycards_button.setOnClickListener(this); 
exit_button.setOnClickListener(this); 

Làm thế nào để làm cho một công tắc để phân biệt giữa hai nút trong Onclick?

public void onClick(View v) { 
    switch(?????){ 
    case ???: 
     /** Start a new Activity MyCards.java */ 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
     break; 
    case ???: 
     /** AlerDialog when click on Exit */ 
     MyAlertDialog(); 
     break; 
} 
+0

Tôi không muốn sử dụng thực đơn cho điều này, như tôi có thể đặt các nút bất cứ nơi nào tôi muốn trên Layout ... – Hubert

Trả lời

103

Sử dụng:

public void onClick(View v) { 

    switch(v.getId()){ 

     case R.id.Button_MyCards: /** Start a new Activity MyCards.java */ 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
     break; 

     case R.id.Button_Exit: /** AlerDialog when click on Exit */ 
     MyAlertDialog(); 
     break; 
    } 
} 

Lưu ý rằng điều này sẽ không làm việc trong dự án thư viện Android (do http://tools.android.com/tips/non-constant-fields), nơi bạn sẽ cần phải sử dụng một cái gì đó như:

int id = view.getId(); 
if (id == R.id.Button_MyCards) { 
    action1(); 
} else if (id == R.id.Button_Exit) { 
    action2(); 
} 
+0

tác phẩm chỉ là tuyệt vời! Tôi tự hỏi làm thế nào tôi đã không cố gắng điều này một mình! Cảm ơn rất nhiều anh chàng. H. – Hubert

+0

Khi tôi làm nhật thực này cho tôi biết: "biểu thức trường hợp phải là cụm từ không đổi" – dell116

+1

@ dell116 Nó nói với bạn rằng vì biến mà bạn đang sử dụng trong trường hợp không phải là hằng số. Khai báo biến mà nó phàn nàn là cuối cùng, ví dụ "' final int x = 5; '", hoặc khai báo một biến y "' final int y = x; '" ngay trước khi switch nếu x phải được sửa đổi trước khi đến trường hợp. – aggregate1166877

7

lựa chọn khác là để thêm một OnClickListener mới làm thông số trong setOnClickListener() và ghi đè phương thức onClick():

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit)); 

// Add onClickListener to mycards_button 
mycards_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
     // Start new activity 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
    } 
}); 

// Add onClickListener to exit_button 
exit_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
     // Display alertDialog 
     MyAlertDialog(); 
    } 
}); 
+5

Tôi luôn thấy rằng thực sự lộn xộn –

+0

Tôi thích nó, nhưng tôi đoán nó khá là vấn đề sở thích cá nhân. – aspartame

+0

Không, không sử dụng. Bởi vì bất kỳ lúc nào bạn sử dụng setOnclickListener (new OnclickLisener() {...}); Android tạo ra một chủ đề mới để nắm bắt hành động. Vì vậy, hãy tưởng tượng nếu bạn có 10 nút, bạn có 10 chủ đề, điều đó không tốt. – Cocorico

1

Và chưa có tùy chọn thứ ba. Trong phương thức onCreate() của bạn, hãy tìm tất cả các dạng xem nút mà bạn có và lưu chúng thành các thành viên dữ liệu lớp. Sau đó bạn có thể xếp một nhóm các câu lệnh if-else để tìm ra cái nào. Đó là loại lộn xộn, nhưng nó là phải nếu bạn không biết ID của các nút (có thể phức tạp nếu bạn đang tạo ra các nút trong mã java).

@Override 
public void onClick(View v) { 
    if (v == m_myCards) { 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
    } 
    else if (v == m_exit) { 
     MyAlertDialog(); 
    } 
    else if (v == m_back) { 
     finish();    
    } 

Một điều thú vị khác về kỹ thuật này là linh hoạt và nhanh chóng (không phải phân tích ID). Điều xấu là bạn cần phải giữ các widget trong bộ nhớ.

Không biết phương pháp nào tốt hơn.

+1

Điều đó cũng có thể xảy ra với câu lệnh chuyển đổi không? – winklerrr

+0

@winklerrr - Không, chuyển đổi câu lệnh trong java yêu cầu hằng số, không phải biến. Đó là lý do tại sao ví dụ này sử dụng hàng loạt câu lệnh if-else ít thanh lịch hơn. –

+0

Và nếu bạn khai báo phương thức như thế này: 'onClick (final View v)'? – winklerrr

2

bên trong phương pháp OnCreate: -

{ 

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

    b = (Button)findViewById(R.id.button2); 
    b.setOnClickListener((View.OnClickListener)this); 
} 

@Override 
public void OnClick(View v){ 

    switch(v.getId()){ 
     case R.id.button1: 
      //whatever 
      break; 

     case R.id.button2: 
      //whatever 
      break; 
} 
+0

Bạn không cần phải truyền hoạt động của mình sang 'OnClickListener' nếu nó triển khai giao diện' OnClickListener'. – winklerrr

5
public class MainActivity extends Activity 
     implements View.OnClickListener { 
    private Button btnForward, btnBackword, btnPause, btnPlay; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initControl(); 
    } 

    private void initControl() { 
     btnForward = (Button) findViewById(R.id.btnForward); 
     btnBackword = (Button) findViewById(R.id.btnBackword); 
     btnPause = (Button) findViewById(R.id.btnPause); 
     btnPlay = (Button) findViewById(R.id.btnPlay); 
     btnForward.setOnClickListener(this); 
     btnBackword.setOnClickListener(this); 
     btnPause.setOnClickListener(this); 
     btnPlay.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.btnForward: 
       break; 
      case R.id.btnBackword: 
       break; 
      case R.id.btnPause: 
       break; 
      case R.id.btnPlay: 
       break; 
     } 
    } 
} 
+0

định dạng mã đúng cách –

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