2009-10-01 2 views
40

의 내가이있는 LinearLayout에 몇 가지 버튼이 있다고 가정 해 봅시다, 그 중 2는 다음과 같습니다Android : setOnClickListener/onClick과 함께 SWITCH 문을 두 개 이상의 버튼에 사용 하시겠습니까?

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

내가 둘 다에 setOnClickListener() 등록 :

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

을 나는 스위치를 구별하기 위해 어떻게해야합니까 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

... – Hubert

답변

103

사용 :

당신은 같은 것을 사용해야합니다이 (인해 http://tools.android.com/tips/non-constant-fields에) 안드로이드 라이브러리 프로젝트에서 작동하지 않습니다
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; 
    } 
} 

참고 : 또 다른 옵션은

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

작품을 단지 위대한! 나는 나 자신이 이것을 어떻게 시도하지 않았는지 궁금하다. 고마워요. H. – Hubert

+0

이 이클립스는 "케이스 표현식은 상수 표현이어야합니다"라고 말합니다. – dell116

+1

@ dell116 케이스에서 사용하는 변수가 상수가 아니기 때문에 그 사실을 알 수 있습니다. 예를 들어 "final int x = 5;'"와 같이 불평하는 변수를 선언하거나, x가 변수에 도달하기 전에 수정되어야한다면 변수 y를 "final int y = x; 케이스. – aggregate1166877

7

을 setOnClickListener()에서 매개 변수로 새 OnClickListener를 추가하고 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

나는 항상 지저분하다는 것을 발견했습니다. –

+0

나는 그것을 좋아하지만, 개인적인 취향의 문제라고 생각합니다. – aspartame

+0

아니요, 사용하지 마십시오. 왜냐하면 언제든지 setOnclickListener (new OnclickLisener() {...}); 안드로이드는 새로운 스레드를 만들어 동작을 잡습니다. 10 버튼이 있다면 상상해보십시오. 10 개의 스레드가 있으면 좋지 않습니다. – Cocorico

1

아직 세 번째 옵션이 있습니다. onCreate() 메서드에서 가지고있는 모든 버튼 뷰를 찾아 클래스 데이터 멤버로 저장합니다. 그런 다음 if-else 문의 그룹을 계단식으로 배열하여 어느 것을 찾을 수 있습니다. 다소 복잡하지만 버튼의 ID를 모르는 경우에는 필수적입니다 (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();    
    } 

이 기술에 대한 또 다른 좋은 점은 유연하고 빠르게 (ID를 구문 분석하지 않아도 됨) 있다는 것입니다. 나쁜 점은 위젯을 메모리에 보관해야한다는 것입니다.

어떤 방법이 더 좋지 않은지 확인하십시오. 한 OnCreate 방법 내부

+1

스위치 명령문에서도 가능합니까? – winklerrr

+0

@winklerrr - 아니요. Java의 switch 문에는 변수가 아닌 상수가 필요합니다. 그래서이 예제는 덜 우아한 일련의 if-else 문을 사용합니다. –

+0

그리고 메소드를 다음과 같이 선언했다면 : onClick (final View v)'? – winklerrr

2

: -

{ 

    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

'OnClickListener' 인터페이스를 구현하는 경우 활동을'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

코드를 올바르게 형식화하십시오. –

관련 문제