mfc에서 언어별 리소스 관리하기

Posted on 2014. 1. 2. 15:50
Filed Under IT/mfc

mfc 프로젝트에서 다양한 언어를 지원해야할 경우에 사용하는 방법입니다.

 

dll로 분리하여 관리하면 한 프로젝트에서 리소스를 관리하는것 보다 조금 더 정리된 상태에서 관리가 가능합니다.

그리고 개발자가 직접 코드를 수정하지 않고 외부 인력이 번역하여 수정할 수 있기 때문에 개발자가 조금 더 편할수 있습니다.ㅎㅎ

 

이 예제는 vs2012에서 작성하였습니다.

 

1. dll 프로젝트를 생성합니다.

저는 아래와 같이 MFC DLL을 선택하였습니다.

 

 

쭉쭉 진행~

 

 

2. 원본 프로젝트의 resource.h, *.rc, res폴더를 새로 만든 프로젝트에 복사합니다.

 

3. 파일을 복사한 후 새로만든 프로젝트의 *.rc파일을 삭제하고 덮어 씌운 원래 프로젝트의 *.rc파일을 새로만들어진 프로젝트의 *.rc파일로 변경합니다.

이렇게 변경하면 원래 프로젝트의 리소스를 그대로 가져올 수 있습니다. 

 

4. 가져온 리소스를 변경을 원하는 언어로 변경합니다.

변경 방법은 리소스에 마우스 우클릭하여 복사본 삽입메뉴를 선택하면 됩니다. 

 

 

 5. 원하는 언어를 선택합니다.

저는 영어를 선택했네요.

 

 6. 아래와 같이 IDD_ABOUTBOX가 영어 버전이 추가되었습니다.

원래의 IDD_ABOUTBOX는 필요없으므로 이제 삭제합니다. 영어버전만 남깁니다.

프로젝트 이름이 이상하지만 무시하고 계속 진행.

 

7. 빌드하면 dll파일이 생깁니다.

 

 

 

 8. 전 최종적으로 이런식으로 프로젝트를 생성하였습니다.

 

 

9. 아래와 같이 코드에 적용하면 끝.

 코드는 사용자 설정 언어를 파악하여 원하는 언어를 선택하는 부분입니다.

 LoadLibrary호출 후 AfxSetResourceHandle을 통해서 리소스를 선택하면 적용됩니다.

 

 최근에 확인했는데 GetUserDefaultLangID()가 시스템 언어는 읽지만 표시언어는 제대로 못읽는거 같네요. GetSystemDefaultLangID()도 마찬가지구요. 이게 윈도우 특성을 탈지도 모르겠네요. 해본 사람마다 말이 달라서...

일단 저는 GetUserDefaultUILanguage()로 해결했습니다.

 

 

구글 맵 사용하기(Google Maps Android API v2)

Posted on 2013. 8. 6. 15:10
Filed Under IT/안드로이드

핵심

1. google-play-services-lib 필요

2. 구글 지도를 사용하기 위한 api key 필요

 

간만에 구글 지도 사용하기에 대해서 적어 볼까 합니다.

작업하면서 느낀점은 이상하게 그냥 안될때가 있더라는점 입니다.

 

웹 상에 보시면 안될때 이것저것 하라고 하는게 몇가지 있던데 그래도 안되면 그냥 Google APIs에서 프로젝트를 새로 생성하거나 이클립스에서 프로젝트를 삭제하고 다시 만든 후에 코드를 붙여넣기로 넣어보세요.

 

저는 하루종일 뻘짓하다가 Google APIs에서 프로젝트 새로 생성해서 키 생성하니까 잘 되네요.

 

구글 지도 사용 순서는 웹상에 많으므로 간단히 정리하는 차원에서 적어봅니다.

 

1. Android SDK Manager를 통해서 Google Play services를 다운 받습니다.

 

2. 다운 받은 Google Play services를 워크스페이스로 가지고 와야 합니다.

이클립스에서 File > New > Other > Android Project from Existing Code 를 선택합니다.

 

아래의 경로를 선택해서 프로젝트를 가져옵니다.

android SDK 폴더\extras\google\google_play_services\libproject\google-play-services_lib

 

3. Package Explorer에서 구글 지도를 사용할 프로젝트 이름에서 우클릭하여 Properties > Android를 선택합니다.

그러면 아래와 같이 아래쪽에 Library부분이 비어 있을 텐데요.

 

 

