반응형

 이전 포스트의 내용을 완료하고 나면 여러분은 하나의 텍스트필드(EditText) 와 하나의 버튼을 가지고 있는 액티비티(한 화면)를 보여주는 앱이 있습니다. 이번 시간에, 여러분은 사용자가 Send 버튼을 클릭했을 때 새로운 액티비티를 실행하도록 하기 위해 MyActivity 에 몇가지 코드를 추가할 것입니다. 

 

Send 버튼에 응답하기

-----------------------

 안드로이드 스튜디오에서, res/layout  디렉토리의 activity_my.xml 파일을 작성합니다.

<Button> 요소에 android:onClick 속성을 추가합니다.

 

 res/layout/activity_my.xml

 <Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button_send"

android:onClick="sendMessage" />

 

 

 android:onClick 속성의 값, "sendMessage", 는 사용자가 버튼을 클릭했을때 시스템이 호출하는 액티비티안에 있는 메소드의 이름입니다.

 java/com.mycompany.myfirstapp 디렉토리안에 MyActivity.java 파일을 열겠습니다.

 MyActivity 클래스 안에 아래 보여지는 sendMessage() 를 추가합니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

 /** Called when the user clicks the Send button */

 public void sendMessage(View view) {

     // Do something in response to button

 }

 

 

시스템이 호출을 하기 위해서는 android:onClick 속성에 주어졌던 메소드의 이름과 같아야 합니다. 이 메소드는 작성 방식이 반드시 위해 보여진 것과 정확히 맞아야 합니다. 

° 접근제한자는 public 이어야만 함

° 리턴타입은 void 이어야 함

° 파라미터는 오직 View 만 가능함(클릭된 View 입니다)

 

다음으로, 여러분은 텍스트필드(EditText)의 내용물을 읽고 이를 다른 액티비티에 전달하기 위해 이 메소드를 채우게 됩니다.

 

인텐트(Intent) 만들기

----------------------------

1. MyActivity.java 파일의 sendMessage() 메소드 안쪽에 DisplayMessageActivity 라고 불려지는 액티비티를 실행하기 위해 하나의 아래의 코드를 따라 Intent 를 만들어 냅니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

 public void sendMessage(View view) {

     Intent intent = new Intent(this, DisplayMessageActivity.class);

 }

 

Note : 만약 여러분이 Android Studio 같은 IDE를 사용한다면, DisplayMessageActivity 에 에러가 나타날 겁니다. 왜냐하면, 아직 이 클래스가 존재하지 않기 때문입니다. 지금은 이 에러를 무시하세요. 곧 이 클래스 만들 겁니다.

 

생성자는 두개의 파라미터를 사용하고 있습니다.

° 첫 번째 파라미터 : Context ( this 라고 쓴 이유는 Activity가 Context 의 서브 클래스 이기 때문입니다.)

° 두 번째 파라미터 : 시스템이 Intent 를 전달하기 위한 앱 컴포넌트 클래스

 

 

 Intent

 인텐트는 실행할 때 서로 다른 컴포넌트(두개의 액티비티 같은)를 사이를 연결하는 객체입니다. 인텐트는 앱의 "무언가를 하기 위한 의도" 를 나타냅니다. 여러분은 광범위하고 다양한 작업들에 인텐트들을 사용할 수 있습니다. 하지만 대부분 인텐트들은 다른 액티비티를 실행하는 용도를 사용하게 됩니다. 추가적인 정보를 알고 싶다면, 개발자 사이트의 Intent and Intent Filters 를 보시기 바랍니다. 

 

 

안드로이드 스튜디오는 여러분이 반드시 Intent 클래스를 import 하도록 표시합니다.

 

 

2. 파일의 가장 위에 Intent 클래스를 import 합니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

  import android.content.Intent;

 

Tip: Android Studio에서 Alt+Enter(Mac 에서는 option+return) 을 누르면 자동으로 필요한 클래스를 import 합니다.

 

 

3. sendMessage() 메서드 안쪽에 findViewById() 를 사용하여 EditText 요소를 얻어옵니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

 

  public void sendMessage(View view) {

     Intent intent = new Intent(this, DisplayMessageActivity.class);

     EditText editText = (EditText)findViewById(R.id.edit_message);

 }

 

 파일의 가장 위에 EditText 클래스를 임포트 하세요.

Android Studio에서 자동으로 필요한 클래스를 import 하기위해 Alt+Enter(Mac 에서는 option+return) 을 누르세요.

 

text를 message 지역변수에 할당합니다. 그리고 putExtra() 메소드를 사용하여 인텐트에 텍스트 값을 추가합니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

 public void sendMessage(View view) {

     Intent intent = new Intent(this, DisplayMessageActivity.class);

     EditText editText = (EditText)findViewById(R.id.edit_message);

     String message = editText.getText().toString();

     intent.putExtra(EXTRA_MESSAGE, message);

 }

 

 

인텐트는 extra 라고 불려지는 key-value 쌍의 data 타입을 전달 할 수 있습니다. putExtra() 메소드는 첫번째 파라미터로 키 이름을, 두번째 파라미터로 을 가집니다.

 

 

6. MyActivity 클래스의 위쪽에 아래 처럼 EXTRA_MESSAGE 상수 정의를 추가합니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

 public class MyActivity extends ActionBarActivity{

     public final static string EXTRA_MESSAGE = "com.mycompay.myfirstapp.MESSAGE";

     ...

}

 

 

 다음 액티비티에서 extra 데이터를 얻기위해, 여러분은 public 상수를 사용하여 인텐트의 extras에 대한 키를 정의 해야만 합니다.

위에 처럼 접두어로 앱의 패키지 이름을 사용하여 인텐트의 extra 키를 정의하는 것은 일반적으로 좋은 습관입니다. 이 방식은 다른 앱에서 여러분의 앱을 추출했을 때 유일한 식별자라는 것을 보증합니다.

 

 

7. 인텐트의 마지막 작업으로, sendMessage() 메소드 안에 스텝1에서 만들었던 인텐트 객체를 startActivity()메소드 호출하여 전달합니다.

 

 이 코드를 추가하여 아래 보이는 것처럼 Send 버튼에 의해 발동된 sendMessage() 메소드를 완성합니다.

 

java/com.mycompany.myfirstapp/MyActivity.java

public void sendMessage(View view) {

     Intent intent = new Intent(this, DisplayMessageActivity.class);

     EditText editText = (EditText)findViewById(R.id.edit_message);

     String message = editText.getText().toString();

     intent.putExtra(EXTRA_MESSAGE, message);

     startActivity(intent);

 }

 

 시스템은 이 메소드를 호출 받으면 Intent에 지정된 Activity 의 인스턴스를 시작합니다.

이제 여러분은 이 작업을 위해 DisplayMessageActivity 클래스를 만들 필요가 있습니다.

 

 다음 포스트에서 이어합니다.

반응형
반응형
Text Field( Text를 쓸수 있는 EditText) 추가하기

------------------------------------------

모든 View 객체와 마찬가지로 EditText 객체의 특징을 지정하기 위해 XML 에 속성들을 정의해야 만 합니다.


1. activity_my.xml 파일에서 <LinearLayout>의 요소로서 <EditText> 를 정의하고 id 속성을 "@+id/edit_message"로 지정하세요.

2. layout_widht 와 layout_height 속성은 "wrap_content" 로 정의하세요.

3. hint 속성은 'edit_message'로 이름지어진 문자열 객체(res/strings.xml 에 있는) 를 지정하세요.


<EditText> 요소는 아래처럼 되어 있어야 합니다.


res/layout/activity_my.xml

 <EditText android:id="@+id/edit_message"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:hint="@string/edit_message" />


<EditText>에 추가된 속성들 :


android:id

 이 속성은 여러분의 앱 코드(java파일)에서 객체를 참조해서 컨트롤하거나 읽어서 사용할 수있도록 하는 View에 대한 유일한 식별자를 제공합니다.(다음 단원에서 이 방법을 보실 겁니다.)


 기호는 여러분들이 XML로 부터 다른 resource 객체를 참조할 때 요구됩니다. 이어서 resource type을 지정합니다.(이번엔 id) 그리고 슬래시(/)하나를 쓰고 resource 이름을 직성합니다.(eidt_message)


 리소스 타입 전에 표시는 여러분이 리소스ID를 처음 주어질 때만 필요합니다. 여러분이 앱을 컴파일 할때, SDK tools는 EditText 요소를 참조하는 gen/R.java 파일안에 새로운 리소스 ID를 만들 때 이 ID 이름을 사용합니다. 리소스 ID가 선언된 것은 다른 것이 ID로 참조할 때 플러스 기호는 필요하지 않습니다. 플러스 기호는 오직 새로운 리소스 ID를 지정할 때만 필요합니다. 문자열이나 레이아웃들 같이 고정된 리소스의 값들은 필요하지 않습니다. 리소스 오브젝트에 대한 추가 정보는 아래 박스를 참고하세요.


 Resource Objects

 리소스 오브젝트는 bitmap, layout file, 또는 문자열 같은 조합된 앱 리소스의 정수형 이름입니다.


 모든 리소스는 여러분 프로젝트의 gen/R.java 파일에 리소스 오브젝트에 대응되어 있습니다. 여러분은 android:hint 속성에 대한 문자열 값을 지정할 필요가 있을 때와 같이 여러분의 리소스를 참고하기 위해 R 클래스에 오브젝트 이름을 사용할 수 있습니다. 또한 다른 코드로부터 view를 참조하기 위해 android:id 를 사용하고 있는 view와 조합하여 임의의 리소스 ID를 만들 수 있습니다.


 SDK tools 는 앱을 컴파일 할 때마다 R.java 파일에 자동으로 기록됩니다. 여러분들은 절대로 이 파일을 수정하시면 안됩니다. (실제로 수정되지도 않습니다.)


 추가정보를 원하시면 개발자 사이트의 Providing Resources 가이드를 읽어보시기 바랍니다. 

 


android:layout_width 와 android:layout_height

 width 와 height에 대한 사이즈 기입을 대신하여 "wrap_content" 값을 기입합니다. 이값은 뷰의 내용물을 감싸는데 필요한 만큼만 큰 뷰를 만들어 냅니다. 만약 이값을 "math_parent" 로 대체하면, EditText 요소는 부모뷰인 LinearLayout 의 사이즈를 맞추기 때문에 화면을 꽉 채우게 됩니다.  

 추가적인 정보를 원하시면 개발자 사이트의 Layouts 가이드를 참고하세요.


android:hint

 Text 영역이 비어있을 때 화면에 표시되는 기본 문자열 입니다. 다른 파일에 정의된 문자열 리소스를 참조하기 위해"@string/edit_message"를 직접 기입합니다. 왜냐하면 문자열 리소스는 고정된 값의 리소스 이기 때문입니다. 이것은 플러스 기호가 필요하지 않습니다. 어쨋든, 여러분이 아직 문자열 리소스를 정의하지 않았기 때문에 여러분들은 컴파일러 에러를 보게 될 겁니다. 여러분들은 다음 섹션에서 문자열을 정의함으로 이것을 확정할 것 입니다.

 

