Full Stack Web Developer.
Syaku (샤쿠)

Java, JS (ES6+), Spring, Spring security, jQuery, Reactjs, Bootstrap.

        

08-04 05:26


Spring Boot 2 보기 Front-end 보기 DevOps 보기 Spring 3 보기 Spring Security 3 보기

안드로이드 응용프로그램 자원관리 : Android Application Resource

written by Seok Kyun. Choi. 최석균

안드로이드 응용프로그램의 화면을 어떤 자원으로 구성하는 지 알아보자.

운영체제 : Windows Vista
※ 안드로이드 : Android SDK 2.1
※ 자바 : Java 2 SDK 5.x

※ Project name : resource
※ Application name : ResourceApp
※ Package name : com.syaku.ex

안드로이드의 자원은 문자열,이미지, 오디오 등등 응용프로그램에 사용되는 모든 데이터를 하나의 자원 클래스에 담아서 사용한다.
이클립스에서 프로젝트를 임의적으로 생성하고, AVD도 맞게 구성하자. 그리고 아래의 작업을 진행하면 된다.
무슨 내용인지 모를 경우 이전 포스팅을 참조하면 된다.

<샘플파일>


 자원 활용법

/res/values/strings.xml 파일을 Open with Text Editor 열어서 간단하게 문자열을 출력해보자. 화면출력은 /res/layout/main.xml 에서 담당하며, 아래와 같이 작성한다. 주석된 부분에 파일명을 작성해 두었다 참고하자.

<!-- /res/values/strings.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TextView</string>
    <string name="hello">Hello World, TextView!</string>
    <!-- syaku 추가 -->
    <string name="syaku">syaku.tistory.com 한글 <b>Good</b>!!!</string>
</resources>

<!-- /res/layout/main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />

<!-- syaku 추가 -->
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/syaku"
    />
</LinearLayout>

wrap_content : 컨텐츠가 표시할 수 있는 영역 모두를 사용한다..
fill_parent : 상위 컨텐츠가 사용하고 남은 영역을 활용한다. 웹페이지처럼 줄바꿈 효과가 나타난다.
실행하면 아래와 같은 내용이 출력된다.


안드로이드는 웹에 사용되는 html 태그의 <b>볼드</b> <i>이탤릭</i> <u>밑줄</u> 세개 요소를 지원한다.
strings.xml /gen/R.java 에 자동으로 이클립스 플러그인 의해 재코딩되게 된다. 이는 안드로이드에서 응용프로그램을 구동할 때 최적에 상태를 구현하기 위해 필요한 자원들을 실질적으로 사용할 수 있게 만들어주는 과정이라고 보아진다. R은 Resource 의 R자를 사용한 것 같고, /res/ 폴더 하위에 생성되는 자원들은 모두 R.java 로 재컴파일 된다고 생각된다.

이번에는 안드로이드 SDK 를 이용하여 글자 크기나 색깔을 변경해보자. 위의 소스를 이용하여 작성하자.

<!-- /res/values/strings.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TextView</string>
    <string name="hello">Hello World, TextView!</string>
    <!-- syaku 추가 -->
    <string name="syaku">syaku.tistory.com 한글 <b>Good</b>!!!</string>
    <dimen name="textPointSize">14pt</dimen>
    <color name="textColor">#338848</color>
</resources>

<!-- /res/layout/main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />

<!-- syaku 추가 -->
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/syaku"
    android:textSize="@dimen/textPointSize"
    android:textColor="@color/textColor"
    />
</LinearLayout>

<실행화면>


strings.xml 에는 <dimen name="textPointSize">14pt</dimen> <color name="textColor">#338848</color> 두개의 노드가 추가되었다.
dimen 은 크기이며, color 은 색깔을 의미한다. name 은 임의적으로 정의할 수 있다.
main.xml 에는 TextView 노드에 android:textSize="@dimen/textPointSize" android:textColor="@color/textColor" 속성이 추가되었다.

속성은 안드로이드 SDK 에 정의된 클래스 메소드와 연관된다. 구성패턴은 레퍼런스에서 확인하면 된다.
안드로이드 SDK 레퍼런스 http://developer.android.com/reference/packages.html
R.attr 클래스 http://developer.android.com/reference/android/R.attr.html
R.attr 클래스를 참고하면, 저장소를 구현하는 데 도움이 된다.

실질적으로 strings.xml 에만 자원을 코딩하지 않는 다. 세부적으로 분할수 있으며, 다음과 같이 간력하게 소개하겠다.

문자열 : /res/values/strings.xml : <string>
문자열배열 : /res/values/arrays.xml : <string-array>
색상 : /res/values/colors.xml : <color>
크키 : /res/values/dimens.xml : <dimen>
단순 표시물? : /res/values/drawables.xml : <drawable>

더 많은 자원이 있지만, 나머지는 생략한다. 위 처럼 각 자원은 다른 작업에서 자원을 활용할 수 있다.

이미지파일은 /res/drawable/ 에 저장되게 되는 데. 상위 버전으로 업데이트하면서 drawable 폴더가 해상도에 따라 세분화되었다. (네이버 지식in 답변 , 안드로이드 공식 가이드 참조)
일반적인 작업은 drawable-mdpi 폴더에 넣고 하면된다. 적당한 이미지를 본 폴더에 복사하자. 이클립스에서 인식되게 해당 프로젝트를 선택하고 F5 새로고침하면 파일이 해당경로에 노출된다. 이미지 파일명은 [a-z0-9_.] 조합만 가능하다.

/res/layout/main.xml 열어 아래의 코드를 추가하자. 이미지 파일명 : syaku.png

<!-- button add -->   
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="최석균 안드로이드 추천 ^-^ "
    />
<!-- image add -->
<ImageView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:src="@drawable/syaku"
    android:scaleType="center"
    />

<실행화면>



자바코드에서 자원 활용법

작업에 앞서 안드로이드 SDK 응용프로그램의 로그를 확인하는 방법을 소개한다. 로그클래스를 상단에 임포트시키고 다음과 같이 사용된다.
Log.e() 오류를 기록한다.
Log.w() 경고를 기록한다.
Log.i() 정보성 메세지를 기록한다.
Log.d() 디버그 메세지를 기록한다.
Log.v() 상세 메세지를 기록한다.

/src/com.syaku.ex/ResourceApp.java 연다. 아래와 같이 작성하자.

package com.syaku.ex;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log; // Android Log Classes Import

public class ResourceApp extends Activity {
    /** Called when the activity is first created. */
    private static final String DEBUG_TAG= "ResourceApp Log";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // strings.xml -> name=syaku
        String myResourceString = getResources().getString(R.string.syaku);
        // debug output
        Log.d(DEBUG_TAG,myResourceString); 
    }
}

위와 같이 작성하고 저장후 실행하면된다. 그러나 디버깅은 확인할 수 없을 것 이다. 확인하려면 안드로이드 로그창인 LogCat 을 활성화 시켜야한다. 다만 한글이 깨지는 문제가 있으니, 활성화 방법만 참고하자.





한글로그보기 : http://www.cleancode.pe.kr/?p=68 

-- 프롬프트창을 유니코드로 실행함.
c:\> cmd /u
-- 캐릭터셋을 변경함.
c:\> chcp 65001
-- 프롬프트창의 속성에서 폰트를 Lucida Console 변경함.
-- LogCat 실행
c:\> adb logcat

자바코드에서 자원을 어떻게 활용할 수 있는 지 아래의 소스코드를 참고하고 실질적으로 콘솔(AVD) 화면에 출력하는 것이 아니라 로그로 결과값을 확인할 것이다.

** 프롬프트 창을 유니코드로 변경 후 작업이 끝나면 원래대로 ANSI 로 변경해야 한다.
다른 작업을 할 경우 실행파일이 구동되지 않는 문제가 발생한다.

c:\> chcp 949
-- 프롬프트창의 속성에서 폰트를 굴림체로 변경함. 저장 및 확인 한다.

/res/values/strings.xml
<string name="you">총 : %1$d점 중 점수 %2$d 를 얻어, 당신의 &lt;b&gt;%3$s&lt;/b&gt; 입니다.</string>

문자열을 추가한다. c언어에서 볼수 있는 구문이다.

/src/com/syaku/ex/ResourceApp.java
package com.syaku.ex;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ResourceApp extends Activity {
    /** Called when the activity is first created. */
	private static final String DEBUG_TAG= "ResourceApp Log";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        String you = getResources().getString(R.string.you);
        String result = String.format(you, 10, 5, "패배자");
        Log.d(DEBUG_TAG,result);
    }
}

결과 : D/ResourceApp Log(  712): 총 : 10점 중 점수 5 를 얻어, 당신의 <b>패배자</b> 입니다.

자바코드로 화면에 문자열 출력하기

/res/layout/main.xml 파일을 열고, syaku 추가를 아래와 같이 수정하자.

<TextView 
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/syaku"
    android:textSize="@dimen/textPointSize"
    android:textColor="@color/textColor"
    />

adnroid:id="@+id/text" 를 삽입했고, id를 이용하여 자바코드에서 제어할 수 있게 된다.

/src/com/syaku/ex/ResourceApp.java 파일을 열어 아래와 같이 수정하자.
package com.syaku.ex;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class ResourceApp extends Activity {
    /** Called when the activity is first created. */
	private static final String DEBUG_TAG= "ResourceApp Log";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        String you = getResources().getString(R.string.you);
        String result = String.format(you, 10, 5, "패배자");
        Log.d(DEBUG_TAG,result);
        
        // TextView 선언
         TextView tv;
        
        // 문자열 자원을 이용한 동적 삽입        
         tv = (TextView)findViewById(R.id.text);
        tv.setText(result);

        /* 다양한 효과주기 */
        tv.setTextColor(0xFFFFFFFF); // # : 0xFF
        tv.setTextSize(12); // px
        tv.setBackgroundColor(0xFFFF0000);        
    }
}

<실행화면>


posted syaku blog


『  Links  

시작하세요 안드로이드 프로그래밍
카테고리 컴퓨터/IT
지은이 셰인 콘더 (위키북스, 2009년)
상세보기

안드로이드 SDK 레퍼런스 : http://developer.android.com/reference/packages.html

http://syaku.tistory.com

댓글 남기기
◀ PREV 1···170171172173174175176177178···313 NEXT ▶