Add...버튼을 누르고

 

 

google-play-services_lib를 선택합니다.

 

 

짜잔... 위와 같이 나오면 1차 설정은 끝.

 

4. 이제 구글에서 API키를 발급 받아야 합니다.

먼저 google api console로 들어갑니다. 여기서 프로젝트를 따로 관리하실 분은 프로젝트명을 바꾸셔도 되구요.. 테스트니까 일단 그냥 ㄱㄱ

요렇게 Services로 들어갑니다. 프로젝트 이름은 모자이크...

 

서비스를 내리다보면 Google Maps Android API v2 항목이 있습니다. 이것을 체크해서 ON으로 설정합니다. 주의 사항은 Google Maps API 가 아니라는 점입니다.

 

 

체크를 했으면 다음 단계로...

 

이제 Google APIs에서 API Access 메뉴를 선택합니다.

그리고 아래쪽의 Create New Android Key버튼을 선택해서 키 생성 다이얼로그를 띄웁니다.

 

 

다이얼로그 하단에 예제가 있습니다. 사용중인 서명파일의 SHA1 인증키와 패키지 명을 이용해서 키를 생성하면 됩니다.

 

현재는 디버깅 모드에서 사용할 것이므로 디버그용 서명파일의 키를 이용합니다.

 

적다보니 할일이 참 많네요.

 

디버그용 서명파일의 키는 이클립스에서 Window > Preferences > Android > Build에서 확인할 수 있습니다. 아래의 이미지를 참고하세요.

 

 

(내용추가)

정식 인증서에서 인증서 지문(SHA1) 얻을때는 아래와 같이 넣어주면 됩니다.

keytool.exe -list -keystore test.keystore(인증서명) -keypass aaa123(패스워드) -storepass aaa123(패스워드)

 

 

위에서 얻은 키를 아래와 같이 SHA1키;패키지명 형식으로 넣습니다.

 

생성하면...

 

짜잔~ 이제 이렇게 키가 추가되었네요.

 

이제 사용만 하면 끝.

 

5. 쓰는 김에 사용법까지 올려야 겠네요.

내용은 별게 아닌데 무지 기네요. 성의 없이 대충 적고있습니다.

 

먼저 AndroidManifest.xml 파일에 권한과 키값을 적습니다.

 

먼저 권한입니다. 아래의 권한을 추가해 주세요. 위치는 application바깥쪽에 위치하게 하면 됩니다.

 

<permission
        android:name="com.u_kids.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.u_kids.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

 

두번째 키값을 넣습니다. 키값도 AndroidManifest.xml에 넣으면 됩니다.

application태그 사이에 요렇게 넣습니다.

4번 과정에서 마지막에 얻은 API Key입니다..

 

... 

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyAoBXPGU_2ShfPingNFlQT-tYlBKIC9rPE" />
</application>

 

사용할 때는 fragment를 이용하면 간단하게 사용할 수 있습니다.

 

 

써놓고 정리를 좀 하려고 했는데 정리가 안되네요. 쓴지 좀 지났지만 이제라도 올려봅니다.

저도 시간이 지나니까 기억이 안나서 정리가 필요하네요.

GCM메시지 사용법도 올려야 하는데... 요즘 너무 바쁘네요.ㅠㅠ

ADT업데이트 후 java.lang.NoClassDefFoundError에러 발생하는 문제

Posted on 2012. 4. 6. 14:12
Filed Under IT/안드로이드

 

금요일이고해서 일도 쉬엄쉬엄 할 겸 안드로이드 글이나 좀 보면서 이클립스 ADT를 업데이트했는데요.

업데이트 후에 잘 되면 앱이 에러를 뿜네요.

DDMS에서 메시지를 보니 대략 이런 메시지가 보이네요.

 04-06 13:50:46.567: E/AndroidRuntime(3901): Caused by: java.lang.NoClassDefFoundError: tool.parameter.Parameters

ADT를 업데이트했더니 이클립스에선 잘 인식하는데 실제 동작에서 클래스를 못 찾습니다.

무슨 일인가 찾아보니 ADT 17에서 뭔가 바뀐것 같습니다.

원래 저는 라이브러리를 lib폴더에 넣고 빌드패스를 넣어서 쓰고 있었는데요.

문제를 해결하려면 libs폴더에 사용자가 추가한 라이브러리를 넣으면 되는것 같네요.

