글 읽기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

기저귀 발진이란 기저귀가 닿는 부분에 붉게 발진이 생기고, 짓무르며, 심할 경우 피부가 벗겨지고 하얗게 일어나기도 하는 접촉성 피부염을 말합니다. 기저귀 발진이라고 이름이 붙은 이유는 기저귀 그 자체보다는 기저귀가 닿는 부위에 나타나는 증상이기 때문입니다. 아기의 피부는 연약하고 부드러워서 조그마한 외부자극에도 쉽게 발병이 됩니다. 실제로 기저귀를 착용하는 아기에게 가장 흔한 질병입니다.


발생원인 및 증상

  - 축축하고 젖은 기저귀를 오랜 시간 착용했을 때

  - 통풍 저하, 설사, 미열 혹은 감기 등으로 컨디션이 나쁠 때

  - 이유식이나 새로운 음식을 시작할 때

  - 항생제 복용이나 변이 묽을 때

  - 피부 타입의 개인 차에 따라 발생


주의사항

  - 아기에게 이유식을 할 때 과일주스나 과즙에 의해 대변이 산성이 되면서 아기 피부에 자극을 줄 수 있습니다. 대변의 자극이나 소변의 암모니아 성분으로 피부 산도와 습도가 올라가면 이로 인해 피부 손상이 시작되어 발진이 더욱 심해질 수 있으니 주의해야 합니다.


대처 방법

  - 기저귀를 자주 확인하고 갈아 주며, 발진 부위의 피부를 항상 깨끗하고 건조하게 해주세요.

  - 기저귀를 갈아 줄 때는 반드시 물티슈로 닦거나 미지근한 물로 깨끗이 씻어 청결을 유지해 주세요.

  - 아기 피부에 심한 자극을 주지 마세요.

  - 증상이 호전되지 않을 때에는 전문가와 상의하고, 처방 받은 연고를 발라 주세요.

  - 연고는 아기 엉덩이에 잘 말린 후 발라 주세요.

  - 파우더는 증상이 호전된 다음이나 발진이 없을 때 예방 차원에서 발라 주는 것이 좋아요.


Posted by 정윤문경아빠

글 읽기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

이유식 시작시기
  - 모유 수유아 : 6개월(4~6개월)
  - 분유 수유아 : 4 ~ 6개월
  - 아토피 있는 아기 : 만 6개월 전에 안됨
  - 부모들이 음식 먹는 모습을 보고 아이가 침을 흘리거나 입맛을 다시면 이유식 시작할 시기임

기본 원칙
  - 만들어 먹이자
  - 돌까지는 간을 하지 말자
  - 4개월 전에 이유식 하지 말자
  - 이유식은 숟가락으로 먹이자
  - 모유 수유아는 특히 철분보충에 유의
  - 만 6개월부터는 컵으로 먹이는 연습 시작

  - 7개월 이전에 고기 시작

  - 흘리는 것을 겁내지 말자

  - 8개월에는 스스로 손으로 먹게 연습


모유 수유아

  - 만 6개월에 철분이 많은 고기같은 이유식을 먹이지 않으면 철분제 보충

  - 1mg/kg/day : 훼럼키드 1방울/2.5kg/day


이유식이 늦었을 때

  - 1 ~ 1.5달 안에 따라잡게 진행을 빠르게 할 것


덩어리를 먹이기

  - 7개월 이전에 완전히 가는 것은 졸업


알레르기가 있는 아이 이유식 주의 사항

  - 이유식은 6개월 이전 곤란

  - 이유식 만들어 먹일 것

  - 새우 생선(멸치 흰살생선 포함) 조개 세돌전 곤란

  - 두부 요구르트 치즈 밀가루 돌까지 곤란

  - 계란은 두돌까지 곤란

  - 딸기 토마토 오렌지 귤 돌전에 곤란


이유식 횟수

  - 횟수는 4~5개월 : 1회

  - 6 ~ 9개월 : 1 ~ 3회. 잘 먹으면 3회를 시도해서 가능하면 3회

  - 9 ~ 11개월 : 3회