Note : 이 문자열 리소스는 ID:edit_message 요소로서 같은 이름을 가집니다. 어쨋든 리소스 참조는 항상 리소스 타입에 의해 범위가 스코프됩니다.(id 또는 string처럼) 그래서 같은 이름을 사용해도 충돌이 아닙니다.




Button 추가하기

-------------------------------

1. Android Studio에서 res/layout 디렉토리로 부터 activity_my.xml 파일을 작성합니다.

2. <LinearLayout> 요소 안에 <EditText> 요소에 바로 이어서 <Button> 요소를 정의합니다.

3. Button 의 width 와 height 속성에 "wrap_content" 를 설정합니다. 그래서 버튼은 항상 Button 의 Text 라벨을 감쌀 정도만의 사이즈를 가집니다.

4. android:text 속성은 이전 섹션에서 정의한  button_send 문자열 리소스의 값으로 Button 의 텍스트 라벨을 정의합니다.


여러분의 <LinearLayout>은 아래 처럼 보여야 합니다.


res/layout/activity_my.xml

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

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" >

      <EditText android:id="@+id/edit_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="@string/edit_message" />

      <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send" />
</LinearLayout>


Note : 이 Button 은 activity 코드에서 참조하지 않기 때문에 android:id 가 필요하지 않습니다.


그림2에 보여지는 것처럼 , 레이아웃은 현재 EditText 와 Button 위젯들 둘다 그것들의 내용물을 감쌀 정도의 사이즈로 디자인 되어 있습니다.


 

그림 2EditText 와  Button 위젯은 그들의 폭을 "wrap_content" 로 설정되어 있습니다.


 이 작업은 사용자가 얼마나 길게 입력할 지 알 수 없기 때문에 button , Text field 모두 좋은 방식입니다. 이것은 Text field의 사용하지 않는 화면 폭을 채우는 좋은 방법입니다. 여러분들은 LinearLayout 이 가지고 있는 weight 특성을 android:layout_weight 속성을 사용하여 지정할 수 있습니다.


 weight 값은 뷰가 소비하고 남아있는 공간의 총합을 지정한 숫자 입니다. 같은 레이아웃 안에 있는 형제 뷰들에 의해 소비된 무게의 총합입니다. 이 작업은 음료수 레시피 " 소다 2, 시럽 1" 음료의 정수 총액과 같은 것입니다.  마치 2-3의 소다음료를 의미합니다.  예를들어, 한 뷰의 weight 이 2이고 다른 하나가 1 이라면 이 둘의 합은 3입니다. 그래서 첫번째 뷰가 2/3의 남은 공간을 가지게 되고 두번째 뷰가 남을 공간을 채웁니다. 만약 여러분이 세번째 뷰을 추가하고 weight 에 1을 주면, 첫번째 뷰(weight이 2인)는 남은 공간의 1/2를 갖게 되고, 남은 두 개의 뷰가 각 각 1/4씩 갖게 됩니다.


 모든 뷰의 기본 weight 값은 0 입니다. 그래서 혹시 어떤 weight 값도 0보다 큰 값이 없다면, 모든 뷰는 어디의 공간에서는 모두 같은 사이즈의 공간을 가지게 됩니다.



 Input Box 화면 폭 안에 꽉 채워 만들기 

--------------------------------------------------

EditText를 레이아웃의 남아있는 공간에 채우기 위해서는 아래의 내용을 따라합니다.


1. activity_my.xml 파일에서, <EditText>의 layout_weight 속성의 값을 1 로 배치하세요.

2. 또한, <EditText>의 layout_width 의 속성 값은 "0dp" 로 배치합니다.


res/layout/activity_my.xml

 <EditText

android:layout_weight="1"

android:layout_width="0dp"

...........  />

 


 여러분이 weight 을 지정했을 때 레이아웃의 효과를 증명하기 위해, 여러분은 반드시 EditText 의 width 를 제로(0)로 변경해야만 합니다. "wrap_content" 을 사용하면 시스템은 남았는 공간에 대한 다른 width 값을 계산하고 궁극적으로 상관없는 width를 계산하기 때문에 0으로 width 을 설정해만 레이아웃에 효과가 입증된다. 


그림 3은 EditText 에 모든 weight 배치했을 때의 결과를 보여 줍니다.


 

그림 3. 모든 layout weight이 주어진 EditText 위젯, 그래서 이것은 LinearLayout 의 남아있는 공간을 꽉 채웁니다.


아래 완성된 activity_my.xml 레이아웃 파일을 보겠습니다.


res/layout/activity_my.xml

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="@string/edit_message" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send" />
</LinearLayout>



앱 실행하기

----------------------------

 이 레이아웃은 여러분이 프로젝트를 만들 때 SDK tools가 자동으로 작성한 default Activity 클래스에 의해 적용되었습니다.

결과를 보기위해 앱을 실행합니다.


° Android Studio 에서 툴바에 있는 Run 을 클릭하세요.

° 또는 command line 에서는, 여러분의 안드로이드 프로젝트의 root 디렉토리로 변경하고 아래 명령을 실행합니다.

 ant debug

 adb install bin/MyFirstApp-debug.apk

 


 다음 포스트에서 버튼을 눌렀을 때 응답하는 방법, text field(EditText)로 부터 내용물을 읽어내는 방법, 다른 activity를 시작하는 방법과 추가적인 내용들을 계속이어서 진행하겠습니다.

반응형
반응형

이번 단원에서는 하나의 텍스트 영역과 하나의 버튼을 가지고 있는 XML파일을 만들게 됩니다. 여러분이 버튼을 누를 때 또 다른 화면 Activity의 텍스트 영역에서 응답하는 것은 다음 단원에서 다루겠습니다.


 안드로이드 앱의 그래픽 UI 는 View 와 ViewGroup 의 계층구조를 사용하여 만들어 집니다. View 객체는 일반적으로 버튼이나 텍스트 영역같은 UI 위젯을 말합니다. ViewGroup 객체는 차일드 뷰를 격자모양이나 수직 리스트 같이 어떻게 배치하는지 방법을 정의한 보이지 않는 뷰 컨테이너입니다.


 안드로이드는 View 와 ViewGroup 의 서브클래스에 해당하는 XML 표기법(태그)를 제공합니다. 그래서 UI 요소를 상속하여 XML 안에 여러분의 UI를 정의할 수 있습니다.


 Layout 은 ViewGroup 의 서브클래스 입니다. 이번에는 LinearLayout 을 가지고 작업해 보겠습니다. 



그림 1. 다른 View를 포함한 layout 트리구조의 ViewGroup 그림. 






Linear Layout 만들기

-----------------------------------

1. Android Studio에서 res/layout 디렉토리안에 있는 activity_my.xml 파일을 엽니다.

 여러분이 프로젝트를 만들 때 선택했던 BlankActivity 형태는 RelativieLayout root 뷰와 하나의 차일드 뷰로 TextView를 가지고 있는 activity_my.xml 파일을 포함하고 있습니다.


2. Preview pane에서, 감추기 아이콘을 클릭하여 Preview pane를 닫습니다.

 Android Studio에서는 레이아웃 파일을 열 때 우선적으로 프리뷰 페인을 보여줍니다. 이 페인의 요소들을 클릭하면 Design pane 안에 잇는 WYSIWYG 도구를 열게됩니다. 이번 시간에는 XML파일에 직접 작업을 할 겁니다. 


3. <TextView> 요소를 지우세요.

4. <RelativeLayout> 을 <LinearLayout>으로 변경하세요.

5. <LinearLayout> android:orientation 속성을 추가하고 "horizontal" 로 설정하세요.

6. android:padding  tools:context 속성을 제거하세요.


결과는 아래와 같습니다.


res/layout/activity_my.xml

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

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" >

</LinearLayout>


 LinearLayout 은 android:orientation 속성을 지정하여 수직 또는 수평하게 차일드 뷰들을 배치하는 하나의 뷰 그룹(ViewGroup클래스의 서브클래스) 입니다. LinearLayout의 각각의 차일드 뷰들은 XML에 써진 순서대로 화면에 나타납니다.


 android:layout_width 와 android:height 의 2개 속성은 모든 뷰들에게 그들의 사이즈를 지정하기 위해 요구됩니다.


LinearLayout은 레이아웃에서 root뷰(최상위 뷰) 이기 때문에 width와 height 을 "match_parent" 로 설정하여 반드시 화면 영역을 꽉 채워야 한다. 이 값은 부모뷰의 가로 세로에 매치하기 위해 뷰에 정의 되어야 합니다.


layout 특성들에 대해 자세히 알고 싶다면 개발자 사이트의 Layout guide를 보시기 바랍니다.

반응형
반응형

여러분들이 안드로이드 프로젝트를 만들기 위해 이전 포스트를 따라 했다면, 앱을 바로 실행하기위한 "Hello World" 소스파일을 포함하고 있을 겁니다.


여러분의 앱을 실행하는 두가지 방법 : 실제 안드로이드 단말기에서 하거나 Android Studio를 이용합니다.

 이번 포스트에서는 실제 단말기와 안드로이드 에뮬레이터에 install하고 실행시키는 방법을 보게 될 겁니다. 그리고 이를 Android Studio 와 Command line tools를 이용한 두가지 경우 모두 소개합니다.


실제 디바이스(안드로이드 폰이나 테블릿)에서 실행하기

--------------------------------------------

만약 실제 디바이스에서 실행하고자 한다면 어떻게 인스톨하고 실행하는지 소개하겠습니다.


단말기 설정

1.  개발에 사용되는 단말기에 USB cable 을 연결하세요. 만약 Windows 운영체제에서 개발하고 있다면 여러분의 단말기에 해당하는 USB 드라이버를 설치할 필요가 있을 수 있습니다.(각 단말기 회사의 홈페이지에서 제공하고 있습니다.)  드라이버 설치를 돕기위해 개발자 사이트의  'OEM USB Drivers' 문서를 참고하시기 바랍니다.


2. 여러분의 단말기에서 USB debugging 이 가능하도록 하세요.

 ° 안드로이드 3.2 거나 그 이하 대부분의 단말기는  옵션(Option) 메뉴에서 Setting(설정) > Application(응용프로그램) > Development(개발)  안에 있음.

 ° 안드로이드 4.0 이상에서는 Setting(설정) > Developer options(개발자 옵션)

  Note : 안드로이드 4.2 이상에서는 Developer options(개발자 옵션)이 기본적으로 숨겨 있습니다. 가능하도록 만들기 위해, Setting(설정) > About phone(핸드폰 정보)에서 마지막에 있는 Build number(빌드번호)를 7번 누르세요. 그리고 이전으로 돌아오면 Developer options(개발자 옵션) 를 찾으실 수 있습니다.