추가적으로 빌드패스도 필요없어졌네요.

제 경우엔 lib폴더를 libs로 이름만 바꾸니까 되네요. 빌드패스도 필요없어서 뺐습니다.

 

살짝 궁금해서 찾아봤는데요.

이클립스 패키지 익스플로러를 잘 보면

Android Dependencies라는 못보던 폴더가 생겨있고 속성을 보면

com.android.ide.eclipse.adt.LIBRARIES 이런게 보이네요.

이제 실행되니까 뭐 깊게 팔 필요있을까 싶어 더이상 찾는것은 접었습니다.

여기까집니다.ㅎㅎㅎ

 

이클립스 색상 설정하기

Posted on 2011. 5. 18. 15:03
Filed Under IT/java

예전에 이클립스의 흰 바탕이 너무 눈이 아파서 색상을 변경하려고 찾아봤는데, 일일이 변경하기엔 너무나 힘들고 어느 항목이 어느 부분의 색을 변경하는지도 잘 모르겠어서 포기한 적이 있었는데요.

몇일전 회사분에게 새로운 플러그인을 소개 받고 하루 종일 색상 설정만 하였네요.ㅎㅎㅎ

Eclipse Color Themes라는 플러그인 인데요. 자기가 직접 색상셋을 만들기도 쉽고 다른 사람이 만들어서 올린 색상 테마를 다운받으셔서 사용하셔도 되요.
사이트에 가보면 사용자들이 만들어둔 색상 테마가 엄청나게 많네요.

전 제가 쓰는 Source Insight와 색 컨셉을 맞추기 위해서 직접 요렇게 만들었습니다.


설치 법은 간단합니다.
이클립스의 Help->Install New Software를 선택하시고 아래 주소를 추가해서 설치하면 됩니다.


Eclipse Color Theme - http://eclipse-color-theme.github.com/update

설치후에 색상은 Window->Preferences->General->Appearance->Color Theme에서 바꾸실 수 있어요.


http://www.eclipsecolorthemes.org에 가시면 다른 색상테마를 받거나 만들수 있습니다.


그러면 즐거운 설정시간이 되시길..ㅋㅋ



아, 제가 만든 테마 주소...
http://www.eclipsecolorthemes.org/?view=theme&id=1692

제 테마의 단점이 있는데 Window->Preferences->Java->Editor->Matching brackets highlight 색을 바꿔주지 않으면 괄호를 찾아주는 사각형이 나타나지 않네요. 제 배경이랑 브라켓 하이라이트가 같은 색을 사용하고 있네요.ㅎㅎ

'IT > java' 카테고리의 다른 글

Ant xml파일 사용 방법을 알아봅시다.  (0) 2010.08.06
이클립스-ant 사용하기  (2) 2009.08.15

안드로이드에서 static 변수의 사용

Posted on 2010. 11. 14. 03:14
Filed Under IT/안드로이드

안드로이드 앱 실행 중 화면의 가로세로 방향이 변하거나 하면 OnCreate가 다시 호출되게 되는데요. 문제는 이때 변수들이 초기화 된다는 거죠.

잘 실행하고 있던 애들이 폰 방향 한번 바꿨다고 초기화 되니 문제가 됩니다.

보통 액티비티에 이런 속성을 추가해서 문제를 해결하는데요.

android:configChanges="keyboardHidden|orientation"

이게 문제가 되는게 가로UI를 따로 지정하는 경우에 가로/세로UI가 바뀌질 않고 그냥 쭉 나와서 사람을 곤란하게 만듭니다.

그래서 저는 위의 속성을 주지 않고 값을 유지해야 하는 속성들을 static으로 많이 사용했는데요.(일일이 변수들을 저장해뒀다가 복원하는 과정이 무지하게 싫고 귀찮더만요...쩝) 당연히 액티비티가 종료되고 다시 시작하면 static변수들이 초기화 된다고 생각했습니다.

그.런.데. 한참 개발을 진행하고 있는데 안드로이드 2.2를 사용하는 폰들에게서 문제가 나타납니다. 분명히 종료하고 다시 실행했는데 객체들이 초기화가 되지 않고 남아있어서 오동작을 하고 앱이 맛이 갑니다.