이유식 시작 시간

  - 처음 1번 먹일 때는 오전 10시쯤

  - 2번 먹일때는 오전 10시 오후 6시

  - 3번 먹일때는 오전 10시 오후 2시 오후 6시


이유식의 굳기

  - 4 ~ 5개월 : 묽은 스프정도

  - 6개월부터 : 마요네즈나 잼처럼 - 으깨서

  - 7 ~ 10개월 : 다져서(이때부터는 갈지 말고 주어야 합니다)

  - 7개월 : 혀로 부술 수 있을 정도

  - 9개월 : 잇몸으로 부술 수 있을 정도


Finger food

  - 8개월에는 손으로 먹을 음식을 주어 스스로 먹게 하자


음식별 시작 나이

  - 쌀죽 : 4 ~ 6개월

  - 현미 : 6개월

  - 과일 : 4개월, 딸기와 토마토는 돌

  - 과일주스 : 6개월, 오렌지와 귤 6 ~9개월

  - 계란 : 노른자 6 ~ 12개월, 흰자 돌때부터, 완숙이어야함!, 알레르기 있으면 2돌

  - 야채 : 4 ~ 6개월, 시금치 당근 6개월

  - 생선 : 6 ~ 12개월, 알레르기 2 ~ 3돌

  - 조개 새우 랍스터 : 2 ~ 3돌

  - 소고기 닭고기 : 6개월

  - 두부 : 7개월부터, 알레르기 있으면 1돌

  - 요구르트 : 8개월, 알레르기 있으면 1돌

  - 초기에 한꺼번에 여러가지 곡식을 섞어 먹이지 말 것. 5가지 식품군을 우선 확보한 후에 곡식 종류를 섞는 것이 좋다. 선식은 안됨


이유식 초기(4 ~ 6개월)

  - 최소 만 4개월 이후 시작

  - 한번에 한가지 음식을 첨가 : 3일 정도의 간격을 둔다. 알레르기 있으면 1주 간격

  - 처음에는 쌀죽부터

  - 한숟가락부터 시작해서 서서히 늘인다.

  - 만 6개월부터 고기 첨가가 중요. 육수도 먹이지만 고기를 꼭 먹여야 함.

  - 6개월에 시작한 경우 식품군 확보가 우선 : 쌀죽 고기 야채 과일 순으로 첨가 가능.

  - 한번 섞어서 문제가 없는 것은 계속 첨가 가능.

  - 이유식이 늦은 경우 한두달안에 따라잡아야 한다.

  - 6개월에 이유식은 한번에 60cc 정도를 하루에 2 ~ 3번 정도 먹일 수도 있다.

  - 밤에 깬다고 젖부터 물리지 말자. 스스로 다시 잠들게 기회를 준다.


이유식 중기(7 ~ 8개월)

  - 양을 늘이고 덩어리를 주어 음식의 질감을 익히는 것이 중요

  - 고기를 준다.

  - 이제는 완전히 갈지 말고 작아도 덩어리를 먹는 연습을 시작한다.

  - 숟가락으로 스스로 먹게 쥐여준다.

  - 반드시 한곳에 앉아서 먹게 한다.

  - 흘린다고 야단치지 말고 흘린다고 음식을 빼앗지 말자.

  - 분유를 컵으로 시작한다.

  - 간을 해서는 안된다.

  - 수면 교육을 하면 밤에는 수유하지 않고 잘 수 있다.


이유식 후기(9 ~ 11개월)

  - 어른 먹는 음식으로 넘어가는 시기

  - 덩어리가 많은 음식을 먹인다.

  - 밥, 고기, 야채, 과일, 모유나 분유등 5가지 식품군을 골고루 먹여야 한다.

  - 모유 수유아는 특히 고기를 매일 먹여야 한다. 돌에 하루 고기 40 ~ 50g정도

  - 숟가락으로 혼자 먹게 한다.

  - 흘려도 손으로 집어 먹게 한다.

  - 밤에 수유를 하지 않게 한다.

  - 돌아다니며 먹지 않게 한다.

  - 소금을 제외한 양념은 너무 자극적이지 않으면 첨가 할 수 있다.

  - 김치나 된장같이 짠음식은 피한다.