Android Studio 에서 앱 실행하기

1. 여러분의 프로젝트 파일들 중에 하나를 선택하고 도구모음에서 Run 버튼을 클릭하세요.

2. Choose Device 창이 나타나면, Choose a running device 라디오 버튼을 선택하고, 여러분의 단말기를 선택하고 OK 버튼을 클릭하세요.


Android Studion는 연결되어 있는 단말기에 앱을 설치하고 시작합니다.


command line 에서 앱 실행하기


1. 여러분의 안드로이드 프로젝트의 root 로 디렉토리를 변경하고 아래 실행 :

  ant debug


2. 여러분의 PATH 환경변수에 Android SDK  platform-tools/ 디렉토리를 만들고 실행 : 

  adb install bin/MyFirstApp-debug.apk

 


3. 여러분의 단말기에서 MyFirstApp location를 여세요.

 

여기까지 여러분의 앱을 디바이스에 빌드하고 실행하는 방법입니다. 개발을 시작하기 위해 다음 포스트에서 계속하겠습니다.




 

에뮬레이터(Emulator)에서 실행하기

------------------------------

 

 여러분이 Android Studio 를 사용하든 command line 을 사용하든, 여러분의 앱을 에뮬레이터에서 실행하기 위해 제일 먼저 Android Virtual Device(AVD) 가 필요합니다. AVD는 여러분이 선택한 특정 단말기의 모습을 한 장치입니다.


AVD 만들기

1. Android Device Manager 실행 :

 ° Android Studio 에서 Tools > Android > AVD Manager 선택하거나 툴바에서 AVD Manager icon  를 선택하세요.

 ° 또는, command line 에서 <sdk>/tools 로 디렉토리를 변경하고 실행 :   

  android avd

 

 Note : command line 으로 부터 실행될 때 나타나는 AVD Manager 는 Android Studio 의 버전과 다릅니다. 그래서 보여지는 명령이 적용되지 않을 수 도 있습니다.


  그림 1. 현재 존재하는 가상 머신(Virtual Devices)들이 보여지는 AVD Manager 메인 화면


2. AVD Manager 메인 화면에서(그림1), Create Virtual Device 를 클릭하세요.

3. Hardware 선택창에서, Nexus 6 같은 특정 디바이스를 선택하세요. 그리고 나서 Next 를 클릭하세요.

4. 희망하는 AVD의 시스템 버전을 선택하고 Next 를 클릭하세요.

5. 설정한 특성들을 확인하고 Finish 를 클릭하세요.  


AVDs 에 대한 자세한 정보는 개발자 사이트의  Managing AVDs with AVD Manager 를 참고하세요.


 

Android Studio 에서 앱 실행하기

1. Android Studion에서 여러분의 프로젝트를 선택하고 도구모음에서 Run 버튼을 클릭하세요.

2. Choose Device 창이 나타나면, Launch emulator 라디오 버튼을 클릭하세요.

3. Android virtual device 로 부터 나열된 menu에서 여러분이 만든 단말기를 선택하고 OK 버튼을 클릭하세요.


 에뮬레이터가 load 되는데 몇 분간 시간이 소요됩니다. 여러분이 화면을 풀면(스마트폰의 잠길 풀기 제스쳐) MyFirst 앱은 에뮬레이터의 화면에 나타날 것입니다.



command line 에서 앱 실행하기


1. 여러분의 안드로이드 프로젝트의 root 로 디렉토리를 변경하고 아래 실행 :

  ant debug


2. 여러분의 PATH 환경변수에 Android SDK  platform-tools/ 디렉토리를 만들고 실행 : 

  adb install bin/MyFirstApp-debug.apk

 


3. 여러분의 에뮬레이터에서 MyFirstApp location를 여세요.

 

 여기까지 여러분의 앱을 에뮬레이터에서 빌드하고 실행하는 방법입니다. 개발을 시작하기 위해 다음 포스트에서 계속하겠습니다.

반응형
반응형

이번 포스트의 배울 내용

--------------------------------------​

1.  Android Studio를 이용한 프로젝트 만들기

2.  Command Line(콘솔창)을 이용한 프로젝트 만들기

 

 안드로이드 프로젝트에는 안드로이드 앱의 소스코드를 구성하는 모든 파일을 포함하고 있습니다.

 

이번 장에서는  Android Studio 또는 커멘드 라인을 이용한 SDK  tools, 둘다 사용해서 새로운 프로젝트를 만들어 내는 방법을 보여주고자 합니다.

 

 Note :  여러분들은 이미 Android SDK가 설치되어 있어야 합니다. 혹시  Android Studio를 사용하고자 하신다면 당연히  Android Studio가 설치되어 있어야 하면, 혹시 이것들이 되어있지 않다면 이번장을 시작하기 전에 개발자 사이트의  'Installing the Android SDK'의 설치 가이드를 따라하시기 바랍니다. 

 

 

 Android Studio를 이용한 프로젝트 만들기

-----------------------------------

1.  Android Studio에서 프로젝트 새로 만들기

​    ° 프로젝트를 만들었던 적이 없다면 'Welcome' 화면에서 'New Project' 를 클릭하세요.

    ° 프로젝트를 만들었던 적이 있다면 'File' 메뉴에서 'New Project' 를 선택하세요.​

2.​ 아래 그림1에 보여진것처럼 'Configure your new project' 의 항목들을 기입하고 'Next' 버튼을 클릭하세요.

​ 그림 1. Configuring a new project in Android Studio

그림1에​ 보여지는 값과 같은 값을 사용하시면 이번장을 따라하시기 쉬울겁니다.

 ​° Application Name  은 사용자에거 보여지는 앱의 이름입니다. 여기서는 " My First App"을 사용합니다.

 ° Company domain 은 패키지 이름에 추가되는 규칙으로 제공됩니다. 안드로이드 스튜디오는 여러분이 만든 각각의 새로운 프로젝트마다 이 이름을 기억할 것 입니다.

 ° Package name 은 프로젝트를 위한 완전한 이름입니다.( Java 프로그래밍 언어에서와 같은 규칙을 가집니다.) 패키지 이름은 안드로이드 시스템에 설치된 모든 패키지를 통틀어 유일해야 합니다. 여러분들은 앱 이름이나 회사이름(company domain)과 독립적으로 이 값들을을 작성할 수 도 있습니다.

 ° Project location 은 여러분의 컴퓨터안에 프로젝트파일을 저장할 디렉토리입니다.

​3. 앱을 실행할 때 선택 형식에서 'Phone and Table' 을 선택하세요.


4. Minimum SDK 는 API 8: Android 2.2(Froyo) 를 선택하세요.

  최소로 요구되는  SDK는 여러분의 앱에서 제공되는 가강 이전의 버전입니다. 가능한 많은 단말기에서 제공될 수 있도록 하기 위해서 가장 낮은 버전으로 설정하셔야만 하며 여러분들의 앱에 사용되는 주요기능 설정은 허용가능한 낮은 버전을 사용하시기 바랍니다. 만약 여러분의 앱에서 어떤기능이 오진 새로운 버전에서만 가능하고 중요 핵심 기능 셋이 아닌경우, 여러분든은 그것을 지원하는 버전위에서만 실행될 때 가능합니다.


5. 체크가 안 되어 있는 다른 모든 옵션(TV, Wear, and Glass)은 그대로 두고 Next 를 클릭합니다.


6. 'Add an activity to your project' 에서 'Blank Activity' 를 선택하고 Next 를 클릭하세요.


7. 'Describe the new activity for your project' 은 그냥 두고 'Finish' 를 클릭합니다.


 여러분의 안드로이드 프로젝트는 현재  기본적은 몇가지 파일을 포함한 "Hello World" 앱 입니다. 이것들 중 몇가지 중요한 것들에 대해 잠시 살펴보도록 하겠습니다.


app/src/main/res/layout/activity_my.xml

 이것은 여러분인 Android Studio를 이용하여 프로젝트를 만들었을 때 추가된 XML 파일 입니다.  새로운 프로젝트의 작업순서에 따르면, Android Studio는 하나의 TextView 와 화면UI의 미리보기를 가진 파일을 줍니다. 이 파일은 몇가지 기본값이 설정되어있으며 "Hello World" 메세지를 보여주는 하나의 TextView를 포함하고 있습니다.


app/src/main/java/com.mycompany.myfirstapp/MyActivity.java

 Android Studio 에서 New Project 작업순서가 끝났을 때 하나의 탭으로 나타난 파일입니다. 이 파일을 선택하시면 여러분들이 만들어 놓은 activity에 대한 클래스의 정의를 보실 수 있습니다. 여러분들이 앱을 생성하고 실행했을때 Activity 클래스는 "Hello World" 라고 말하고 있는 레이아웃(layout) 파일을 읽어서 실행합니다.


app/src/res/AndroidManifest.xml

 manifest 파일은 앱의 기본적인 특징과 구성하고 있는 컴포넌트(Components) 정의를 표시하고 있습니다.

이 포스트들을 따라하면서 앱에서 컴포넌트(Component)를 추가할 때 이 파일을 다시 열게 될 것입니다.


app/build.gradle

 Android Studio는 앱을 컴파일하고 빌드할 때 Gradle를 사용합니다. build.gradle 파일은 프로젝트의 각각의 모듈 뿐만 아니라 프로젝트 전체에 대해서도 있습니다. 이번 앱의 경우에는 일반적으로 각각의 모듈에 대해서만 관심을 가지게 됩니다.

 기본적으로 포함된 설정 defaultConfig :

 

· compiledSdkVersion 은 여러분들의 앱을 컴파일할 플랫폼 버전입니다. 기본적으로 여러분의 SDK에서 가능한 최신버전으로 되어 있습니다. (4.1버전 이상이거나 그 이상이여야만 함. 만약 그렇지 않으면 SDK Manager 를 사용하여 install 해야 함) 여러분은 여전히 오래된 버전에서도 빌드 할 수 있습니다. 하지만 최신버전의 단말기에서 새로운 기능과 훌륭한 UX의 최적화가 가능하도록 최선버전으로 세팅합니다.

 

· applicationId 는 New Project 의 작업 중 지정된 완전한 패키지 이름입니다.

· minSdkVersion 은 New Project 의 작업 중 지정된 최소한의 SDK 버전입니다. 여러분의 앱에서 지원하는 가장 이전버전입니다.

· targetSdkVersion 은 여러분의 앱을 테스트했던 가장높은 안드로이의 버전입니다. 새로운 플랫폼의 추가적인 기능을 쓰려면 최신 API와 같은 버전을 가지고 테스트를 해야 합니다.

추가적인 정보는 개발자 사이트의 'Supporting Different Platform Version' 을 읽어보세요.

 

Gradle에 대한 추가 정보는 'Building Your Project with Gradle' 을 보세요.

 

 

 

여러분들의 앱에 대한 resources를 포함한 /res 의 서브디렉토리를 보겠습니다.

 

