PROGRAMMING WORKSHOP

Android| instanceof 키워드의 활용, RadioButton, RadioGroup

안드로이드를 개발할때
XML로 할까...Java코드로 할까
XML로 할때는 역시 Java코드의 힘을 빌려야한다
단지 인터페이스에 생명없는 모양만 나타날뿐이다
살아있는 엔진을 넣기 위하여서는 역시 Java코드가 들어가야 한다
XML로 콘트롤등을 마우스로 그려 넣고, XML코드를 좀 만지고
하다 보면 버전의 차이등에서 많은 번거로움이 있다
그래서 그냥 순수한 Java코드로만 하려고 하니까..
여러분들도 그렇게 습관을 들이는 것이 좋지 않을 것 같다

버튼을 크릭하여 무언가 일을 시키려면 OnClickListener 개체의 힘을 빌려야 한다
그런데 버튼 마다 이것을 일일이 그려 넣으려면 중복되고 귀찮다
그리고 또 버튼이 아닌 RadionButton을 크릭하여도 OnClickListener 개체의 힘을
빌려야 한다, 또 다른 OnClickListener 개체를 사용하여야 한다
번거롭다
이것을 하나의 것으로 통합시켜보도록하자
이것은 이전 페이지에서도 하였었지만, 다른 방법으로 하는 것이니까..
instanceof 라고 하는 아주 유용한 것을 하나 챙기도록 한다
이것은 Java에서 개체를 확인하는데서 아주 유용하다

그림과 같이 인터페이스를 XML이 아닌 Java코드로 만든다



public class UNOLessonSearchActivity extends Activity {

	Button btnRed;
	Button btnYellow;
	Button btnBlue;
	LinearLayout ll;
	RadioGroup radioGroup;
	RadioButton radioButtonRed;
	RadioButton radioButtonBlue;
	RadioButton radioButtonYellow;
	TextView textView;

	@SuppressWarnings("deprecation")
	@SuppressLint("NewApi")
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        

        ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        ll.setPadding(30, 30, 30, 30);
        btnRed = new Button(this);
        btnRed.setText("RED");
	btnRed.setOnClickListener(redButtonClick);
        
        btnBlue = new Button(this);
        btnBlue.setText("BLUE");
        btnBlue.setOnClickListener(redButtonClick);
        
        btnYellow = new Button(this);
        btnYellow.setText("YELLOW");
	btnYellow.setOnClickListener(redButtonClick);
        
        radioGroup = new RadioGroup(this);
        radioButtonRed = new RadioButton(this);
        radioButtonRed.setTextColor(Color.WHITE);
        radioButtonBlue = new RadioButton(this);
        radioButtonYellow = new RadioButton(this);
        radioButtonRed.setText("RED");
        radioButtonBlue.setText("BLUE");
        radioButtonBlue.setTextColor(Color.WHITE);
        radioButtonYellow.setText("YELLOW");
        radioButtonYellow.setTextColor(Color.WHITE);
        
        radioButtonRed.setOnClickListener(redButtonClick);
        radioButtonBlue.setOnClickListener(redButtonClick);
        radioButtonYellow.setOnClickListener(redButtonClick);
        
        textView = new TextView(this);
        textView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
        textView.setBackgroundColor(Color.BLACK);
        
        radioGroup.addView(radioButtonRed);
        radioGroup.addView(radioButtonBlue);
        radioGroup.addView(radioButtonYellow);
        radioGroup.setOrientation(RadioGroup.HORIZONTAL);
        radioGroup.setGravity(Gravity.CENTER_HORIZONTAL);
        
        ll.addView(btnRed);
        ll.addView(btnBlue);
        ll.addView(btnYellow);
        ll.addView(radioGroup);
        ll.addView(textView);
        
        ll.setBackgroundColor(Color.GRAY);
        setContentView(ll);

    }
	
    private OnClickListener redButtonClick = new OnClickListener(){
    	public void onClick(View v) {
    		String sCol ;
    		if(v instanceof Button){
    			Button temp = (Button)v;
    			sCol=temp.getText().toString();
    					
    		}else{
    			RadioButton temp = (RadioButton)v;
    			sCol=temp.getText().toString();
    		}
    		Toast.makeText(UNOLessonSearchActivity.this, "You Clicked " + sCol , Toast.LENGTH_LONG).show();
		textView.setBackgroundColor((sCol=="RED")?Color.RED:(sCol=="BLUE")?Color.BLUE:Color.YELLOW);
		}
    	
    }; 
    

    
}

RadioButton(VBA에서 옵션버튼에 해당한다)에서도 redButtonClick라는 OnClickListener개체를
참조하고 Button에서도 redButtonClick을 같이 사용하고 있다는 것이 중요하다
하나의 이벤트프로시져( 이벤트 핸들러라고도 한다)를 사용하는 것이다
아무튼 Java에서나 VB.Net에서는 이벤트도 하나의 개체를 만들어서 처리한다는 점!!
조금더 이해를 돕자
아래의 그림과 같이 OnClickListener에서 Listener라는 단어를 생각하면
기억하기 쉽다, 내가 크릭을 하였는데 누가 나의 크릭소리를 듣고
처리하도록 할 것인가!!!에서 처리할 개체를 매개변수로 지정한 것이다
이것을 VB.Net에서는 Event Handler라고 한다, 역시 Java에서도 마찬가지로
Event Handler라고 생각하면 된다
OnClickListener를 좀더 풀어서 이해하면
On Click 크릭할때 Listener 소리를 들어주고 처리할 개체인 것이다