Posted by 정윤문경아빠

구글 플레이스토어에서 앱을 다운받으면 자동으로 바탕화면에 아이콘이 생성이 됩니다.


하지만 Tstore 라던가 몇몇 스토어에서는 앱을 설치해도 바탕화면에 아이콘이 생성이 안됩니다.


아래는 바탕화면에 아이콘을 생성하는 코드입니다. 그대로 하시면 됩니다.



MainActivity.java 

public class MainActivity extends Activity{

    protected void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);


        SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);

        pref.getString("check", "");

        if(pref.getString("check", "").isEmpty()){

Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);

shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER);

shortcutIntent.setClassName(this, getClass().getName());

shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| 

Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

Intent intent = new Intent();

intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);

intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getResources().getString(R.string.app_name));

intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,

Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher));

intent.putExtra("duplicate", false);

intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

        

sendBroadcast(intent);

        }

SharedPreferences.Editor editor = pref.edit();

        editor.putString("check", "exist");

        editor.commit();

    }

}




AndroidManifest.xml 

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />  // 추가해줍니다.


정말 간단하죠?


이제 앱을 설치하면 자동으로 바탕화면에 아이콘이 추가되고 아이콘이 추가되어 있는 상태라면 설치를 안합니다.


즉 앱이 실행이 될때마다 아이콘 유무를 체크하고 아이콘이 없으면 아이콘을 설치합니다.



Posted by 정윤문경아빠

앱 사용하다가 종료를 할때 뒤로가기 버튼을 한번 더 터치하면 앱을 종료한다는거 한번 이상은 보셨을거라 생각을 합니다.


코드를 보도록 하겠습니다.



BackPressCloseHandler.java

public class BackPressCloseHandler extends Activity {

private long backKeyPressedTime = 0;

private Toast toast;

private Activity activity;

public BackPressCloseHandler(MainActivity context) {

this.activity = context;

        }

        public void onBackPressed() {

         if (System.currentTimeMillis() > backKeyPressedTime + 2000) {

         backKeyPressedTime = System.currentTimeMillis();

        showGuide();

         return;

         }

         if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {

         activity.finish();

         toast.cancel();

         }

        }

        

        

        private void showGuide() {

         toast = Toast.makeText(activity, "뒤로 버튼을 한번 더 터치하시면 종료됩니다.",

         Toast.LENGTH_SHORT);

         toast.show();

        }

}




MainActivity.java 

private BackPressCloseHandler backPressCloseHandler;


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    backPressCloseHandler = new BackPressCloseHandler(this);

}


public void onBackPressed() {

    backPressCloseHandler.onBackPressed();

}


크게 어려운건 없지 싶습니다.


궁금하신거는 댓글 달아주세요


Posted by 정윤문경아빠


Thread 는 잘 사용하면 참으로 좋은 유틸리티이지만 잘못 사용하면 에러를 뚜구구궁 띄웁니다.

Thread는 역할을 다하면 자동으로 종료가 되지만 간혹 자동으로 종료가 안되는 경우도 있기 때문에 Thread 종료 시점에는 강제로 종료를 시켜주는것이 좋습니다.

그리고 안드로이드경우는 Thread가 동작중일때 휴대폰에 전화가 온다거나 바깥화면으로 나가게 되어도 Thread는 계속 동작하고 있기 때문에 반드시 onPause 또는 onDestory 메서드에 Thread를 강제종료 또는 멈춤 기능 코드를 넣어야 합니다.

아래는 제가 만든 서바이벌야구게임 앱에서의 일부 코드입니다.


int count;  // 카운트다운 시간 선언

ProgressBar prog= null;  // 프로그래스바 선언

Timer timer = null;  // 타이머 선언

TimerTask timerTask = null;  // TimerTask 선언


//프로그래스bar를 초기화하는 함수

public void initProg(){

prog.setMax(countdown);  // 프로그래스바 시간 최대값 설정

prog.setProgress(countdown); // 현재 프로그래스바 시간 설정  

}

 