drawable-hdpi/

  high-density(hdpi) 스크린으로 디자인 된 drawble 객체(bitmaps 같은)를 위한 디렉토리입니다. 다른 해상도로 디자인 된 자원들은 다른 디렉토리에 포함됩니다. 여러분들이 기본 앱을 실행시킬 때 나타나는 ic_launcher.png 를 발견하실 수 있을 겁니다.


layout/

 위에서 설명했던 MyActivity class 의 기본 배치(layout)를 묘사했던 activity_my.xml 같은 앱의 UI 를 정의한 XML 파일을 위한 디렉토리입니다.


values/

 문자열이나 색상 정의 같은 리소스의 집합을 포함하고 있는 XML파일을 위한 디렉토리입니다. string.xml 파일은 여러분의 기본앱을 실행할 때 보여지는 "Hello World!" 문자열을 정의하고 있습니다.


 앱을 실행하기 위해 다음 포스트에서 계속하겠습니다.

 




 

 Command line(콘솔 명령창)를 이용한 프로젝트 만들기

-------------------------------------------------------

 

 만약 Android Studio를 사용하지 않는다면, 여러분들은 command line에서 SDK tools 를 사용하여 프로젝트 생성을 대신할 수 있습니다.


1. Android SDK's tools/ 경로로 디렉토리를 변경하세요.

2. 실행 :

  android list targets

  

 이것은 여러분들이 다운로드했던 SDK에 대해 사용가능한 Android 플랫폼의 리스트를 출력합니다. 여러분의 컴파일하길 원하는 버전에 대응하는 플랫폼을 찾으세요. 그리고 target ID를 기록하세요. 가능한 가장 높은 버전을 선택할 것을 추천합니다. 여러분들은 여전히 오래된 버전을 지원하도록 빌드할 수 있습니다. 하지만 최신 단말기를 위한 앱의 최적화을 위해 최신버전을 타겟으로 빌드하도록 설정하세요.


 만약 어떠한 타겟 리스트도 보이지 않는다면, 여러분들은 Android SDK Mananger tool 을 사용하여 install을 할 필요가 있습니다. 

개발자 사이트의 Adding SDK Package 를 참고하세요.


3.실행:

  android create project --target<target-id> --name MyFirstApp\

  --path <path-to-workspace>/MyFirstApp --activity MyActivity\

  --package com.example.myfirstapp


 <target-id> 는 타셋의 리스트에서 ID(이전 단계에서 얻어온)로 대체하세요. 그리고 <path-to-workspace>는 여러분의 Android project 들을 저장하길 원하는 폴더 location으로 대체하세요.


Tip : 여러분의 PATH 환경변수에 tools/ 와 같이 platform-tools/를 추가하세요.


 여러분의 안드로이드 프로젝트는 현재 몇가지 기본 파일을 포함하고 있는 기초적인 "Hello World" 앱입니다. 앱을 실행하기 위해 다음 포스트에서 계속하겠습니다.

반응형
반응형

안드로이드 개발을 위한 여러분들의 도전을 환영합니다.


 이번 장에서는 여러분이 어플을 생성하는 방법에 대해 배워보겠습니다. 여러분들은 안드로이드 어플을 생성하고 실행하고 디버깅할 수 있는 방법을 배우게 될 것입니다. 또한 사용자로부터의 입력을 처리하기 위한 심플한 인터페이스를 포함한 안드로이드 어플 디자인의 몇가지 기본적이고 핵심적인 내용에 대해 배우게 될 것입니다.



 개발 환경 설정 및 구축

어플 개발을 시작히기 전에 개발환경을 구축해야만 합니다. 개발환경 구축을 위해 여러분은 다음의 작업이 필요합니다.


1. Android Studio를 다운로드 합니다. 


2. SDK Manager를 이용하여 최신버전의 SDK tools를 다운로드 합니다.


 NOTE: 이 카테고리의 포스트에서는 대부분 Android Studio를 사용할 예정이지만 일부분은 이전 SDK 도구를 사용합니다.

  

 이 포스트는 여러분들에게 안드로이드 개발에 대한 몇가지 기본적인 개념을 가르치키 위해 간단하고 작은 안드로이드 앱을 작성하는 튜토리얼 형식을 사용합니다. 그래서 여러분들이 각 단계를 잘 따라하는 것이 중요합니다.

반응형
반응형

이 카테고리는 제가 안드로이드를 학습할때 학습자료로 주로 사용하였던 안드로이드 개발자 사이트의 트레이닝 자료를 번역해서 포스팅하고자 하고자 합니다.


안드로이드를 학습하고자 한다면 프로그램 다운로드를 위해 필수적으로 접속하시게 되는 사이트이기도 합니다.


안드로이드 개발자 사이트 :  http://developer.android.com


 애석하게도 상당히 많은 안드로이드의 학습자들이 이 사이트를 단순히 프로그램을 다운로드 받기 위한 용도로만 사용하는 모습을 보입니다. 아마 영어로 되어 있다보니 잘 안 보게 되는 것 같습니다. 하지만 이 사이트는 이름 그래도 안드로이드의 어플 개발자들을 위한 공간입니다. 상당히 많은 정보를 가지고 있는 곳인 만큼 자주 들여다 보는 습관을 갖길 바랍니다. IT영어는 일반 영어회화와는 다르게 단어만 검색해도 해석이 되는 경우가 많습니다. 참고하시기 바랍니다.


 거의 대부분의 내용은 트레이닝 사이트의 영어표현을 의역해서 포스팅할 예정입니다. 다만 다소 보충이 필요한 부분은 보완하면서 포스팅 해볼 생각입니다.

제가 진행하고 있는 [게임제작으로 배우는 안드로이드 어플개발]은 제가 모든 내용을 생각하고 표현하느라 포스팅 하는데 시간이 많이 소비되는 만큼 진도 차이가 많이 날 것이고 내용을 전개하는 방식도 다르지만 두 카테고리 모두 안드로이드를 학습하는데 도움이 될 것이니 많은 관심 감사하겠습니다. 

반응형
반응형

자. 그럼 이제부터 프로젝트 하나는 만들도록 하겠습니다. 아래의 이름으로 프로젝틀 하나 생성하시기바랍니다. 여러 설정값들에 대한 의미는 이전 포스트에 언급했던 것을 참고를 선택하시고 'Next'버튼을 눌러 프로젝트를 생성해 보겠습니다. 


 Application Name : ViewByJava (java로 view를 만들었다는 의미로 이름을 지었습니다. 다른 이름으로 하셔도 괜찮습니다.)


 안드로이드 프로젝트 생성자를 통해서 기본적으로 Java파일과 xml파일이 생성되어 있습니다. 우선 xml은 이용하지 않을 것이니 java파일만을 살펴보겠습니다.

 

 MainActivity.java

 public class MainActivity extends Activity{


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

}       


}

 

 

 위에 보이는 setContenView()메소드가 화면에 보여질 내용물(Content)을 설정하는 것이라 설명했었습니다. 이 메소드의 매개변수를 보면 이전 강좌에서 언급했듯이 res폴더 안에 xml 파일로 만들어 놓은 'activity_main.xml'을 보여 주고 있습니다. 그렇다니까 그냥 그런가 보다 했지만 사실 생각해보면 조금 이상한 부분이 있습니다. 지금 작성하고 있는 파일은 Java언어로 개발한 것이고 보여지는 부분을 만들기 위해 사용한 파일은 xml언어로 개발된 것입니다. 이 둘은 전혀 다른 언어를 사용하고 있는 것입니다. java에서 xml파일의 내용을 읽어들이는 것은 사실 그렇게 간단하지만은 않습니다. xml파일을 읽어들여 파싱하고 객체로 생성시키는(inflating) 일련의 작업들이 필요합니다. 하지만 여러분은 그런 작업을 어디에서 작성하지 않고 있습니다. 사실 setContentView 메소드는 매개변수로 View 객체를 요구하고 있습니다. 하지만 이 곳에 xml파일의 resId(리소스ID)를 주면 내부적으로 xml을 inflate해서 View객체로 만들어 주고 있습니다. 결국 여러분들은 그냥 편하게 xml언어와 자바언어를 번갈아가며 작업하고 손쉽게 연동하여 사용하고 있지만 안드로이드는 xml을 모두 객체로 생성하여 자바언어로 실행되고 있다고 보시면 됩니다.


setContentView()메소드는 아래처럼 오버로딩되어 있는 메소드 입니다.

 setContentView(int resId)      :매개변수로 xml의 리소스ID를 요구    - xml 언어로 View를 만들었을 때 사용 (Default) 

 setContentView(View view)   :매개변수로 View 객체를 요구         - java 언어로 View객체를 만들었을때 사용


  

 




 ----- [ 이 포스트는 아직 미 완성입니다. 작성중......  다음에 이이서 작업합니다.  그림작업포함] --------- 

반응형
반응형

이전 포스트를 통해 안드로이드 프로젝트의 구조와 구성파일들의 의미를 간략하게나마 확인해보았습니다. 처음에는 설명을 들어도 쉽게 이해하기 어렵고 힘들다는 생각이 들 수 있습니다. 하지만 조금만 익숙해지면 이런 복잡해 보이는 파일구조가 얼마나 편하고 체계적인지 느낄 수 있게될겁니다. 그때까지 이해가 다소 안되는 부분이 있어도 그냥 그런가보다 하고 따라하다 보면 분명 어느순간 안드로이드 어플 개발의 프로세스가 자연스럽게 이해될 것입니다.

 

 이번 강좌부터는 실제 어플을 개발하기 위한 내용을 소개해 드리고자 합니다.

