한글로 주석을 작성하고 javac로 컴파일할 때 인코딩 문제 때문에
다음과 같은 에러 메시지를 볼 수 있다.
unmappable character for encodig MS949
해결방법 : javac의 기본 인코딩 설정을 ms949에서 utf-8로 바꿔주면 된다.
예시 : javac Project1.java -encoding UTF-8
한글로 주석을 작성하고 javac로 컴파일할 때 인코딩 문제 때문에
다음과 같은 에러 메시지를 볼 수 있다.
unmappable character for encodig MS949
해결방법 : javac의 기본 인코딩 설정을 ms949에서 utf-8로 바꿔주면 된다.
예시 : javac Project1.java -encoding UTF-8
ArrayAdapter<String>을 이용해 ListView에 String배열 데이터를 넣고
커스텀뷰를 적용한 사례이다.
리스트뷰의 글자크기나 요소간 간격(item height / element height)도 조절할 수 있다..
listView1은 activity_main.xml에서 배치한 리스트뷰의 아이디이다
소스파일(*.java)에서 ListView객체와 String배열을 정의한다
ListView view = (ListView)findViewById(R.id.listView1);
String[] values = new String[LIST_NUM];
for(int i=0; i<LIST_NUM; i++) {
values[i] = i;
}
그리고 어레이어댑터를 만들어 뷰에 적용.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_text_view, values);
view.setAdapter(adapter);
바로 위의 코드에서 my_text_view는 임의로 이름 붙인 커스텀뷰인데, 이제 이것을 만들어야 한다
프로젝트 경로에서 res\layout(메인액티비티 레이아웃이 있는 폴더)에 새로운 xml 파일을 만든다.
이름은 위 코드에서 쓴 것과 같아야 한다.(여기서는 my_text_view.xml)
실제로 적용했었던 코드를 그대로 옮겨보면,
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:gravity="center_vertical"
android:paddingStart="2dip" //패딩(테두리 여백)
android:textSize="21sp" //글자 크기
android:textColor="#EEEEEE" //글자색
android:minHeight="34dp" //리스트 요소 폭
/>
다음과 같은 레아이웃이 적용된 리스트가 표시된다.
(https://play.google.com/store/apps/details?id=com.zetagate.pitchspeed)
윈도우에서 Android SDK Manager를 실행했는데 실행이 되지 않고 바로 꺼져버린다면
다음과 같은 환경변수를 추가하면 해결될 수 있다.
변수 : JAVA_HOME
값 : JDK(Java Development Kit)가 설치된 디렉터리
1. 내컴퓨터를 우클릭하여 속성 - 고급설정으로 들어간다.
2. JAVA_HOME환경변수로 jdk설치경로를 지정한다.
애니팡을 하던 중, 콤보를 빠르게 이어가기 위해 어디를 터치해야 할 지 알려 주는 어플을 만들면 어떨까 하는 생각이 들었다. 구상한 방식은 게임 플레이 시 화면에 표시되는 내용을 읽어들여서 각 블록들의 배치를 알아낸 뒤, 한 칸 이동시켰을 때 터지는 조건이 되는 그런 블록을 찾아낸다. 그렇게 블록을 찾아냈으면 그 블록이 있는 위치에 간단한 그래픽을 띄워 그곳을 터치해야 한다고 알려주는 것이었다.
그 전까지 안드로이드 프로그래밍을 한 번도 해 보지 않았기 때문에 그나마 익숙한 플래시(Adobe Air)를 사용하여 만들기로 하였다. 어플리케이션의 배경을 투명하게 하여 뒤쪽의 화면을 얻어오면 될 거라고 생각했다. 그래서 플래시빌더를 실행시켜서 배경이 투명한 어플리케이션을 하나 만들어 기기에 넣어봤는데 배경이 투명하지 않고 하얗게 나온다... 관련내용을 검색해 보니 AndroidManifest.xml을 수정해야 된단다.
activity 태그에 android:theme="@android:style/Theme.Translucent를 넣어 apk를 생성하려고 하니 오류가 발생했다. Adobe Air로 만드는 앱에서는 android:style을 오버라이드 할 수 없다는 것이었다.
결국 이클립스에 안드로이드 개발 환경을 세팅하게 되었다.(ANE를 쓰면 됐었을수도..)
우선 메인 Activity에 Theme.Translucent 스타일을 적용시켜보았다. 어플리케이션을 실행시키자 앱 실행 직전의 화면이 어플의 배경으로 나오는 것을 볼 수 있었으나 그냥 그림일 뿐 뒤쪽을 컨트롤은 할 수 없었다..
다음에는 메인액티비티에서 Service를 띄웠는데 이번에는 어플이 띄워진 상태에서 뒤쪽의 화면을 조작할 수 있었지만, getRootView().getDrawingCache();로 드로잉캐시를 얻어보니 투명한 이미지만 나왔다..
Service에서 Translucent테마를 적용한 액티비티를 띄워서 그 액티비티의 드로잉캐시를 얻어와 봐도 역시 0x00000000...
phandroid를 뒤져보니 Android Screenshot Library를 쓰면 된다는 내용이 있길래 예제를 받아서 실행시켜보았다. 하지만 아래와 같이 화면전체가 빨갛게 되거나, 위쪽 일부분만 찍힌 스크린샷만 나올 뿐이었다...
도시 해결방법을 알 수가 없었다. 그래도 라이브러리의 소스코드(소켓통신 하는 부분)을 조금 수정해서 실행은 시켜 봤는데.. 메인화면이 가로보기로 되고 화면이 노랗게 되거나 아이콘이 사라지는 등 핸드폰이 벽돌이 되어버릴 것 같은 불길한 현상들이 일어나서 그만두는 수밖에 없었다. (이 문제가 해결된다고 해도 화면 읽어오는 속도가 느려서 애니팡을 건드리기는 어려울 것 같다.)
Eclipse INDIGO source level 오류
어떤 안드로이드 앱을 만드는데 캡쳐와 관련된 특정 부분을 구현하기가 어려워서 해결방법을 검색하다가 Google Code에서 적당한 라이브러리를 찾을 수 있었다. 약 10일간의 삽질을 겪었기에 그 라이브러리(+샘플)를 얼른 내려받아 프로젝트를 import했다. 그러나 import하자마자 그 프로젝트의 코드들은 엄청난 양의 error마커를 토해냈는데 도시 이유를 알 수 없었다..
에러내용들을 키워드로 다시 검색을 해 본 결과, http://kameran.tistory.com/205 이 글을 발견하여
Compiler compliance level을 확인하였으나 이미 1.6인 상태였다. 나와 같은 문제를 겪고 있는 상황도 찾아볼 수 있었다. http://www.androidpub.com/2118520 글에서의 사례와 같이 이클립스(indigo)를 헬리오스로 다시 깔아야 하는 것 아닌가 하고 귀찮음을 느끼고 있을 때, 우연히 이 문제에 대한 해결방법을 발견하게 되었다!
이클립스에서 '.... only available if source level is 1.5 or greater ...' 등과 같은 오류가 발생할 때가 있는데 이클립스의 자바 컴파일러 버전설정이 코드와 맞지 않을 때 발생하는 오류이다. 아래와 같이 버전을 확인해 주었더니 오류가 사라졌다.
1. 이클립스(인디고)에서 Window->Preferences->Java->Compiler 순으로 들어가서 Compiler compliance level을 확인한다.
2. 설정에 문제가 없는데도 에러가 사라지지 않는다면, 위쪽의 Configure Progject Specific Settings.. 를 클릭한다.
3. 해당되는 프로젝트를 선택하고 OK버튼을 누른다.
4. Properties for *** (Filtered)라는 창이 뜨게 되는데, Enable project specific settings를 체크하고, Compiler compliance level을 맞게 설정해 주면 된다!