PROGRAMMING WORKSHOP

Android|
간단한계산기|EditText

이번에는 텍스트를 입력하는 TextBox(Java에서는 EditText 라고 한다)를
사용하여 간단한 계산기를 만들어 보자
아래의 그림과 같이 두개의 EditText 콘트롤(View)로



하나는 몸무게 Kg값(76.6 Kg)을 받고 다른 하나는 신장 M 값(1.78 M)을 받는다
그리고 버튼을 크릭하면 BMI값을 계산하여 비만상태를 나타내는
간단한 계산기이다

자판은 안드로이드에서 제공하는 자판이 EditText를 선택하면
자동으로 아래쪽에 팝업한다
별도의 어떤 코딩도 필요없다

uno-weekly에서 VB.net부분에서 이것과 똑같은 것을 Winodow프로그래밍으로
하고 있으니 같이 보시면 비교가 되고 상승효과가 있을 것이다
위의 앱에서 개체가 무엇이 필요한가
라벨개체(TextView개체)가 3개 필요할 것이다
정보를 입력할 텍스트박스개체(EditText개체)가 또 2개 필요할 것이고
그리고 명령버튼개체(Button개체)가 하나 필요 할 것이고
아래와 같이 개체를 만들자


	//Activity개체에서 OnClickListener개체를 사용하겠다고(implements)선언해주고
	//onClick메소드(이벤트프로시져)를 만들어지게 한다

public class MainActivity extends Activity implements OnClickListener  {
	
	//텍스트박스(EditText) 2개 변수를 전역변수로 선언하고
	//결과를 나타낼 라벨(TextView) 1 개변수를 전역변수로 선언하고
	
	EditText weight_ ;
	EditText height_ ;
	TextView result ;
	
    @SuppressLint("NewApi") @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
	
	//Activity개체(화면)가 생성되는 Activity의 onCreate 메소드에서 
	//필요한 개체를 생성한다
	
        
    }
	
	//버튼 개체를 만들면서 아래의 메소드(이벤트프로시져)가
	//호출되게 한다
	
	
	public void onClick(View v) {
	
	//버튼을 크릭하면 이곳에서 
	//계산 결과를 만들어서 내보내는 역할을 한다
		 

	}
	
}