이전 강좌를 잘 보셨다면 안드로이드 프로젝트는 역할별로 여러파일이 나뉘어져 있다는 것을 알고 있을겁니다. 안드로이드는 프로젝트를 개발할 때 MVC(Model View Control) 패턴으로 개발하도록 되어 있습니다. 즉, DB(DataBase), Data용 클래스등 값(Value)를 저장하기 위한 Model파트, 보여지는 부분을 담당하는 View파트, 이둘을 연결하고 제어하기위한 Controi파트, 이렇게 세 부분으로 역할을 구분하여 파일을 제작하는 방식을 말합니다. 옷이나 제품을 디자인할 때 사용되는 디자인패턴 같은 것이라고 보면 됩니다. 프로젝트마다 세부적인 구성은 다를 수 있지만 크게 파일들을 구분하면 M,V,C 세가지로 이루어져 있습니다. 아마 C, Java와 같은 Native 언어만 학습하신 분들은 이런 역할별 파일 구분을 많이 연습해보지 않아서 어색하고 어렵게 보여질 수 있을 겁니다. 하지만 이렇게 역할 별로 구분을 하여 파일을 제작하고 관리하게 되면 한 파트가 수정되어도 다른 파트를 수정하지 않아도 되기 때문에 유지보수 및 디버깅이 우수하고 파트별로 제작되기 때문에 본인이 제작하고 있는 부분이 어느 역할을 하게 될지 명확하게 이해할 수 있게 됩니다. 예를 들어 화면에 네모난 모양의 버튼을 만들었는데 동그란 모양으로 바꾸고 싶어질 때 여러 파일들을 검토하고 수정할 필요없이 보여지는 부분인 View파트의 파일만 찾아 변경하면 되도록 제작한다는 것 입니다.

 

 계속 언급했듯이 안드로이드 어플은 Java언어로 개발하는 것입니다. 당연히 여러분이 만든 어플은 자바컴파일러에 의해 실행된다고 생각하시면 됩니다.(사실 실제로는 'Dalvik'이라는 안드로이드 가상 머신에 의해 실행되어집니다) 당연히 Model, View, Control 모두 자바 언어로 개발하시는 겁니다. 특히 화면에 보여지는 부분을 담당하는 View 파트 역시 Java로 개발하는 것이 원래의 개발 형식입니다. c언어 계열의 MFC나 Java의 AWT, Swing 같은 윈도우 프로그램 제작을 연습해 보신 분들은 잘 아실 겁니다. 화면에 버튼을 만들고 싶으면 버튼의 능력을 보유한 'Button' 이라는 클래스로 객체를 생성하여 화면에 보여지게 만들었을 겁니다. 물론 안해보신분들은 이게 무슨 소린가 싶으실 겁니다. 괜찮습니다. 안해보신 분들도 이제부터 배워보시면 됩니다.

 아무튼 기존 c나 java같은 언어를 통해 화면을 구성하면 녹색의 네모박스 하나 만들고 보여지게 하는 것조차 다소 쉽지 않게 프로그래밍 하도록 되어있습니다. 하물며 이런 네모 모양이 하나가 아니라 여러개고 거기에 글씨도 보여주고 어떤 글씨는 크고, 어떤 글씨는 작고 등등 많은 소소한 구성차이들을 일일이 제어해서 화면에 표현하기가 여간 번거롭고 복잡할 수 없습니다. 그래서 안드로이드는 좀더 쉬운 방식의 화면구성을 위한 언어가 있으면 좋겠다고 생각하게 되었습니다. 그래서 View를 제작하는 파트는 Java언어가 아닌 'XML'언어를 통해 개발하게 되었습니다. 이미 이전 포스트를 통해 XML언어에 대한 기본적인 형식을 보여드렸으니 익숙해 지는 것은 실제 프로젝트를 제작하면서 하나하나 익혀가도록 하겠습니다.


 실제 프로젝트의 제작에 앞서 이렇게 View파트에 대해 언급한 이유는 어떤 어플을 만들던지 화면에 보여지는 부분을 개발자가 원하는 모양으로 표현할 수 있어야 하기 때문입니다. 여러분들이 아무리 우수한 아이디어와 아이템, 알고리즘을 통해 기가막힌 어플을 만들더라도 화면구성이 어설프면 그 어플은 사용자들로 부터 외면받게 됩니다. 반대로 기능이나 기법은 평법하고 특별할게 없더라도 화면에 보여지는 모습이 좋으면 사용자로부터 폭발적인 인기를 얻게 될 수도 있는 것입니다. 그래서 가장 먼저 화면을 만들어 내는 방법부터 학습을 시작하고자 합니다.


 안드로이드 어플을 제작하면서 여러분들이 가장 중요하고 빈번하게 사용하게 되는 2개의 Class가 있습니다. 'Activity' 와 'View' 입니다.


자. 생각을 해보겠습니다. 스마트폰의 화면에 글씨를 하나 표시하거나 사용자의 터치에 반응을 하는 것이 단순히 코드 몇자 써서 되겠습니까? 화면에 'Hello'라는 글자 하나가 보여지게 하기 위해서는 스마트폰이라는 하드웨어를 제어하여 전기적 신호를 통해 화면상에 보여지게 만들어야 합니다. 반대로 사용자가 화면을 터치하면 디스플레이라는 하드웨어가 정전식이든 감압식이든 전기적인 신호를 통해 입력정보를 안드로이드라는 운영체제에게 전달하고 운영체제는 이를 여러분의 어플에 전달합니다. 그럼 여러분들은 이런 전기적인 신호를 분석하여 터치위치나 여러정보를 분석하여 반응하도록 프로그램을 짜야합니다. 이런 작업들은 하드웨어를 제어해야 하는 만큼 그렇게 쉬울리가 없습니다. 이런 간단치 않은 작업들을 어플 개발자들이 매번 작업하기 번거로울 수 밖에 없겠죠. 그래서 안드로이드에서 만들어 준 것이 'Activity' 라는 클래스 입니다. Activity클래스가 이런 일련의 작업들을 대신 책임져 준다고 생각하시면 됩니다. 여러분들은 화면에 무엇인가를 보여주거나 입력을 받으려면 무조건 Activity를 상속받아 사용하시면 됩니다. 그렇기 때문에 안드로이드 프로젝트를 처음 생성하면 자동으로 Activity를 상속받은 MainActivity를 만들어 준 겁니다. 대부분의 어플은 당연히 화면을 가지고 있는 경우가 99%일 것이니 Activity는 어플 제작에서 매우 중요한 클래스라고 할 수 있겠죠. 

 여기서 중요한 것은 'Activity'는 화면을 담당하는 클래스이지만 화면에 보여지는 내용물(Contents)을 구성하는 역할은 아니라는 것입니다. Activity는 오로지 화면에 대한 담당자 또는 관리자의 역할만 하고 실제 보여지는 모든 것들은 'View' 라는 클래스를 통해 만들어집니다.

 안드로이드에서는 모든 보여지는 것은 View라는 클래스를 상속받아 만들게 됩니다. 이름 자체가 이미 '보여지는 것' , '시야' 라는 뜻의 'View' 이니 이름만 봐도 대략적으로 어떤 역할인지 쉽게 이해가 갈 겁니다. 실제로 상속받아 사용하는 방법은 매우 직관적입니다. 이미 View를 상속받아 특별한 역할을 수행하는 View의 자식클래스르 많이 만들어 놓았습니다. 

 이름만 들어도 쉽게 이해 될 수 있습니다. 만약 여러분이 글씨, 즉 Text를 보여주고 싶으면 'TextView' , 이미지를 보여주고 싶으면 'ImageView' ,  버튼을 만들고 싶다면 'Button' , 글씨를 입력받고 싶으면 'EditText' 등 많은 종류의 View들을 만들어 놓았습니다. 


 아래 그림은 View의 상속구조를 보여주고 있습니다. 


[View 상속계층도(체계도)]




 


[그림출처 : www.soen.kr]


 이렇듯 특정한 역할을 담당하는 View들이 있기때문에 여러분들은 이 중에서 원하는 역할을 수행하는 View를 적절한 위치에 사용하시기만 하면 됩니다. 이렇게 독립적으로 특정한 역할을 수행하는 View들을 용어적으로 'Widget' 이라고 부릅니다. 


 어플의 화면을 꾸미고 만드는 것은 View 들을 통해 만들고 이를 Activity 클래스에서 설정하면 화면에 보이게 되고 사용할 수 있게 되는 것입니다. Activity 에서는 단순히 setContentView()라는 메소드를 통해 우리가 만든 View를 보여주기만 하면 됩니다. 매우 간단한 작업입니다. 결국 화면 꾸미기는 Activity 클래스가 아니라 View 만 잘 구성하면 되는 것입니다. 그리고 그 View를 만드는 것은 Java 언어를 통해서 할 수 도 있지만 앞에서 언급했듯이 XML에서 하는 것이 보다 수월하고 직관적이기 때문에  XML 파일만 작성하면 화면의 모양은 원하는 형태로 제작할 수 있다는 것입니다.


 이전 포스트를 통해서 xml에 대한 부분은 잠시 언급했었습니다. 제 강좌에서는 안드로이드 프로그래밍에 필요한 정도의 문법만 소개하고자 합니다. 기타 언어의 특성은 인터넷이나 서적을 통해 학습해 보시기 바랍니다. 앞으로 제가 진행하는 안드로이드 강좌에서 XML의 사용은 Java언어에서 객체를 생성할때 사용하는 new 의 대신이라고 생각하시고 보시면 됩니다. 말로만 진행했던 부분을 점검하기 위해 아직 이르지만 Java로 View 객체를 생성해서 화면에 보여지는 프로젝트를 만들어 보겠습니다.


 다른 강좌나 서적들은 보통 바로 XML에 대한 소개와 View에 대한 소개부터 시작합니다. 그래서 초반에 조금 빠르게 진도가 나가게 됩니다. 하지만 필자는 기본이 충실하지 못하면 모래위에 성을 짓는 것과 같다고 생각하는 편이어서 시작부분에 다소 이론적인 부분을 많이 강조하게 됩니다. 초반에는 다소 느리지만 중반이후부터는 기본이 되어있기때문에 설명을 빠르게 전개시키는 편입니다. 제 강좌를 보고 계시는 분들은 이런 강좌 진행 방식을 참고하시고 보시기를 부탁드립니다.