public void startTimerThread(){

timerTask = new TimerTask(){ //timerTask는 timer가 일할 내용을 기록하는 객체    

@Override

public void run() {

decreaseBar(); //timer가 동작할 내용을 갖는 함수 호출

            }


};

timer = new Timer(); //timer생성

timer.schedule(timerTask, 0,1000); //timerTask라는 일을 갖는 timer를 0초딜레이로 1000ms마다 실행 즉,                             1000 = 1초

}


public void decreaseBar(){

runOnUiThread( //progressBar는 ui에 해당하므로 runOnUiThread로 컨트롤해야한다

new Runnable() { //thread구동과 마찬가지로 Runnable을 써주고


@Override

public void run() { //run을 해준다. 그러나 일반 thread처럼 .start()를 해줄 필요는 없다 

countdown = prog.getProgress();

if(countdown > 0){

countdown = countdown - 1;

}else if(countdown == 0){

timer.cancel();

Thread.interrupted();  // Thread 강제 종료

}

prog.setProgress(countdown);

}

}

);



Posted by 정윤문경아빠

일반적인 프로그래밍 언어에서 화면에 컨트롤을 배치할 때 제공하는 정렬 기능을 안드로이드에서도 그대로 사용할 수 있습니다. 이 때 사용하는 용어가 안드로이드에서는 조금 다른 것을 볼 수 있는데 일반적인 정렬(align)은 순서대로 놓여 지다는 의미로 이해할 수 있으며, 안드로이드에서 사용하는 배치(gravity)는 어느 쪽에 무게 중심을 놓은 것인가의 의미로 이해할 수 있습니다. 하지만 똑같이 생각해도 상관없습니다. 레이아웃에서 정렬 기능이 필요한 경우는 다음과 같이 두 가지로 나눌 수 있습니다.



정렬 속성 

설명 

 layout_gravity

부모 컨테이너의 여유 공간에 뷰가 모두 채워지지 않아 여유 공간 안에서 뷰를 정렬할 때 

 gravity

뷰에서 화면에 표시하는 내용물을 정렬할 때(텍스트뷰의 경우, 내용물은 글자가 되고 이미지뷰의 경우 내용물은 이미지가 됨) 


먼저 부모 컨테이너의 여유 공간에 뷰가 모두 채워지지 않을 경우에 사용하는 layout_gravity는 뷰의 layout_width 나 layout_height 속성을 wrap_content로 할 경우에 같이 사용할 수 있습니다. 예를 들어, 세로 방향으로 설정된 리니어 레이아웃에 추가된 버튼들의 layout_width 속성을 wrap_content로 하게 되면 각각의 버튼들은 한 줄에 한 개씩 추가되면서 글자가 보이는 만큼의 크기로만 보이므로 나머지 가로 공간은 여유 공간으로 남게 됩니다. 안드로이드는 이렇게 여유 공간이 있을 경우 디폴트로 왼쪽 정렬을 하게되는데 layout_gravity 속성을 직접 설정하게 되면 중앙 또는 오른쪽 정렬을 할 수 있습니다.


예제를 보도록 하겠습니다.



gravity.xml 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity" >


    <Button

        android:id="@+id/button01"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="left"

        android:text="버튼1" />

    

    <Button

        android:id="@+id/button02"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:text="버튼2" />

    

    <Button

        android:id="@+id/button03"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="right"

        android:text="버튼3" />


</LinearLayout>



실행을 해보면 결과는 다음과 같습니다.





뷰에 보이는 내용물을 정렬하는 경우에는 gravity 속성을 사용합니다. gravity 속성은 뷰가 화면에서 차지하는 영역이 충분히 큰 경우에 생기는 여유 공간 안에서 어떻게 정렬할 것인지를 결정합니다. gravity가 적용될 수 있는 대표적인 내용물로는 텍스트뷰 안에 표시되는 텍스트나 이미지뷰에 표시되는 이미지를 들 수 있습니다. gravity 속성에 넣을 수 있는 값들은 layout_gravity와 같으며, 필요한 경우에는 '|' 연산자를 이용해 여러 개의 값을 같이 설정할 수도 있습니다. 이 때 주의할 점은 '|' 연산자 양쪽에 공백이 없어야 한다는 점입니다.


다음은 하나의 텍스트뷰를 화면 전체에 채운 후 그 안에 표시되는 텍스트를 왼쪽 상단, 중앙, 그리고 오른쪽 하단에 표시할 경우에 사용되는 XML 레이아웃으로 각각 'left|top', 'center', 'right|bottom' 값이 설정되었습니다. 예제를 보도록 하겠습니다.



<TextView

        android:id="@+id/button01"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:gravity="left|top"

        android:text="left|top" /> 

 




 <TextView

        android:id="@+id/button02"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:gravity="center_horizontal|center_vertical"

        android:text="center" />

 





<TextView

        android:id="@+id/button03"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:gravity="right|bottom"

        android:text="right|bottom" /> 

 



gravity 속성으로 지정할 수 있는 값으로는 위와 같이 대표적인 경우 이외에도 여러 가지가 있으며 각각의 값에 대한 설명은 다음과 같습니다.


정렬 속성값 

설 명 

 top

 대상 객체를 위쪽 끝에 배치하기 

 bottom

대상 객체를 아래쪽 끝에 배치하기하기 

 left

대상 객체를 왼쪽 끝에 배치하기 

 right

대상 객체를 오른쪽 끝에 배치하기 

 center_vertical

대상 객체를 수직 방향의 중앙에 배치하기 

 center_horizontal

대상 객체를 수평 방향의 중앙에 배치하기 

 fill_vertical

대상 객체를 수직 방향으로 여유 공간만큼 확대하여 채우기 

 fill_horizontal

대상 객체를 수평 방향으로 여유 공간만큼 확대하여 채우기 

 center

대상 객체를 수직 방향과 수평 방향의 중앙아 배치하기 

 fill

대상 객체를 수직 방향과 수평 방향으로 여유 공간만큼 확대하여 채우기 

 clip_vertical

-대상 객체의 상하 길이가 여유 공간보다 클 경우에 남는 부분을 잘라내기

-top|clip_vertical 로 설정한 경우 아래쪽에 남는 부분 잘라내기

-bottom|clip_vertical 로 설정한 경우 위쪽에 남는 부분 잘라내기

-center_vertical|clip_vertical로 설정한 경우 위쪽과 아래쪽에 남는 부분 잘라내기 

 clip_horizontal

-대상 객체의 좌우 길이가 여유 공간보다 클 경우에 남는 부분을 잘라내기

-right|clip_horizontal 로 설정한 경우 왼쪽에 남는 부분 잘라내기

-left|clip_horizontal 로 설정한 경우 오른쪽에 남는 부분 잘라내기

-center_horizontal|clip_horizontal로 설정한 경우 왼쪽과 오른쪽에 남는 부분 잘라내기 


이것으로 gravity, layout_gravity 설명을 마치도록 하겠습니다.


도움이 되셨다면 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^


Posted by 정윤문경아빠

앞전에는 리니어 레이아웃과 그 안에 들어 있는 세 개 버튼은 XML로 정의한 후 이 XML 리소스 파일의 위치를 액티비티에서 사용된 setContentView() 메소드의 파라미터로 전달하여 화면에 보여주었습니다. 이렇게 화면에 보이는 레이아웃을 XML로 정의하게 되면 나중에 화면 구성을 바꿀 때도 간단하게 XML만 수정하면 되므로 훨씬 이해하기 쉽고 모듈화된 구성이라고 할 수 있습니다. 그러나 종종 코드 상에서 화면을 구성해야 하는 경우가 생기게 됩니다. 예를 들어 사용자가 입력한 데이터, 파일에서 읽어 들인 데이터 또는 네트워킹을 통해 서버에서 받아온 데이터의 유형에 따라 화면의 구성을 바꾸고 싶다면 XML로 정의하는 것보다 자바 코드에서 화면을 구성하는 것이 훨씬더 효율적인 방법입니다. 예제를 보도록 하겠습니다.



MainActivity.java 

package com.example.example;


import android.app.Activity;

import android.os.Bundle;

import android.widget.Button;

import android.widget.LinearLayout;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

                // new 연산자로 리니어 레이아웃 만들고 방향 설정

LinearLayout mainLayout = new LinearLayout(this);   

mainLayout.setOrientation(LinearLayout.VERTICAL);

                 // new 연산자로 레이아웃 안에 추가될 뷰들의 파라미터 생성

LinearLayout.LayoutParams params = 

new LinearLayout.LayoutParams( 

LinearLayout.LayoutParams.MATCH_PARENT, 

LinearLayout.LayoutParams.WRAP_CONTENT);

                // 버튼에 파라미터 설정하고 레이아웃에 추가

Button button01 = new Button(this);

button01.setText("버튼1");

button01.setLayoutParams(params);

mainLayout.addView(button01);

                // 새로 만든 레이아웃을 화면에 설정

setContentView(mainLayout);

}


}