이것을 다른 페이지에서는 이렇게 처리하기도 했었다



이것은 개체를 변수에 담아서 처리한 것이 아니고
호출하면서 매개변수에 그냥 개체를 만들어 버린 것이다
이것은 버튼이면 버튼, 옵션버튼이면 옵션버튼 해당 개체 혼자서
밖에 사용하지 못하니, 경제적이지 못한 것이다
원리는 마찬가지인것이다, 개체의 의미를 잘 알면 이렇게 , 저렇게
응용을 할수 있는 것이고, 그런 개체의 의미는 Java나 VB.Net이나
모두 마찬가지인 것이다
첫번째가 하나의 OnClickListener개체를 만들어서 여러개의 개체에서
사용하는 방법인 것이였다

실은 또 하나가 기억날 것이다

radioButtonRed.setOnClickListener(this);

라고 하여 사용하였었었다
이것은 누구에게 크릭소리를 들으라고 했냐하면 this 즉 현재의 Activity개체에서
듣고 처리를 하라고 하였던 것이다
이것은 앞의 것을 참조하시면 될 것이다 Implements라는 키워드가 나와는 것을
기억하시면 좋겠다

지금 기억못하셔도 좋다, 그냥 페이지를 지나다보면, 아하!! 감잡는다!!

OnClickListener개체가 갖고 있는 OnClick 메소드에서
if(v instanceof Button){ ... }
문은 v가 Button 개체인가????라고 검문을 하는 것이다
VBA의 UserForm의 TextBox,ComboBox등의 개체는 모두 Control개체인 것처럼
안드로이드에서는 View라는 개체하나로 처리하니, 매개변수로 전달받은 View가
Button개체인지 혹은 RadioButton개체인지 알아 보는 것이다
이것이 있기때문에 다른 개체를 하나의 OnClickListener개체를 사용하게 된셈이다
VBA에서 TypeName("개체타입명") 과 같은 역활도 보시면 된다
이때 VBA에서는 문자열정보를 받지만 Java의 instanceof 라고하는 것은 그냥 개체자체를
비교한다는 점이 좀더 편리하다
instanceof 라고 하는 것은 Instance Of [개체타입] 이라고 보시면 된다
instance는 크래스모듈에서 개체를 생성한 상태의 오브젝트를 이야기 한다

textView.setBackgroundColor((sCol=="RED")?Color.RED:(sCol=="BLUE")?Color.BLUE:Color.YELLOW)

TextView개체의 배경색을 설정하는데 이상한 표현식이 있다
이것은 VBA의 IIF 함수로 생각하시면 된다
이것은 JavaScript에서도 사용하고 Java에서도 사용하는 IIF함수에 해당하는 표현식이다
아래와 같다...

("A"=="AA")?"둘":"하나"

라는 표현은

IIF("A"="AA","둘","하나")

와 같은 것이다

Java언어는 중요한 언어들 중에 가장 나중에 만들어진 언어이다
C++은 좋은데 복잡하고 ,그래서 이전에 만들어진 언어들의
불편함을 가장 많이 배제하고 편리함은 선택한 그런 언어이다
그래서 하면 할수록 매력이 있는 언어라고 할 수 있다
그러니, Android를 핑계삼아 Java언어를 익히고 있는 것이라고 보시면 된다
마치 엑셀을 활용하면서 VBA를 익숙하게 하고 VB.Net까지 확장시키듯이

그리고 XML인터페이스로 콘트롤들을 심고 Java코딩을 하는 것 보다는
순수하게 Java코딩을 통하여 인터페이스에 콘트롤을 심어 나가는 것이
어느 면에서 훨씬 속도가 빠르다고 할 수 있다
그리고 정확한 사이즈와 위치등을 유지하면서

VBA의 UserForm에서도 디자인 타임에 콘트롤을 마우스로 선택하여
그리고, 사이즈 잡고 위치 잡고, 수전증있으면 떨려서 겹쳐지고
그런 것 보다는 그냥 VBA코딩만으로 프로그래밍적으로 만드는 것이
조금만 숙달하면 훨씬 빠르다는 점!!

위의 코드에서 버튼을 하나 만든다고 하면
XML Layout 페이지에서 도구상자에서 마우스로 선택하여 그리고, 위치 잡고
크기 정하고, 폰트정하고 등등을 모두 xml문으로 하던가, 속성창에서
지정을 하거나 하여야 하지만 순수하게 Java언어로 버튼을 코딩한다면..

Button btnRed = New Button(this);
btnRed.setText("RED");
btnRed.setOnClickListener(redButtonClick);
ll.addView(btnRed);

처음에는 폰트속성을 설정하려면 뭔메소드를 썼지??
위치를 잡으려면 어떤 메소드를 섰지??
그런 것이 헷갈리지만 , 조금 개체가 갖고 있는 메소드와 상수들에
익숙해지면 줄줄줄, 코딩이 될 수 있다
Java는 속성이 없다
속성이 있기는 있는데 접근하는 것이 아래와 같이 Text속성을 알고 싶을때는
getText()이고, 속성을 설정할때는 setText("...") 이다
set과 get!!!

***[LOG-IN]***