Activity 개체의 OnCreate메소드에서 아래와 같이 개체를 만든다

	
		//Activity개체의 메인화면이 되는 LinearLayout개체생성
		//자식개체들의 정렬방향은 수직방향으로 (Vertical)
	
		LinearLayout layout= new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
	
		//LayoutParams개체를 두개의 매개변수를 사용하여 만든다
		//이것은 LinerLayout개체의 자식개체들의 크기를 결정하는 속성을
		//전달하는 역할을 한다, WRAP_CONTENT는 예를 들어 버튼의 크기를
		//버튼안에 들어있는 콘텐츠 즉 캡션(Text)문자열의 크기에 맞게
		//조정한다는 속성이다
	       
        
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( 
        		 LinearLayout.LayoutParams.WRAP_CONTENT, 
        		 LinearLayout.LayoutParams.WRAP_CONTENT
        );
    
		//최상위 화면속에 또 다른 LinearLayout개체를 몇개 만들기 위하여
		//개체변수를 선언, 개체생성 내부자식들의 정렬방향은 수평 HORIZONTAL
	   
        LinearLayout rowLayout =null;
		rowLayout = new LinearLayout(this);
        rowLayout.setOrientation(LinearLayout.HORIZONTAL);
	
		//TextView(VB.Net에서는 라벨개체에 해당)를 만들고
		//EditText(VB.Net에서는 텍스트박스에 해당)을 만들고
		//EditText개체의 setHint는 사용자가 입력하기전에 흐릿하게 
		//어떤 형식으로 입력하라는 Hint를 주는 문자열을 설정한것
		//TextView의 폭은 120으로 하고
		//이렇게 만든 개체를 위에서 만든 LinearLayout개체의 자식으로 입적시킨다 addView(..)
		//자식개체를 모두 addView한후 LinearLayout개체를 최상위 화면 LinearLayout개체에
		//마찬가지 요령으로 addView 하여 자식으로 입적시킨다
	 
        TextView weight = new TextView(this);
        weight_ = new EditText(this);
        weight_.setHint("0.0 Kg");
        weight.setText("몸무게");
        weight.setWidth(120);
        rowLayout.addView(weight);
        rowLayout.addView(weight_);
        layout.addView(rowLayout);
    
		//아래는 위에서 체중부분처리한 것과 똑같은 짓을 반복했다
		//여러번 반복한다면 순환문을 쓰는 것이 좋겠지만..여기에서는 2번이니까
		//미련하게 반복하여 작성된 셈이다
	    
        rowLayout = new LinearLayout(this);
        rowLayout.setOrientation(LinearLayout.HORIZONTAL);
        TextView height = new TextView(this);
        height_ = new EditText(this);
        height_.setHint("0.0 M");
        height.setText("신장");
        height.setWidth(120);
        rowLayout.addView(height);
        rowLayout.addView(height_);
        layout.addView(rowLayout);
     
		//이제 버튼개체를 만들고 
		//중요한 것은 onClick메소드를 사용하겠다는 명령이 중요..
		//setText하여 캡션명을 작성하고
		//또 희안한 이름 setGravity라고 하는 것은 VB에서 Alignment를 설정하는 것과 같다
		//setGravity(Gravity.RIGHT)라고 한것은 오른쪽으로 줄맞춤하기
	   
        Button button = new Button(this);
        button.setOnClickListener(this);
        button.setText("Calculate BMI");
        button.setGravity(Gravity.RIGHT);
    
		//결과를 나타내는 TextView개체를 하나 더 만들고
	   
        result = new TextView(this);
	
		//버튼과 결과를 나타내는 라벨은 최상위 LinearLayout개체의
		//자식으로 처리 이때 P라는 매개변수는 맨 위에서 만든 LayoutParams 개체
	 
        layout.addView(button,p);
        layout.addView(result,p);
	
		//준비작업 다 끝났다..이제 비행기가 뜨면 된다
		//최종 최상위화면개체 LinearLayout을 Activity개체의 ContentView로 
		//사용한다는 명령으로 끝이다
	 
        setContentView(layout);

이제 앱이 뜨고 사용자가 체중넣고, 신장넣고 버튼을 크릭하면
계산하여 결과를 위에서 만든 Result라는 변수가 갖고 있는 TextView개체에
setText 해주면 된다
맨위에서 전역변수로 선언한 EditText 2개와 TextView개체1개를
바로 버튼을 크릭할때 접근하려고 외부의 변수로 한 것이다

복잡해 보이지만 차근차근 보시면 별 것 아니라는 것..잊지 마시고..
포기하지 마시고!!!
프로그래밍은 차근차근 논리적인데 사람의 마음이 급해서 헷갈리는 것이다
차분하게..명상하듯이 즐기시면 어느 날 갑자기 모든 것을 갖게 된다

이제 버튼을 크릭하면 실행되는 계산엔진을 보자
Java의 문법을 숙달시키는 부분이 되는 셈이다