위 코드를 실행을 시키면 다음과 같은 결과가 나오게 됩니다.




프로젝트를 처음 만들었을 때 볼 수 있었던 자바 코드에는 onCreate() 메소드 안에 setContentView() 메소드가 사용되었는데, 그것과 앞에서 살펴본 코드의 다른 점은 setContentView() 메소드 안에 들어가는 파라미터가 R.layout.main과 같이 XML 레이아웃으로 정의된 리소스가 아니라 자바 코드에서 만든 뷰그룹 객체라는 것입니다. 리니어 레이아웃으로 만든 객체를 setContentView() 메소드의 파라미터로 전달하면 리니어 레이아웃 안에 추가된 뷰들을 배치한 화면을 볼 수 있습니다. 안드로이드는 XML 레이아웃에서 정의할 수 있는 대부분의 속성들을 자바 코드에서 객체를 만들거나 객체의 메소드를 호출하여 설정할 수 있도록 지원하는데 리니어 레이아웃의 방향 속성도 마찬가지입니다. new LinearLayout()을 통해 만들어진 리니어 레이아웃 객체에는 setOrientation() 메소드를 사용할 수 있으며, setOrientation(LinearLayout, VERTICAL)과 같이 방향 속성을 정의한 상수를 파라미터로 전달하면 세로 방향 또는 가로 방향으로 뷰를 추가할 수 있습니다. 뷰 객체를 코드에서 만들 때 뷰의 생성자에는 항상 Context 객체가 전달되어야 하는데 액티비티는 컨텍스트(Context)를 상속하므로 액티비티 클래스 안에서는 this를 Context 객체로 사용할 수 있습니다.