그래서 찾아보니 안드로이드가 왠만해선 프로세스를 종료시키지 않고 찌꺼기를 자꾸 남긴답니다. 요렇게 찌꺼기로 나아 있는 static 변수들이 다음에 실행할때 초기화도 없이 다시 사용되는 겁니다.ㅠㅠ
2.1버전에서는 프로세스를 완전히 종료시키는 루틴이 동작해서 문제를 발견하지 못했는데,
2.2버전에서는 기존에 사용하던 프로세스 종료 루틴이 완전하게 동작을 하지 않아서 문제가 생겼습니다.

일단 문제 되는 static객체들은 수정을 했는데, 너무나 많은 곳에서 static을 사용하는 바람에 시한 폭탄처럼 수시로 문제가 발생하더군요.ㅎㅎ
테스트 꼼꼼히 진행하면서 문제가 되는 부분을 찾아내서 수정했지요.ㅋㅋ(힘들었습니다...)

static을 사용할 때는 항상 조심히, 신중히 사용합시다.ㅋ

참고로 static을 빼는 경우에는 아래와 같이 onSaveInstanceState에서 상태값을 저장하고 onRestoreInstanceState에서 저장된 값을 복원하는 방식으로 처리하면 됩니다.
    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        outState.putInt(HOUR, m_nHourVal);
        outState.putInt(MIN, m_nMinVal);
        outState.putInt(SEC, m_nSecVal);

        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        m_nHourVal = savedInstanceState.getInt(HOUR);
        m_nMinVal = savedInstanceState.getInt(MIN);
        m_nSecVal = savedInstanceState.getInt(SEC);

        super.onRestoreInstanceState(savedInstanceState);
    }

 

그리고 static을 사용할 때는 액티비티나 앱이 종료될때 항상 static변수를 초기화 해줍시다.ㅎ

안드로이드 그라데이션(gradient) 각도별 생성 이미지

Posted on 2010. 11. 14. 02:39
Filed Under IT/안드로이드

안드로이드에서 그라데이션 사용 방법은 많이 아실 겁니다.

한번씩은 쓰면 좋은데 그라데이션 많이 쓰면 지저분하고 보기 안 좋더군요.

적당히 보기좋게 써주세요.ㅎㅎ

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
	<gradient
		android:startColor="#ff323232"
		android:centerColor="#ff323232"
		android:endColor="#ff787878"
		android:angle="270"
		android:centerY="0.9" />
	<corners
		android:radius="2dp" />
</shape>

단순히 startColor, endColor만 사용하면 정말 단조로운 이미지를 생성하실 수 있습니다.
이때 centerColor를 추가로 사용하시면 중앙부위만 다른 색을 가지는 그라데이션도 만들 수 있구요, centerY속성을 추가해서 center의 위치를 지정해 주면 하단이나 상단 부위에만 살짝 입체감을 줄 수도 있습니다.

그리고 corners를 이용해서 모서리 부분에 라운드 처리 가능하구요... 이건 그냥 검색하면 다 나오네요.ㅎㅎ

몇 번 사용해 보니까 각도별 이미지가 어떻게 생기는지 햇갈리더군요. 할 때 마다 원하는 그림 나올때까지 다시 실행하기도 힘들구요.
그래서 각도별 이미지를 살짝 그려봤습니다. 참고하세요~




Ant xml파일 사용 방법을 알아봅시다.

Posted on 2010. 8. 6. 16:35
Filed Under IT/java

오늘은 Ant 사용법에 관해 간단하게 설명드릴께요.

제가 첨부한 파일 보시면 누구라도 아실수 있으시겠지만 간단하게나마 부연 설명을 한번...귀찮지만...
아마도 이 글 안 읽으시고 첨부파일만 보심 다 아실듯하네요.

buildw.xml

common.properties


참 그리고 아파치에서 제공하는 ant매뉴얼 입니다. 저는 영어가 약해서 안 읽어봤지만ㅎㅎ
http://ant.apache.org/manual/
더 자세한 정보가 필요하시면 참조하세요.

첨부 파일은 제가 회사에서 사용하려고 만든 파일인데 프로젝트명 등만 살짝 바꿨습니다.

그럼... 설명드리죠. 먼저 첨부파일이 두개가 있습니다.
buildw.xml은 ant 스크립트명령이 들어가 있는 파일이구요
common.properties는 프로젝트명이랑 폴더경로, 그리고 서명파일을 생성할때 사용할 정보들이 들어있습니다.