반응형
반응형

 자. 그럼 안드로이드 프로젝트의 구조를 보겠습니다. 'Package Explorer'창을 보겠습니다.

 


 

 우선 'Hello'라는 프로젝트 폴더 안에 상당히 많은 폴더가 보입니다. 폴더의 이름들이 모두 단어를 줄여서 써놓은 것이라서 처음에 읽기 어려울 수도 있는 데 아주 단순한 단어들입니다. 단어만 알아도 역할이 짐작되는 이름들입니다. 지금 당장 저 폴더들이나 파일들을 모두 알 필요는 없습니다. 우선 각 폴더에 대한 간략한 소개만 하고 우리가 어플을 제작할 때 자주 다루게 되는 폴더와 파일들을 우선으로 소개하면서 강좌를 진행하고자 합니다. 가끔 시작부터 모든 내용을 완벽히 이해하면서 넘어가고자 하는 분들이 있는데 사실 좋은 자세이지만 현실적으로 매우 어렵습니다. 더하기도 못하는데 곱하기를 이해하려는 것과 같은 맥락입니다. 저 역시 모두 설명하면서 가면 좋겠지만 덧셈을 가르쳐야 곱셈을 설명할 수 있습니다. 제 강좌에서 나중에 설명하겠다고 하고 넘어가는 것들이 대부분 그런 상황입니다. 그래서 우선 현재 우선 알아야 하는 것부터 그리고 예제에 필요한 부분을 위주로 설명하면서 차츰 전체를 설명하고 자 합니다. 제가 강좌에서 설명없이 넘어가더라도 이점 양해 바랍니다. 

 

 우선 프로젝트를 생성할 때 마다 저 폴더들은 모두 포함되어 있으니 간략히 소개해 드리겠습니다.(버전업이 되면서 점점 폴더가 많아지고 있습니다. 소개한 거 말고 또 추가 될 수도 있습니다. )

 

 ㆍsrc(Source) 폴더

      - java언어로 만들어진 소스파일들이 위치하는 폴더입니다.

      - 실제 어플을 구동하고 컨트롤 하는 곳이죠. 바로 여러분들이 가장 많이 사용하게 되는 폴더입니다.

 

 ㆍgen(Generated Java Files) 폴더

      - java파일이 저장되는 폴더입니다.

      - src폴더와 달리 이름처럼 자동으로 파일들이 만들어 집니다.

      - 프로젝트내에서 어플에 사용되는 여러 Resource들을 손쉽게 java코드에서 사용할 수 있게 만들어주는 매우 중요한 폴더

      - 자동으로 파일과 코드가 작성되며 여러분이 수정할 수 없습니다. 설사 수정하더라도 저장되거나 적용되지 않으며 원상태를 유지함

 

 ㆍGoogle APIs, Android Private Libraries, Android Dependencies, libs 폴더

      - Activity Class 처럼 특정기능을 수행하도록 이미 설계되어 있는 클래스들이 선언되어 있는 압출파일들이 위치한 폴더

      - 일종의 클래스 파일들의 도서관 폴더

 

 ㆍassets 폴더

      - Resource 폴더에서 관리하지 않은 대용량 파일이나 글꼴파일, HTML파일들이 위치하는 폴더

 

 ㆍbin(Binary) 폴더 

      - 원시파일들을 컴파일한 class파일들이 위치하는 폴더

      - apk파일이 위치하는 폴더

 

 ㆍres(Resource) 폴더

     - 프로젝트에 사용되어지는 이미지나, 음원파일, 동영상파일, 문자열 값, 배치 등 모든 리소스파일들이 위치하는 폴더

     - 리소스의 타입별로 세부 폴더로 나뉘어져 관리하고 있음.(ex. drawable : 이미지파일, raw : 음원파일 etc..)

     - 사용하고자 하는 리소스파일을 드래그앤 드롭으로 추가할 수 있으며 자동으로 관리됨.(추후 설명예정)

     - 세부폴더의 이름은 정해져 있으며 기본적으로 만들어져 있는 폴더 말고 몇가지가 더 있음.(추후 설명예정)

     - 안에 사용하는 모든 파일들의 파일명은 영어소문자와 숫자만 사용

 

 ㆍAndroidManifest.xml 파일

     - 제작하고 있는 어플에 대한 정보 및 설정이 작성되어 있는 파일

     - 모든 프로젝트마다 이 이름의 파일은 하나씩 있으며 변경할 수 없음.(Hint. 이 설명을 듣고 프로그램의 시작점을 떠올리시면 Good!)

     - 모든 어플제작에서 가장 기본이며 중요한 파일

 

 ㆍ기타 파일들 

     - 프로젝트의 타겟버전 설정 등 어플이 구동되기 위해 필요한 기타 설정값을 저장하고 있는 파일들

     - 일반적인 어플을 제작할때는 건드릴 필요가 없는 파일들인 만큼 나중에 필요할 때 설명드리겠습니다.

 

 

  자. 이렇게 프로젝트 안에 자동으로 만들어져 있는 폴더와 파일들에 대한 간략한 이해를 해 봤습니다. 물론 위 내용은 말 그대로 간략한 이해 정도의 설명입니다. 어플을 제작하다 보면 자연스럽게 사용하게 되고 설명되어 지니 지금 당장 이 모든 구조와 의미를 확실히 이해하려고 하지 않으셔도 됩니다. 오히려 이 부분을 이해하려고 시간을 투자하다가 결국 제풀이 지쳐 포기하는 경우가 많습니다. 처음엔 뜬 구름잡듯이 이해하고 점점 학습하면서 뚜렷하게 실체화 시켜나가 보겠습니다.

 사실 간략한 설명이라고 하는 위 내용만으로도 슬슬 짜증나기 시작합니다. 이해가 쉽지 않으니까요. 자. 위 폴더와 파일들 중에서 실제 눈여겨 봐야 할 것으로 설명을 압축시켜 보겠습니다. 

 

 우선 안드로이드 프로젝트 안에 어떤 파일들이 추가 되든 만들어지든 상관없이 안드로이드 프로젝트는 크게 3가지 영역으로 나뉘어 관리된다고 보시면 됩니다.

 

 

 

 

  1. Java 원시파일

    - 안드로이드는 자바 언어로 만들어지는 만큼 'xxx.java'와 같이 자바 소스파일들이 있습니다.

    - 자바 소스파일들은 프로젝트 안에서 'src폴더','gen폴더' 2군데 위치하게 되는데 그 중 'gen폴더' 는 자동으로 만들어지고 수정되어 

      지는 곳이기 때문에 여러분들이 건드릴 일은 없습니다. 다만, 작성 된 코드 내용은 확인하고 이해하고 있어야 합니다.(추후 설명)

    - 결국 여러분들이 실제 만들게 되는 모든 java 소스파일은 src폴더에 위치하고 있습니다. 주로 여러분이 보시게 되는 폴더라는 거죠.

    - 지금은 하나의 자바파일만 있지만 앞으로 여러분들이 만들게 되는 자바 소스파일들은 이 폴더에서 생성하시면 됩니다.

    - 어플의 동작을 제어하는 코드가 작성된 파일입니다.

 

 2. 리소스 파일

    - Java 소스파일에 어플의 동작을 제어하는 코드를 작성하셨다면 이 폴더에는 보여지는 모든 자원들을 관리합니다.

    - 사실 Java 소스파일 만으로도 모든 개발이 가능하지만 디버깅도 용이하고 프로그래밍도 쉽게 할 수 있도록 그림이나 음원등과 같은

      파일들을 별도로 보관하고 있습니다. 자바에서 이 폴더의 파일들을 참조해서 화면에 보여준다고 생각하시면 됩니다.

 

 3. AndroidManifest.xml 파일

    - 어플 전체에 대한 설정 정보를 가지고 있는 파일입니다.

    - 프로그램의 총 관리자라고 보시면 되며 어플이 시작할 때 제일 먼저 읽어들이는 파일입니다.

 

 여러분들은 앞으로 기본적인 게임 어플을 제작하는 동안 위 3가지 영역의 파일들만 건드리게 될 겁니다. 나머지 폴더와 파일들은 나중에 보겠습니다. 대략적으로 프로젝트의 구성 폴더와 구조를 보았으니 위 'Hello'어플 프로젝트 예제가 실행되는 순서를 하나씩 보면서 프로젝트의 구조를 세세히 알아보겠습니다. 이 순서만 정확히 인지하시면 안드로이드 어플개발의 절반이상 이해 하셨다고 보아도 무방합니다.

 

 먼저 각 순서에대해 단계별로 설명하고 마지막에 전체 실행 흐름도(순서도)를 보여드리겠습니다.

 

 어플을 실행하면 프로세서가 프로젝트안에 있는 파일들을 읽어서 어플의 동작이 시작되게 됩니다. 다시 말하지만, 컴퓨터는 한번에 하나의 작업만 수행합니다. 아무리 여러줄의 코딩과 파일들이 있더라도 결국 한번에 하나의 파일과 한 줄을 실행하게 된다는 것이죠. 그 한 줄 한 줄을 따라가 보겠습니다. 본인이 컴퓨터의 프로세서라도 생각하시며 따라오시기 바랍니다.

 

1. 어플의 시작

 - 어플을 실행시키면 프로세서가 어플의 프로젝트안에 았는 많은 파일 중에서 가장 먼저 읽는 파일이 있습니다. C나 자바에서는 main메소드가 있는 파일이 제일 처음 읽어지고 실행되어지죠. 익히 알고계시겠지만 이 main메소드는 프로젝트 전체에 오직 하나만 존재해야 합니다. 프로젝트 마다 파일이름도 다르고 코딩 방식도 제 각각 일 수 있기때문에 어떤 메소드부터 시작해야 한다고 정해놓을 필요가 있는 거죠. 그래서 이 main메소드의 이름은 변경할 수 없는 것이고 유일하기 때문에 프로세서의 입장에서는 어떤 프로젝트던지, 그 안에 얼마나 많은 파일이 존재하던지 상관없이 미리 정해져 있는 main이라는 이름의 메소드를 호출함으로서 프로그램이 실행되도록 한 것이지요. 안드로이드도 이 원칙은 동일합니다. 다만, main메소드라는 이름이 없다는 것만 다른 것이지요. 결국 프로젝트마다 오직 하나만 존재하며 그 이름이 변하지 않는 파일을 찾으면 된다는 것 입니다. 안드로이드 프로젝트에서는 'AndroidManifest.xml'이 그 파일이라고 보시면 됩니다. 이 이름은 어떤 안드로이드 프로젝트를 생성해도 반드시 존재하며 유일한 파일입니다. C나 Java와 다르게 'xml'파일로 되어 있다는 점도 특이하죠. 마크업 랭귀지를 설명하고자 하는 강좌가 아니기에 xml에 대해 깊게 설명드리지는 않겠습니다. 모르시는 분들은 그냥 자바에서 클래스의 객체 생성을 'new 000()'라는 키워드 대신에 '<000 />'또는 '<000></000>'형태의 태그문으로 작성해 놓은 파일이구나 정도로 생각하고 강좌를 보시기 바랍니다. 연산자나 제어문을 가지지 않기 때문에 어떤 동적인 작업은 수행하지 않으며 단순히 보여지는 것들을 만들어 내는 파일이라고 보셔도 됩니다.

       

문자열 객체를 생성하는 방식 

 Java 언어

 xml 언어

 String aaa = new String("문자열입니다");

 <string name="aaa">문자열 입니다</string>

 

 크게 어려운 언어는 아니기 때문에 별도의 학습없이도 두 언어의 문법적 차이만 이해하셔도 앞으로의 예제를 수행하시는데 크게 무리가 없으실 겁니다.

 

 자. 이제 처음 프로세서가 읽어들이는 xml파일을 보겠습니다. 'Package Explorer'의 'Hello'프로젝트 안에서 'AndroidManifest.xml'파일을 선택해 보겠습니다. 아래 그림처리 'AndroidManifest.xml'파일의 열릴 겁니다.

 

 

 

처음 열려지는 모양은 'AndroidManifest.xml'의 내용을 언어적 코딩없이 수정할 수 있도록 마련된 일종의 마법사툴이입니다. 여러분의 편의를 위해서 만들어진 것이죠. 나중에 개발할 때는 사용하더라도 지금은 학습하는 단계이니 원래의 xml언어를 보도록 하겠습니다. 현재 오픈되어 있는 'AndroidManifest.xml'파일의 코드편집창 아래쪽에 보면 여러 tab이 보이실 겁니다. 그 중에 가장 마지막에 있는 xml tab을 클릭하시면 xml로 된 코드를 보실 수 있으십니다.

 

 AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>

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

    package="com.andsoft.hello"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="14" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.andsoft.hello.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

 