자바 코드 상에서 뷰를 만들어 뷰그룹에 추가할 때는 뷰의 배치를 위한 속성을 설정할 수 있는 LayoutParams 객체를 사용합니다. LayoutParams 객체를 새로 만들 경우에는 반드시 뷰가 추가될 영역에 대한 기본 채우기(fill) 속성을 지정해야 하며, 이 때 사용하는 두 가지 상수인 LayoutParams.MATCH_PARENT 와 LayoutParams.WRAP_CONTENT 중 하나가 사용됩니다. 필요한 경우에는 이 두 가지 상수가 아닌 가로와 세로의 크기값을 직접 설정할 수도 있습니다.

뷰그룹에 뷰를 추가하기 위해서는 addView() 메소드를 사용합니다. addView() 메소드에는 추가할 뷰를 파라미터로 전달할 수 있으며, 필요한 경우 부모 컨테이너에서 사용할 레이아웃 파라미터인 LayoutParams 객체를 같이 전달할 수도 있습니다. 앞서 살펴보았던 코드에서는 addView() 메소드를 호출할 때 LayoutParams 객체를 전달하지 않고 버튼 객체의 setLayoutParams() 메소드를 이용해 레이아웃 파라미터를 먼저 설정한 후 addView() 메소드에는 버튼 객체만을 전달하는 방법을 사용했습니다.


다음 포스팅에서는 정렬 방향 설정하는 속성인 gravity에 대해서 알아보도록 하겠습니다.