common.properties에 설정한 인자들은 변수처럼 buildw.xml에 대응됩니다.
buildw.xml파일에 common.properties를 사용한다고 선언하는 부분이 아래 부분입니다.

<property file="common.properties" />

ant의 동작방법이 리눅스에서 사용하는 makefile이랑 비슷한 면이 있는데요. 바로 종속적으로 동작한다는 점이죠. 아래코드처럼 정의 되있을때 target name이 init인 속성은 depends로 clean을 필요로 하고 있습니다.
<target name="clean" description="Clean...">
    <delete dir="${dir.dist}" />
    <delete dir="${dir.src}/res" />
    <delete dir="${dir.classes}/res" />
</target>

<target name="init" depends="clean" description="init..">
    <mkdir dir="${dir.dist}" />
    <path id="compile.classpath">
        <fileset dir="${dir.lib}" includes="*.jar" />
    </path>
</target>
 
이렇게 정의를 한 다음 사용자가 이클립스에서 init을 실행하면 먼저 init의 depends인 clean을 실행해서 폴더를 지운다음 init을 실행하게 됩니다. 만약 clean에도 depends가 있다면 clean의 depends가 먼저 실행되겠지요.

정리를 해서 설명할만큼 거창한 내용은 없는거 같으니까 xml을 보면서 위에서부터 나오는 명령어들을 설명드릴께요.

delete는 파일이나 폴더 삭제에 사용되구요.
아래 예제에서 dir을 fileset으로 바꾼다면 특정 파일만 삭제할 수도 있겠죠?
<delete dir="${dir.dist}" />


mkdir은 말그대로 dir속성에 정의된 폴더를 생성합니다.
<mkdir dir="${dir.dist}" />


path는 저도 이게 뭔가 한참봤네요.ㅋㅋ
path는 id에 정의된 이름으로 path목록을 지정한다고 보면될거같네요. 밑에 있는 javac부분에서 classpathref부분에 "compile.classpath"가 지정된 것을 볼수 있습니다.
<path id="compile.classpath">
    <fileset dir="${dir.lib}" includes="**/*.jar" />
</path>


첨부해서 말씀드리자면 이클립스에서 compile.classpath에 마우스를 올려보면 path에 정의된 파일들 목록을 볼 수 있는데요~
제가 첨부한 파일에는 path의 fileset의 includes가 "**/*.jar"가 아니고 그냥 "*.jar"일텐데요.
includes에 "**/filename"을 사용하면 폴더의 하위폴더까지 포함하라는 얘기가 됩니다.
한마디로 lib폴더에 하위 폴더가 있고 그 폴더의 jar파일까지 path에 포함시키려면
include="**/*.jar"를 정의하면된단 말이죠.

javac는 컴파일해서 class파일을 만들라는 거구요. ant에선 소스코드에 오류가 있던지 말던지 컴파일 되는 한도까지 class파일을 만들어줍니다. 소스코드가 잘못되면 이클립스는 알려주지만 ant는 그런 오류메시지를 신경쓰진 않는다는 말이죠. 오류가 있는 코드더라도 일단 컴파일하고 ant의 다음 단계를 계속 실행해줍니다.
<javac srcdir="${dir.src}" 
	destdir="${dir.classes}"
	debug="${javac.debug}"
	classpathref="compile.classpath" />

copy는 fileset에 선언된 파일들을 todir폴더에 복사하는 명령입니다~
fileset의 exclude는 당연히 fileset에 포함시키지 않는다는 말이구요. 밑에 사용된 코드는 확장자가 db인 파일은 복사하지 않겠다는 말입니다. 너무 당연하네요...
<copy todir="${dir.classes}/res/">
	<fileset dir="${dir.res}/">
		<include name="**/*.*" />
		<exclude name="**/*.db" />
	</fileset>
</copy>

exec...는 외부파일을 실행시키는 명령입니다.
exec에다가 dir로 폴더위치 지정하고 executable에 실행할 파일이름을 써주면 됩니다.
os는 구동 os버전이구요.
밑에서 사용된 keytool.exe는 다들 아시다시피 java에서 서명파일을 생성해주는 실행파일입니다. 요렇게 옵션을 주시면 서명파일이 자동으로 만들어지죠. ant를 쓰기전엔 cmd장에서 배치파일로 실행해서 만들었었는데 cmd창에서 따로 만들지 않아도 되니 귀찮은 과정하나가 ant를 사용해서 또 줄었네요.