</manifest>


 

 코드를 처음보면 상당히 어려워 보일 수 도 있지만 형태를 먼저 보면 크게 어렵지 않습니다.

 

첫줄에 나오는 버전과 인코딩 방식은 xml파일마다 있는 것이니 나중에 알아보도록 하고 각 태그문의 내용은 나중에 생각하고 형태만 보면 결국 아래와 같습니다.

 

 <manifest>

      <uses-sdk />

      <application>

              <activity>

............

              </activity>

      </application>

</manifest>

                                                        

 자바에서는 new라는 키워드로 객체를 생성하듯이 xml에서는 <000></000>태그로 객체를 생성한다고 했습니다. 첫 줄에 보이는 <manifest>와 마지막 줄의 </mainfest>가 쌍을 이루고 있는 것이 보입니다. 즉, 가장 먼저 'mainfest'라는 이름의 클래스를 객체로 만들었다고 보시면 됩니다. 자바로 치면 'new manifest()'라고 코딩한 것으로 보면 됩니다. 'mainfest' 라는 이름의 클래스는 처음 보실 겁니다. 여러분이 만든 적도 없는 클래스 이고요. 단순하게 생각하시면 됩니다. 여러분이 자바에서 String 클래스를 만든적은 없지만 이미 java에서 만들어 놨기 때문에 그냥 사용할 수 있었듯이 mainfest라는 클래스도 역시 안드로이드에서 이미 만들어 놓은 클래스 라고 보시면 됩니다. 클래스를 만들때 클래스 안에 다른 클래스의 객체를 만들 수 있듯이 xml도 쌍을 이루는 태그문 안에 다시 태그문으로 다른 객체들을 포함 할 수 있습니다. <uses-sdk />태그도 마찬가지로 객체를 만든 것이고 다만 태그문이 <000></000>쌍으로 되어 있지 않고 <000/> 형태의 단일 태그문일 경우 그 객체 안에 다른 객체를 포함할 수 없다는 것입니다. 'application'객체는 안에 ' activity'객체를 가지고 있는 클래스객체라고 보시면 됩니다. 

 

 

  위 그림처럼 각 역할을 담당하고 있는 클래스 객체 안에 다른 객체가 포함되어 있는 구조라고 보시면 됩니다. 다른 역할이라기 보다는 세부적인 역할 담당이라고 보는 것이 맞을 것 같습니다. 그림의 설명처럼 각 클래스는 각각의 역할을 담당하고 있습니다. 간략한 설명이니 지금 당장 모두 이해하려 하지 말고 편하게 보시기 바랍니다.

 

 태그문의 작성은 자바에서 new 라고 했습니다. 한 줄씩 보면 제일 먼저 mainfest 객체를 생성합니다.

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

    package="com.andsoft.hello"

    android:versionCode="1"

    android:versionName="1.0" >

          .................

</manifest>

 

 태그문의 '<'와 '>'사이의 값들은 그 클래스의 속성값이라고 보시면 됩니다. 자바로 따지면 클래스의 멤버변수에 값을 주고 있다고 보면 됩니다. 

 

 xmlns(xml namespace) 속성  : xml의 name-space 지정

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

 

  mainfest의 첫번째 속성으로 xml의 네임스페이스를 지정한 것입니다. C++를 학습하신 분들은 들어보셨을 겁니다. '이름영역'이라는 이름이 말해주듯이 어떤 영역을 사용하겠다는 라는 것인데 여기 쓰여진 경로안에 여러분이 사용하시려는 클래스들이 정의되어 있으니 마음껏 가져다 사용해라 라는 것을 설정한 코드입니다. 디테일한 설명은 추후 기회가 되었을 때 설명하도록 하고 자동으로 작성되어 있는 만큼 이런게 있구나 정도만 보고 넘어가겠습니다.

 

 package attributes : 기본 패키지 지성

 package="com.andsoft.hello"


 두번째 속성은 기본 패키지를 설정하는 속성으로 프로젝트를 생성할 때 가장 먼저 application name을 적을 때 설정했던 패키지가 여기에 쓰여있습니다. 이 속성에서 기본패키지를 변경하는 것은 가능하지만 여기의 코드만 바꾸면 안돼며 Refactor 하셔서 수정 하셔야 합니다. 추후에 보도록 하겠습니다. 아래 나오겠지만 액티비티 명을 설정할 때 원래는 패키지명까지 모두 작성해야 하지만 기본패키지 안에 만들어져 있다면 생략이 가능합니다. 자바 소스파일을 만들때 의 기본 패키지값을 설정한 속성이라고 보면 됩니다.

 

 versionCode / versionName attributes 어플의 버전관리를 위한 속성 ( 마켓에 등록 할 때 필요)

 android:versionCode="1"

 android:versionName="1.0"


 세번째 속성은 여러분이 제작한 어플을 마켓을 등록할 때 필요한 속성으로 어플의 버전을 설정한 것입니다. 출시되어 있는 어플 중에서 베타버전이니 하는 것을 보신적이 있으실 겁니다. 구글 플레이 마켓에서는 이 버전 코드를 보고 등재하려는 어플이 기존의 어플을 버전업한것인지 신규 어플인지 구분하게 됩니다. 같은 이름의 어플(정확히는 apk)이 등재되더라도 버전 코드가 같다면 다른 어플로 인지되어 따로따로 등재됩니다. 만약 같은 이름의 어플을 등재하면서 버전코드를 달리하면 기존 어플의 위치에 새로 업로드된 어플이 등재됩니다. 버전관련 속성이 두개로 구분되어 있는데요 'versionCode' 가 중요한 속성으로 정수형 숫자로 1,2,3,4.....순으로 버전을 구분해 줍니다. 여러분이 처음 이 속성을 '1'로 어플을 등재하고 버전업을 하시고자 한다면 새로만든 어플은 이 속성을 '2'라고 쓰시면 됩니다. 번호를 증가하면서 계속 버전업 하는 방식이죠. 'versionName'은 가독성을 위한 것으로서 사용자들에게 보여지는 버전 이름 입니다. 1,2,3,4...식의 단순 숫자 버전이 아니라 버전 '1.1','1.2' 또는 'alpha', 'beta' 이런 식으로 우리가 의미를 이해하기 쉬운 버전의 이름을 문자열로 부여하는 속성입니다. 안드로이드도 '아이스크림 샌드위치'라는 버전 이름이 있지만 실제 API의 버전이름은 '14'버전인 것 처럼 사용자가 구분하기 쉽게 하기 위한 버전의 닉네임 같은 것입니다. 실제 중요한 버전값은 'versionCode'입니다. 다음을 보겠습니다.

 

 현재 만들어져 있는 mainfest는 객체안에 이 어플을 구동하기 위한 최소버전과 타겟버전을 멤버변수로 가지고 있지 않고 따로이 이 값들을 관리하는 객체를 별로도 두고 관리하고 있습니다. 예전에 사용하던 스마트폰(프로요버전같이)에서 새로나운 어플이 실행이 안되는 경우가 있죠. 바로 이 객체의 속성값에 의해 결정되는 것인데요. 내가 만들고 있는 이 어플을 구동할 수 있는 최소한의 버전과 타겟 버전을 설정하는 것입니다. 이름 그대로 'uses-sdk' 객체 입니다. 이 버전의 sdk를 사용하겠다라고 읽어지네요. 

 

 uses-sdk : 어플이 동작하는 환경의 API Level을 정의하는 것으로 최소버전과 타겟버전을 지정한다.

 <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="14" />


 두가지 속성 모두 이름에서 의미를 잘 보여주고 있습니다. 첫번째 보이는 'minSdkVersion' 속성은 이 어플이 구동될 수 있는 'minimum', 즉, 최소한 'API 8'버전 이상의 안드로이드 폰에서만 구동된다라는 속성값입니다. 'targetSdkVersion'값은 이 어플은 기본적으로 'API 14' 버전을 타겟으로 구동된다는 것으로 이 속성값의 에뮬레이터가 구동됩니다. 인터넷에서 곰플레이어와 같은 프로그램을 다운받아 설치할 때 설치할 수 있는 운영체제 버전이 있는 것과 같은 원리입니다. 프로젝트를 생성할 때 처음 단계에서 입력했던 값이 여기 쓰여지며 이 곳에서 속성값을 변경할 수 있습니다. 'minSdkVersion'이 작으면 모든 스마트폰에서 구동 될 수 있으니 더 좋겠다고 생각될 수도 있으나 안드로이드에서 API를 버전 업하면서 만들어 준 좋은 클래스들을 사용 못하는 경우가 있으니 적절히 선택하시는게 좋습니다. 강좌를 학습하시다보면 이 의미를 차츰 알게 되실 겁니다. 조급해 하지 마세요.

 

다음은 'application' 객체 입니다. 

 <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        

        ....................................................

 

    </application>

 

이름 처럼 우리가 만들 어플의 실질적인 관리 객체입니다. 'manifest'객체는 어플의 동작이나 내용은 관리하지 않고 버전이나 sdk사용 허가 등과 같은 대외적인 업무를 담당하는 객체였다면 application은 실제 어플의 동작과 구성을 담당하고 관리하는 객체입니다. 

 

 설정되어 있는 속성을 살펴보겠습니다.

 

 allowBackup : 어플이 시스템의 백업/복구 정책을 사용할 것인지를 설정하는 속성으로 기본값은 'true'

 android:allowBackup="true"

 

 


 icon : 어플이 스마트폰에 설치되었을때 보여지는 아이콘을 설정합니다.

 android:icon="@drawable/ic_launcher"

 

 여기서 속성에 지정한 값을 주의깊게 볼 필요가 있습니다. 지정한 값이 '@'문자로 시작하는데요. xml에서 '@'기호는 이 xml파일 말고 다른곳에 있는 Data를 지정할 때 사용하는 것인데요. 안드로이드에서는 '@'으로 시작하면 프로젝트 폴더 안에 있는 'res 폴더'를 지칭한다고 보시면 됩니다. (자바코드를 설명할 때 추가로 설명드리겠습니다. 지금은 그냥 이렇게만 이해해 주시기 바랍니다.)

 

 'Package Explorer'에서 'Hello'프로젝트의 'res'폴더를 선택하시면 하위 폴더들이 보여집니다.


   

 'res 폴더'의 하위에 많은 폴더들이 보이실텐데 리소스의 타입(이미지,음원,동영상,문자열 등)에 따라 구분지어져 관리되고 있습니다. 폴더 명은 정해진 것이며 변경하시면 안됩니다. 

 

 리소스 타입별 폴더

ㆍdrawable : 사진이나 그림같은 이미지파일이 위치 (.png, .jpg, .bmp등)

ㆍlayout : 화면에 보여지는 View들을 어떻게 배치할 것인지에 대한 배치설계도 같은 xml 파일이 위치 ( .xml)

ㆍmenu : 메뉴버튼이 눌려졌을 때 보여지는 menu의 설계도 파일이 위치( .xml )