Posted by 정윤문경아빠

이번에는 리니어 레이아웃에 대해서 알아보겠습니다. 리니어 레이아웃을 보통 가장 많이 사용하며 이 레이아웃으로만으로도 웬만한 앱은 만들 수 있습니다. 리니어 레이아웃에서 빠질 수 없는게 방향 설정하기 입니다. 방향 설정은 리니어 레이아웃에서 꼭 필요한 속성으로, 뷰를 차례대로 추가할 때 가로 방향으로 할 것인지 또는 세로 방향으로 할 것인지를 지정할 수 있습니다. 리니어 레이아웃을 처음 추가했을 때는 기본 값이 세로방향으로 되어 있습니다. 리니어 레이아웃 안에 세 개의 버튼을 순서대로 추가할 경우에 XMl과 자바 코드를 구성하는 방법은 다음과 같습니다.



LinearLayout_vertical.xml 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity" >


    <Button

        android:id="@+id/button01"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="버튼1" />

    

    <Button

        android:id="@+id/button02"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="버튼2" />

    

    <Button

        android:id="@+id/button03"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="버튼3" />


</LinearLayout>



위 속성에 보면 android:orientation="vertical" 보이시나요? vertical 은 수직방향으로 레이아웃을 구성하겠다는 의미입니다.


프로젝트를 실행하면 다음의 그림과 같이 나오게 됩니다.





버튼이 세로(수직) 방향으로 내려오네요. 그렇다면 가로 방향은 어떻게 하면 될까요? 단순히 리니어 레이아웃의 orientation 속성 값만 'horizontal'로 바꾸면 됩니다. 속성을 바꾼 후에 실행해 보면 다음과 같은 화면을 볼 수 있습니다.





그런데 에뮬레이터에 보이는 화면을 보면 세 개의 버튼 중에 첫번째 버튼만 보이는 것을 알 수 있습니다. 왜 그럴까요? 그 이유는 버튼들 가로 속성을 match_parent를 했기 때문입니다. 그러므로 리니어 레이아웃을 세로 방향으로 했을때는 정상적으로 보이지만 가로방향을 했을때에는 버튼 2, 3이 버튼1에 가려지게 되는것입니다. 이걸 정상적으로 볼려면 버튼들 속성을 바꿔주면 됩니다. 버튼들의 각각 속성인 android:layout_width="match_parent" 를 android:layout_width="wrap_content"로 바꿔 보겠습니다.



네...이제 화면이 정확하게 나오네요.


다음 포스팅에서는 리니어 레이아웃을 자바코드로 만드는 방법을 알아보도록 하겠습니다.


Posted by 정윤문경아빠

안녕하세요. 이번에는 안드로이드 레이아웃에 대해서 알아보겠습니다.


안드로이드에서 제공하는 기본 레이아웃은 다음과 같이 크게 다섯 가지로 나눌 수 있습니다.



레이아웃 이름 

설 명 

 리니어 레이아웃(LinearLayout)

- 박스(Box) 모델

- 사각형 영역들을 이용해 화면을 구성하는 방법

- 표준 자바의 BoxLayout과 유사 

 상대 레이아웃(RelativeLayout)

- 규칙(Rule) 기반 모델

- 부모 컨테이너나 다른 뷰와의 상대적 위치를 이용해 화면을 구성하는 방법 

 프레임 레이아웃(FrameLayout)

- 기본 단위 모델

- 하나의 뷰만 보여주는 방법

- 가장 단순하지만 여러 개의 뷰를 추가하는 경우 중첩시킬 수 있으므로 뷰를 중첩한 후 각 뷰를 전환하여 보여주는 방식으로 사용할 때 유용함 

 테이블 레이아웃(TableLayout)

- 격자(Grid) 모델

- 격자 모양의 배열을 이용하여 화면을 구성하는 방법

- HTML 에서 많이 사용하는 정렬 방식과 유사하여 실용적임 

 스크롤 뷰(ScrollView)

- 스크롤이 가능한 컨테이너