<exec dir="." executable="keytool"> <arg value="-genkey" /> <arg value="-alias" /> <arg value="${alias}" /> <arg value="-keystore" /> <arg value="${keystore}" /> <arg value="-keypass" /> <arg value="${keypass}" /> <arg value="-dname" /> <arg value="${dname}" /> <arg value="-storepass" /> <arg value="${storepass}" /> </exec>


마지막으로 signjar입니다. 위에서 만든 서명파일을 이용해서 jar파일에 서명을 해주는 역할을 합니다.
이렇게하면 "프로젝트명.jar"파일 하나만 서명을 하겠죠? 만약 다른 jar파일을 같이 서명할려면 fileset을 이용하거나 서명할 파일이 몇개 안된다면 밑의 라인을 ctrl+c, ctrl+v해서 몇줄 더 넣으시고 파일명부분만 바꿔주셔도 되겠죠.
<signjar jar="${dir.dist}/${projectName}.jar"
	keystore="${keystore}"
	alias="${alias}"
	storepass="${storepass}"
	keypass="${keypass}" />

ant가 예제 구하기가 좀 힘들지만 한번 보면 누구나 쉽게 이해할 수 있는 구조입니다. 가끔 이클립스가 멍청하게 class파일을 생성하지 못하거나 서명된 jar파일 만드실때 사용하세요~.

'IT > java' 카테고리의 다른 글

이클립스 색상 설정하기  (0) 2011.05.18
이클립스-ant 사용하기  (2) 2009.08.15

안드로이드의 android:layout_weight 속성

Posted on 2010. 7. 28. 10:39
Filed Under IT/안드로이드


LinearLayout의 속성 중에 android:layout_weight 이라는 속성이 있는데요.

이 것을 이용하면 LinearLayout의 항목들 배치에 아주 도움이 됩니다.

<LinearLayout
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="#ffffffff"
     android:gravity="center|right"
     android:padding="1dp">

     <TextView
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:text="@string/update_time"
      style="@style/text_item.preference"
      android:layout_weight="1"
      android:gravity="right" />

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

layout_weight 란 한마디로 UI영역에서 차지하는 중요도라고 할 수 있습니다. 이 중요도 비중을 높이면 그만큼 많은 영역을 UI영역에서 차지할 수 있죠. 설정을하지 않으면 디폴트로 0으로 설정됩니다.

위의 코드에서 TextView의 layout_weight가 1이고 Button은 설정을 하지 않았습니다. 그러면 Button이 높이가 wrap_content로 설정되어 있으니까 먼저 필요한 영역을 차지한 후 나머지 영역은 모두 TextView로 채워집니다. 만약 TextView와 Button에 layout_weight를 모두 1로 두면 어떻게 될까요? 중요도가 1:1로 설정이 되니까 화면을 절반씩 나우어 가지게 됩니다. 사용하실때 3:4든 5:5든 정수값이기만하면 비율을 맞추어 줍니다.
LinearLayout을 사용하면서 화면에 꽉차는 UI를 개발할 때는 필수품이라고 할 수 있겠죠~

그런데 만약 TextView의 layout_width를 0dp가 아닌 match_parent로 하면 어떻게 될까요? 음 다른 분들은 다들 알고 계신지 모르겠는데 layout_weight를 줄때는 layout_width를 wrap_content를 쓰던지 아니면 0dp를 줘야 합니다.
전 이걸 모르고 match_parent로 지정을 했더니 속성값이 반대로 움직이더군요.ㅋ
TextView와 Button부분의 layout_width를 match_parent로 해두고 layout_weight를 조절 했더니 양쪽이 반대로 움직이더군요. 1:9로 두고 실행시키면 9:1이 되는...
꼭 반대로 동작하지는 않을지도 모르지만 어쨋든 정상적인 동작은 기대할 수가 없으니깐 절대 꼭 wrap_content나 0dp로 하시고 사용하세요. 전 이거 잡는데 하루 걸렸습니다. 레이아웃을 너무 복잡하게 만든후에 문제를 발견해서ㅋㅋ

그리고 한가지 더, wrap_content를 지정하고 화면 비율을 나눈 경우에는 레이아웃 안쪽에 많은 항목이 있어서 크기가 커질 경우에 비율을 무시하고 내용물의 크기 많큼 레이아웃이 커집니다. 안쪽에 많은 항목이 있으면 나눈 비율보다 커질 수 도 있는거죠. 그리고 0dp를 사용한 경우에는 정확히 설정한 비율까지만 보여지게 됩니다. 나머지 항목은 가려지게 되겠죠~