ㆍvalues : 문자열(안드로이드에서는 화면에 보이는 문자열을 직접 쓰기 보다 별도로 리소스로 관리하는 것을 권장함), 스타일등의 파일 

 

'drawable'과 'values' 폴더의 경우 '-'과 더불어 여러 폴더로 나뉘어져 관리되는데 어차피 안드로이드는 이 중 하나의 폴더만 사용합니다. 여러개의 폴더가 있는 이유는 사용자의 스마트폰마다 크기나 해상도, 버전이 다르기 때문입니다. 만약 사용자의 스마트폰이 'hdpi'의 해상도를 가지고 있다면 'darwable'폴더 중에서 '-hdpi'폴더 안의 리소스를 선택하게 됩니다. 자동으로요. 각 해상도 마다 알아서 해당하는 해상도의 'drawable'폴더을 찾아서 리소스를 사용합니다. 만약 해당하는 해상도안에 리소스파일이 없으면 다른 폴더에서 찾아서 보여줍니다. 즉, 어차피 안드로이드의 입장에서는 'drawable'의 여러 구분 폴더들과 상관없이 하나의 폴더로 보고 사용하고 있다는 것 입니다. 해상도가 다른 스마트폰에서는 본인 해상도에 맞게 자동으로 조정해 주는데 이때 다소 이미지의 퀄리티가 저하되기 때문에 가급적 각 해상도마다 이미지를 만들어 놓는 것이 좋습니다.(기본으로 만들어진 프로젝트에도 아이콘으로 사용하는 이미지(ic_launcher.png)가 있는데 각 해상도별도 같은 그림이지만 크기가 다른 파일이 위치한 것을 확인할 수 있습니다.) 본 강좌에서는 각 해상도별로 이미지파일을 만들기 번거롭기에 타겟으로 사용하고 있는 에뮬레이터의 해상도(hdpi)를 기준으로 'drawable-hdpi'폴더에만 이미지를 위치하도록 하겠습니다.

 

 다시 'icon'속성의 값을 보면 '@drawble/'로 되어있죠. 예상할 수 있듯이 '@'은 'res'폴더를 말하고 있으니 'res'폴더 아래 'drawable'폴더를 지칭한다는 것을 알 수 있죠. 'ic_launcher'는 딱 봐도 'drawable'폴더 안에 있는 png 그림 파일 임을 직감할 수 있습니다. 사실 이 설명은 이해를 돕기 위한 것인데 '@drawable/ic_launcher'가 마치 파일경로를 작성한 것 같아 보이지만 그런 건 아닙니다. 이에 대한 설명은 자바 코드에서 다시 설명할 예정입니다.

 

 

 

 label : 어플이 스마트폰에 설치되었을때 보여지는 이름을 설정합니다.

 android:label="@string/app_name"

 

 아이콘이 지정되었으니 아이콘 및에 보여지는 어플이름을 설정해야 겠죠. 문자열로 값을 입력하면 됩니다. 이 속성의 값으로 "aaa"라고 쓰면 어플이름이 'aaa'로 보여지는 겁니다. 우리가 실행시킨 어플은 'Hello'라는 이름으로 되어 있습니다. 그런데 이 속성의 값은 'Hello'가 아니네요? 위에서 잠시 설명했지만 안드로이드에서는 문자열도 하나의 리소스(자원)으로 보고 있고 그렇게 사용하길 권장합니다. 나중에 디비깅이나 관리가 용이하기 때문이죠. 물론 그냥 ' android:label="Hello" ' 라고 써도 같은 결과를 볼 수 있습니다. 만약 직접 문자열을 쓰면 노란색 줄이 가면서 리소스형태로 사용하도록 요구할 겁니다. 동작에는 아무런 영향을 주지 않으니 신경쓰지 않으셔도 됩니다. 말 그대로 권장사항입니다. 그럼 '@string/app_name'값이 어떻게 'Hello'라는 글씨로 보일까요. 위에 아이콘지정 방식과 같으니 한번 알아볼겸 따라가 보죠. '@'으로 시작하니 'res'폴더를 의미하고 '@string/'이니까 'string'이라는 폴더가 있겠구나. 하고 보니 'string'이라는 폴더가 보이지 않습니다. 안드로이드에서는 스타일,치수,문자열 같은 값은 'values'라는 폴더에 각 이름에 해당하는 xml파일을 만들어 놓았습니다. 'values'폴더안에 'strings.xml'이 보이실 겁니다. 아무리 봐도 'res'폴더안에 string은 여기 밖에 없으니 '@string/'가 이 파일을 지칭하고 있다는 것을 알수 있겠죠. 이름처럼 '문자열들'을 모아놓은 파일이라고 보시면 됩니다. 이 파일을 선택해서 열어보겠습니다.

 

 strings.xml

 <?xml version="1.0" encoding="utf-8"?>

<resources>

 

    <string name="app_name">Hello</string>

    <string name="action_settings">Settings</string>

    <string name="hello_world">Hello world!</string>

 

</resources>

 

필요한 부분만 설명드리겠습니다. 앞에서 xml과 java에서 문자열 객체를 생성하는 문법적 차이를 설명했었죠. 보시고 해석이 되시나요?

       

 Java 언어

 xml 언어

 String app_name = new String("Hello");

 String action_settings=new String("Settings");

 String hello_world=new String("Hello world!");

 <string name="app_name">Hello</string>

 <string name="action_settings">Settings</string>

 <string name="hello_world">Hello world!</string>

 

 이 파일은 3개의 문자열 객체를 만들고 있으며 각 각 이름과 값이 주어져 있다는 것을 알 수 있습니다.  '@string/app_name' 설정값은 저 3개의 문자열 객체중에서 첫 번째 객체를 지칭하고 있다는 것을 알 수 있으며 'app_name' 문자열 객체의 데이터가 "Hello"인 것을 확인 할 수 있습니다. 즉, 저 xml의 값을  '<string name="app_name">헬로우</string>'라고 한글로 바꾸면 어플이름이 한글로 바뀌게 되는 것입니다.

 

 theme : 어플화면의 기본적인 테마를 지정합니다. 

 android:theme="@style/AppTheme" 

 

 테마는 강좌를 진행하면서 설명하고자 합니다. 지금은 기본테마로 하얀색 바탕화면을 가지고 검정색 바탕의 제목표시줄과 액션바가 보여지는 테마라고만 생각하시기 바랍니다.

 

 지금까지 설명드린 'application' 객체는 본인 안에 어플을 구성하는 4가지 컴포넌트(구성요소) 객체를 가질 수 있습니다.

 

 어플을 구성하는 4대 컴포넌트 클래스

ㆍActivity : 화면 인터페이스를 담당하는 클래스. 화면에 무엇인가를 보여주려면 이 클래스를 상속받아 구현합니다.

ㆍService : 화면에 보이지는 않지만 백그라운드에서 동작하고 싶은 작업이 있다면 이 클래스를 상속받아 구현합니다. (mp3 플레이어)

ㆍBroadcast Receiver : 네트워크의 상태변화나 문자수신 등 스마트폰의 변경내역 수신을 담당하는 클래스. 

ㆍContent Provider : 다른 어플과의 Data 전달을 담당하는 클래스. 

 

위 Component 클래스는 어플제작과정에서 매우 중요한 역할을 담당하고 있으니 시간을 두고 다시 설명드릴 예정입니다. 모든 어플은 위 4가지 컴포넌트 중에 하나는 반드시 사용하게 됩니다. 반드시 4개다 다 사용되야 하는 것은 아닙니다. 일반적인 어플을 개발한다면 화면에 무엇인가 보여주는 내용이 없을 수 없으니 화면을 담당하는 'Activity' 는 반드시 포함되어 있습니다. Activity는 한번에 하나의 화면만을 담당하고 있기때문에 여러페이지의 화면으로 이루어진 어플을 제작할 경우에는 Activity 클래스가 여러개 존재하게 됩니다. 현재는 화면에 간단하게 'Text'하나만 보여주는 어플이기 때문에 Activity가 하나 포함되어 있습니다. 위 4대 컴포넌트는 반드시 'AndroidManifest.xml'에 사용한다는 것을 등록해 주어야 합니다. 다른 클래스파일들은 src폴더에 만들어서 사용하기만 하면 되지만 4대 컴포넌트들은 소스파일을 만들고 이곳에 반드시 작성해 두어야 합니다. 지금은 이해가 어려울 수 있으니 그렇구나 정도만 이해하고 넘어가셔도 됩니다.

 

 코드를 보면 'application'안에 'Activity'가 하나 있는 것을 볼 수 있습니다.

<activity

      android:name="com.andsoft.hello.MainActivity"

      android:label="@string/app_name" >

      <intent-filter>

           <action android:name="android.intent.action.MAIN" />

           <category android:name="android.intent.category.LAUNCHER" />

      </intent-filter>

</activity>

 

앞에서 언급했듯이 하나의 application안에 여러 페이지의 화면이 구성되어 있을 수 있습니다. 그럴 경우 이 영역에 다른 'activity'들을 작성해 놓아야 합니다. 만약 페이지가 3개로 구성된 어플의 경우는 아래와 같은 형태로 작성해야 합니다. 

 <activity android:name="com.andsoft.hello.MainActivity" >

 </activity> 

 

<activity android:name="com.andsoft.hello.SecondActivity" >

 </activity> 

 

<activity android:name="com.andsoft.hello.ThirdActivity" >

 </activity> 

 

여러 페이지의 Activity 구성은 나중에 소개하도록 하겠습니다.

 

현재 우리의 'Hello'프로젝트 안에는 하나의 Activity가 있습니다.  Activity의 속성을 살펴보겠습니다.

 name : Activity 클래스를 상속받은 클래스의 이름을 패키지명과 함께 지정합니다.

 android:name="com.andsoft.hello.MainActivity"

 

 Activity가 여러개 있을 수 있다고 했죠? 당연히 각 Activity들을 구별하기 위한 이름이 필요합니다. 그 속성이라고 보시면 됩니다. 위에 여러 액티비티의 작성 예에서 보시면 각 Activity마다 이름이 다른 것을 보실 수 있습니다.

 

 현재 name 속성의 값을 보면 'com.andsoft.hello.MainActivity' 로 되어있죠. 이전 강좌에서 살펴보았던 'MainActivity.java' 소스파일이 기억나십니까?

 

 MainActivity.java

 public class MainActivity extends Activity{

         ...........................

}

 

이 자바파일안에 있는 클래스의 이름을 속성값으로 부여한 것입니다. xml에서는 <000></000>태그문으로 000객체를 생성한다는 설명 기억나시나요? 결국 이 태그문에 의해 자바소스파일의'MainActivity'클래스가 객체로 만들어 지는 것입니다. 저번 강좌에서 자바파일에 대해 설명할때 객체를 생성하는 코드가 어디에도 없다고 했었죠? 바로 여기에 있습니다.

반응형

+ Recent posts