- 뷰 또는 뷰그룹이 들어갈 수 있으며 화면 영역을 넘어갈때 스크롤 기능 제공


추가로 절대 레이아웃(AbsoluteLayout) 이라는것이 있기는 한데 안드로이드 단말은 해상도나 화면 크기가 모두 달라 절대 좌표를 사용하는 경우에는 단말마다 다른 해상도를 맞추기 어렵기 때문에 더이상 지원하지 않게 되었습니다. 그냥 예전에 단말의 종류가 몇개 없을때 잠깐 사용된 적이 있다는것 정도로만 아시면 되겠습니다.


안드로이드에서 기본적으로 제공하는 레이아웃들을 사용할 때는 항상 android:layout_width와 android:layout_height 속성이 들어가야 합니다. 그 외의 다른 속성들도 필요 없으면 넣지 않을 수 있지만 위의 두 가지 속성을 넣지 않으면 오류가 발생하게 됩니다. 


다음 포스팅에서는 리니어 레이아웃에 대해서 알아보도록 하겠습니다.


Posted by 정윤문경아빠
IT 프로그래밍/JSP2014. 2. 1. 16:35

page 디렉티브의 contentType 속성은 JSP 페이지가 생성할 문서의 타입을 지정합니다. contentType 속성의 값은 다음과 같이 구성됩니다.



TYPE


또는


TYPE; charset=캐릭터 셋 


TYPE은 생성할 응답 문서의 MIME 타입을 입력합니다. JSP에서 주로 사용되는 MIME 타입으로는 "text/html", "text/xml", "text/plain"이 있습니다. 아래는 HTML 문서를 생성하는 경우 contentType 속성의 설정 예 입니다.



<%@ page contentType="text/html" %> 


contentType 속성을 설정하지 않을 경우 기본값은 "text/html" 입니다. 그리고 '; charset=캐릭터 셋' 부분은 생략이 가능합니다. 캐릭터 셋 부분을 생략할 경우 기본 캐릭터 셋인 ISO-8859-1을 사용하게 됩니다. 국내에서는 주로 한글로 구성된 HTML 문서를 생성하는 JSP 페이지를 작성하게 되는데, 한글로 구성된 HTML 문서를 생성할 때에는 다음과 같이 euc-kr 캐릭터 셋을 사용하게 됩니다. 참고로 캐릭터 셋을 입력할 때에는 대소문자를 구분하지 않습니다.



<%@ page contentType="text/html; charset=euc-kr" %>


또는


<%@ page contentType="text/html; charset=EUC-KR" %> 


UTF-8 캐릭터 셋을 이용하는 XML 문서를 생성하고 싶은 경우에는 다음과 같이 contentType 속성에서 "text/xml" MIME 타입을 사용하고 charset의 값으로 UTF-8 을 지정하면 됩니다.



<%@ page contentType="text/xml; charset=utf-8" %> 


캐릭터 셋을 올바르게 입력하지 않으면 응답 결과에서 글자가 올바르게 출력되지 않게됩니다. 예를 보도록 하겠습니다.



<%@ page contentType="text/html; charset=iso-8859-1" %>

<%@ page import="java.util.Date" %>

<%

    Date now = new Date();

%>

<html>

<head><title>현재 시간</title></head>

<body>

현재 시각:

<%= now %>

</body>

</html> 


실행을 해보시면 위 예제에서 '현재 시각' 이라는 부분이 글자가 제대로 표현이 안되는것을 확인 할 수 있습니다.


그리고 마우스 오른쪽 버튼을 클릭하시면 [인코딩] 이 보이는데 인코딩 들어가시면 서유럽어(ISO) 가 선택되어 있는것을 볼 수 있습니다. 그래서 '현재 시각' 이라는 한글이 제대로 표현이 안되는것 입니다.


한글로 제대로 표현을 할려면 위 예제에서 charset=iso-8859-1 을 charset=euc-kr로 변경해주시면 한글이 올바르게 나오는것을 확인할 수 있습니다.


다음 포스팅은 import에 대해서 알아보도록 하겠습니다.


Posted by 정윤문경아빠