이클립스-ant 사용하기

Posted on 2009. 8. 15. 04:29
Filed Under IT/java

이클립스에서 자바 코딩을 하다보면 bin폴더에 class파일이 제대로 생성되지 않을 때가 있습니다. 프로젝트를 처음 가져올때는 class파일을 만들어 주는데 그 이후에 이클립스가 아닌 다른 경로로 파일을 가져오거나 class파일을 지우면 이클립스 이넘이 build를 못하죠. 그 외에도 프로젝트 진행하다 보면 jar파일을 만들거나  jar파일에 서명을 하는 등의 작업을 해야할 때가 있는데 이걸 수작업으로 계속 할 순 없겠죠. 요럴때 ant를 사용합니다.

ant는 한마디로 리눅스의 make 파일이랑 같다고 보시면 됩니다. 복잡한 make파일보다는 훨씬 이해하기 쉽죠.ㅎㅎ
이넘이 필요한 파일들 복사도해주고, 이클립스가 제대로 프로젝트 build 못 할 때 build도 해서 class파일도 만들어 줍니다. jar파일도 만들어주고 서명도 해줍니다. 최고ㅋㅋ



ant파일 불러오기

메뉴-Window-Show View-Other를 선택합니다.



다음창이 뜨면 Ant->Ant를 선택하고 Ok를 눌러주세요.



아래쪽에 Ant항목이 추가되었죠?


전 살짝 오른쪽으로 옮겨서 쓰고 있습니다. 뭐 어디에 붙어있든지 상관없구요.



이제 ant파일을 불러와야합니다.
제가 샘플로 만든 파일을 다운받아서 입맛대로 수정해서 사용하세요.   

buildw.xml

common.properties


buildw.xml, common.properties파일을 받아서 java프로젝트 폴더에 복사해두고 사용하면 됩니다. common.properties는 프로젝트명이나 폴더위치등을 지정하는 환경파일이구요. ant에서 실제 땡겨서 쓸는 파일은 buildx.xml입니다.

자 buildw.xml을 추가할려면 위에서 추가된 Ant작업창에서 첫번째 +표시가 있는 개미를 눌러주세요. 그럼 아래와 같이 프로젝트명이 나오고 프로젝트에 포함된 xml파일이 표시되죠~
buildw.xml이랑 common.properties는 꼭 프로젝트 폴더에 같이 넣어서 쓰셔야되요.


buildw.xml파일을 선택하고 Ok를 누르면 buildw.xml파일을 항목별로 쫙~ 풀어서 보여줍니다. 개미 참 똑똑해요ㅎㅎ


왼쪽에서 네번째 Run버튼을 눌러주면 build가 되구요, 필요한 작업만 할려면 아래쪽에 기능들을 하나씩 선택해서 Run버튼을 눌러주면 됩니다.

buildw.xml파일은 그냥 보시면 아실거 같지만,, 다음에 한번 설명을 올리겠습니다.

제가 올린 파일에 대해서 간단하게 기능만 설명드리자면,,

build는 class파일 만들고 필요한 리소스파일들을 복사하는 역할을 하구요. dist폴더에 jar파일을 만들어줍니다.

clean은 dist폴더의 파일들을 지우는 역할을 하구요.

createKey는 서명에 필요한 인증파일을 만들어주는거구요. 인증파일은 한번만 만들어 놓으면 다음부턴 만들 필요가 없죠.

init은 dist폴더 만들어주게 되있구요.

sign은 jar파일에 서명을 할 때 사용합니다. 웹스타트로 배포할려면 서명을 해야겠죠?


한 10년전에 학교 수업시간에 swing 잠깐 써보고, 요즘 자바로 본격적으로 작업시작했는데 swt 좋군요. 확실히 swing보다 좋아졌네요. 쓰기도 쉽고,,
단점은 mfc보다는 역시 제약이 많다는거,,
쓰긴 참 쉽네요ㅋㅋ

'IT > java' 카테고리의 다른 글

이클립스 색상 설정하기  (0) 2011.05.18
Ant xml파일 사용 방법을 알아봅시다.  (0) 2010.08.06

About

by 쏜다

Notice

Counter

· Total
:
· Today
:
· Yesterday
: