마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼을 누르면 라디오 버튼 조건에 따라 다른 실행을 하고 싶습니다.

0 추천
Button buttonHSok = (Button) hardStudy.findViewById(R.id.h_add);	
       buttonHSok.setOnClickListener(new OnClickListener() {	
    	   public void onClick(View v) {
                	RadioGroup rg=(RadioGroup)findViewById(R.id.h_radio);	
                    rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    	@Override
                    	public void onCheckedChanged(RadioGroup group, int checkedId) {
                    		
                    		// TODO Auto-generated method stub
                    		switch (checkedId){
                    		case R.id.h_radio1:
                    		   Toast.makeText(Main.this, "111", Toast.LENGTH_SHORT).show();
                    			break;
                    		case R.id.h_radio2:	
                    		   Toast.makeText(Main.this, "222", Toast.LENGTH_SHORT).show();
                    		}
                    	}
                    });
 
에서 처음 라디오 버튼 선택(h_radio1)후 ㅡ> 버튼(h_add)을 누르면 해당 Toast메세지(111)이 뜨게 하고 싶은데
버튼(h_add)을 누르면 앱이 실행 종료가 됩니다..ㅠㅠ
어떤 부분을 더 공부해야 할까요?ㅠㅠ
익명사용자 님이 2014년 6월 5일 질문

2개의 답변

0 추천
 
채택된 답변

layout 구성을 어떻게 해 놓으셨는지는 몰라도 죽는다면,  RadioGroup rg=(RadioGroup)findViewById(R.id.h_radio);   에서 rg의 값이 null이 나와 nullPointer Exception이 되었을 듯 한데요...

그리고 OnClickListener 눌린 이후에야 setOnCheckedChangeListener 가 등록이 될 텐데. 라디오 버튼이 선택된 처음 이벤트는 올리가 없습니다.

layout 구성이 어떻게 되었는지는 모르겠는데.. 대충 아래와 제 예상이 맞다면, 아래와 같이 코드를 구성해주시면 될 듯 하네요.

private int selectedID = -1; // 함수 외부에 선언 해주세요.

 
Button buttonHSok = (Button) hardStudy.findViewById(R.id.h_add);    
       buttonHSok.setOnClickListener(new OnClickListener() 
{
   public void onClick(View v) 
   {
      switch (selectedID)
      {
       case R.id.h_radio1:
                Toast.makeText(Main.this, "111", Toast.LENGTH_SHORT).show();
        break;
       case R.id.h_radio2: 
                Toast.makeText(Main.this, "222", Toast.LENGTH_SHORT).show();
      }
}
});
 
RadioGroup rg=(RadioGroup)hardStudy.findViewById(R.id.h_radio);   
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
         // TODO Auto-generated method stub
selectedID = checkedId;}
}); 

 

 

 

사악미소 (65,330 포인트) 님이 2014년 6월 5일 답변
감사합니다! 드디어 해결 했네요..ㅠㅠ더 공부 하겠습니다!! 감사합니다!!
0 추천

Listener는 뷰(버튼이나 라디오 버튼 등)에 등록하면 해당 리스너로 설정(교체)됩니다.

즉, 동일한 리스너를 여러번 등록할 필요는 없으며 제시하신 코드와 같이

버튼이 눌릴 때마다 새로운 리스너 객체를 생성해서(내용은 똑같은) 등록을 하는 것은

낭비이며 필요없는 일입니다.

 

코드를 정확히 해석하자면 지금 제시하신 코드는

"버튼이 눌릴 때마다 rg라는 라디오 버튼 객체를 하나 만들고

그 라디오 그룹에 OnCheckChangedListener를 등록하는"

코드입니다. 버튼이 눌리면 토스트 메시지가 뜨는게 아니라요.

그냥 누를때마다 저것만 계속하는 코드입니다.

더구나 그 라디오 그룹인 rg에 대한 변수조차 없어서 참조조차 할 수 없죠.

(라디오 버튼들의 상태를 바꾸거나 현재 선택되어있는지 검사하는 것조차 불가능하다는 겁니다.)

OnClick 메소드만 빠져나가면 rg는 사라지거든요.

 

가장 쉬운 방법은 라디오 버튼 객체를 만들어서 rb라고 이름을 붙이고,

Button buttonHSok = (Button) hardStudy.findViewById(R.id.h_add);
 
buttonHSok.setOnClickListener(new OnClickListener() {    
     public void onClick(View v) {
         if(rb.isSelected())
             Toast.makeText(Main.this, "111", Toast.LENGTH_SHORT).show();
         else
             Toast.makeText(Main.this, "222", Toast.LENGTH_SHORT).show();
     }
});

이렇게 코딩하시는겁니다.

 

buttonHSok 버튼의 OnClickListener에서 라디오 버튼 rb가 현재 선택되어있는지 검사한 후,

선택되어있거나 그렇지 않은 경우에 따라 토스트 메시지를 띄우는거죠.

 

 

그리고 가장 중요한건데, API를 잘 보시기 바랍니다.

Jinthree (8,980 포인트) 님이 2014년 6월 5일 답변
Jinthree님이 2014년 6월 5일 수정
감사합니다!! 공부를 더 해야겠습니다! 큰 도움 됬습니다! 감사합니다!!
...