public void onClick(View v) {
	
		//계산에 사용할 3개의 변수
		//하나는 체중, 다른 하나는 신장, 그리고 결과값을 담을 변수
		//프로그래밍언어가 다를때 가장 중요한 것은 정보의 타입!!
		//Float타입은 VBA에서 정수가 아닌 소숫점 값을 담는 
		//Double이나 Single타입의 변수정도 된다
		//그리고 최종결과를 담을 String타입 변수 하나 더!!
	 
	Float weightValue ;
	Float heightValue ;
	Float bmi ;
	String state ;
	
		//만약 체중을 담고 있는 EditText개체의 값이 빈값이면 아웃
		//VB.Net이나 Java나 모두 Return으로 아웃이 된다 Exit Sub, Exit Loop등이 Return하나도 
		//모두 아웃된다
	 
	if(weight_.getText().length()==0){
		Toast.makeText(this, "몸무게를 KG 단위로 입력하세요",Toast.LENGTH_LONG).show();
		return;
	}
	
		//Try~Catch문은 VBA에서
		//On Error Resume Next
		//...어떤 프로세스..
		//If Err.Number<>0 Then
		//  에러 처리
		//End If 
		//와 같은 구문을 처리하는 똑똑한 에러처리방식이다 이것은 
		//VB.net이나 Java나 모두 똑같은 방식이다
		//Try브록에서 어떤 과정을 진행하다가 에러가 나면
		//Catch문에 걸린다..Catch문이 갖고 있는 e라는 매개변수는
		//VBA에서 Err개체와 같은 것이다..하나도 낯섫은 것이 없고 더 진보된 방식인것이다
		//VB.Net이나 Java나 모두 Return으로 아웃이 된다 
		//Exit Sub, Exit Loop등이 Return하나도 
		//모두 아웃된다
	 
	try{
		//Float weightValue = Float.parseFloat(weight_.getText().toString());
		weightValue = Float.valueOf(weight_.getText().toString());
	}catch(RuntimeException e){
		Toast.makeText(this, "몸무게를 숫자로 입력하세요",Toast.LENGTH_LONG).show();
		return;
	}
	
		//신장 부분은 위의 내용과 똑같다
	 
	if(height_.getText().length()==0){
		Toast.makeText(this, "신장을 M 단위로 입력하세요",Toast.LENGTH_LONG).show();
		return;
	}
	try{
		//Float heightValue = Float.parseFloat(height_.getText().toString());
		heightValue = Float.valueOf(height_.getText().toString());
	}catch(RuntimeException e){
		Toast.makeText(this, "신장을 숫자로 입력하세요",Toast.LENGTH_LONG).show();
		return;
	}
	
		//위에서 검문에 성공한 체중값과 신장값으로 BMI..체지방지수를 계산하고
		//결과를 만드는 과정이다
		//Swith문을 사용해도 되고, If문을 사용해도 되고
		//논리연산자에서 VBA의 AND는 자바에서는 && 로 표현하고
		//                     OR는 쟈바에서 || 로 표현한다
	 
	bmi =  weightValue/(heightValue*heightValue);
	if(bmi < 18.5){state = "Under Weight|저체중";}
	else if(bmi >= 18.5 && bmi <= 24.99){state = "Normal|정상";}
	else if(bmi >= 25 && bmi <= 29.99){state = "Over Weight|과체중";}
	else if(bmi >= 30 && bmi <= 34.99){state = "Obesity - Level 1|비만";}
	else if(bmi >= 35 && bmi <= 39.99){state = "Obesity - Level 2|고도비만";}
	else {state = "Morbid Obesity|병적비만";}
	
	
		//Float타입 변수를 문자열로 바꿀때 항상 String개체의 valueOf(숫자값)으로
		//문자열로 만든다는 점..실은 아래의 경우는 String.valueOf(bmi)를 그냥
		//+bmi를 해도 된다..문자열에 합친다는 계산명령이 있으므로 알아서 변환시키지만
		//여기에서는 학습을 위하여 String.valueOf(bmi)를 명시적으로표현했다
		//즉 state = "BMI = " + bmi+"\n"+ state; 해도 된다
		//"\n" 는 VB의 vbNewLine과 같은 역활이다  
		//setTypeface는 VBA에서 Font설정하는 것에 해당된다
		//폰에서 사용하는 폰트는 PC와 같이 다양하지않으니 상수에서 선택하면 된다
		//최종적으로 문자열을 TextView개체(result라는 변수)에 setText해주면 끝!!!
	 
	state = "BMI = " + String.valueOf(bmi)+"\n"+ state;
	result.setTypeface(Typeface.DEFAULT_BOLD,style.TextAppearance_Holo_Large);
	result.setText(state);
}

차근차근 보시면 아하..VBA에서 이렇게 처리한 것을 Java에서는
이렇게 처리하는 구나..이런 변화는 VB.Net과 거의 같다고 보면 된다
그러니 VBA에서 Java를 즐긴다는 것은 곧바도 VB.Net과 연결된다고
보시면 굉장히 지름길로 프로그래밍개발의 세상으로 가는 것이다

***[LOG-IN]***