'안드로이드'에 해당되는 글 17건

  1. 안드로이드 퍼미션 종류
  2. 이클립스 단축키 모음
  3. 어처구니 없는 애드몹 계정정지 (1)
  4. SKT 진저브레드 이상부터는 SKAF 미탑재
  5. 모토로라의 야심작 아이패드의 대항마 '모토로라 줌' Motorola Xoom 사진과 스펙
  6. 재사용 가능한 UI 컴포넌트로 레이아웃 구성하기 (8)
  7. 안드로이드 허니컴 SDK 출시 (1)
  8. 윈도우 백그라운드 & UI 속도 (4)
  9. 효율적인 레이아웃 구성하는 기법 (51)
  10. 안드로이드에서 크기에 사용가능한 단위
ACCESS_CHECKIN_PROPERTIES                 체크인데이터베이스의_속성테이블로_액세스                        
ACCESS_COARSE_LOCATION                     코스_로케이션_액세스_(Cell-ID/WiFi)                             
ACCESS_FINE_LOCATION                           파인로케이션_액세스(GPS)                                        
ACCESS_LOCATION_EXTRA_COMMANDS    로케이션_옵션_커맨드_액세스                                     
ACCESS_MOCK_LOCATION                        목_로케이션_프로바이더_생성_(테스트용)                          
ACCESS_NETWORK_STATE                        네트워크_상태_접근                                              
ACCESS_SURFACE_FLINGER                      서피스_플링거_접근                                              
ACCESS_WIFI_STATE                                 WiFi상태_접근                                                   
ADD_SYSTEM_SERVICE                             시스템서비스_추가                                               
BATTERY_STATS                                      배터리_상태                                                     
BLUETOOTH                                             블루투스                                                        
BLUETOOTH_ADMIN                                  블루투스_어드민                                                 
BRICK                                                       디바이스_실효성_지정                                            
BROADCAST_PACKAGE_REMOVED             제거된_패키지에_대한_notification_브로드캐스트                  
BROADCAST_SMS                                     SMS에_대한_브로드캐스트                                         
BROADCAST_STICKY                                 인텐트_브로드캐스트                                             
CALL_PHONE                                            통화                                                            
CALL_PRIVILEGED                                     통화(긴급전화_포함)                                             
CAMERA                                                   카메라                                                          
CHANGE_COMPONENT_ENABLED_STATE   컴포넌트의_실효성_변경                                          
CHANGE_CONFIGURATION                         컨피그_변경                                                     
CHANGE_NETWORK_STATE                       통신상태_변경                                                   
CHANGE_WIFI_STATE                                WiFi상태_변경                                                   
CLEAR_APP_CACHE                                  어플리케이션_캐시_클리어                                        
CLEAR_APP_USER_DATA                           어플리케이션의_유저데이터_클리어                                
CONTROL_LOCATION_UPDATES                위치정보_갱신                                                   
DELETE_CACHE_FILES                              캐시파일_제거                                                   
DELETE_PACKAGES                                  패키지_제거                                                     
DEVICE_POWER                                        전원상태에_대한_로우레벨_접근                                   
DIAGNOSTIC                                             진단리소스_읽고쓰기                                             
DISABLE_KEYGUARD                                 키_가드_끄기_DUMP_덤?                                          
EXPAND_STATUS_BAR                              상태표시줄_확장                                                 
FACTORY_TEST                                      팩토리_테스트                                                   
FLASHLIGHT                                           플래시라이트                                                    
FORCE_BACK                                         포스백                                                          
GET_ACCOUNTS                                    어카운트_획득                                                   
GET_PACKAGE_SIZE                              패키지_획득                                                     
GET_TASKS                                           태스크_획득                                                     
HARDWARE_TEST                                   하드웨어테스트                                                  
INJECT_EVENTS                                    유저이벤트_키/트랙볼                                            
INSTALL_PACKAGES                              패키지_인스톨                                                   
INTERNAL_SYSTEM_WINDOW                 내부_시스템윈도_활용                                            
INTERNET                                             인터넷                                                          
MANAGE_APP_TOKENS                         어플리케이션_토큰관리                                           
MASTER_CLEAR                                    마스터_클리어                                                   
MODIFY_AUDIO_SETTINGS                     오디오설정_편집                                                 
MODIFY_PHONE_STATE                         전화상태_편집                                                   
MOUNT_UNMOUNT_FILESYSTEMS         파일시스템_편집                                                 
PERSISTENT_ACTIVITY                         액티비티_지속                                                   
PROCESS_OUTGOING_CALLS                전화_발신처리_접근                                              
READ_CALENDAR                                  캘린더_읽어오기                                                 
READ_CONTACTS                                 주소록_읽어오기                                                 
READ_FRAME_BUFFER                          프레임버퍼_읽어오기                                             
READ_INPUT_STATE                             입력상태_읽어오기                                               
READ_LOGS                                         로그_읽어오기                                                   
READ_OWNER_DATA                             owner_data읽어오기                                              
READ_PHONE_STATE                           통화상태_읽어오기_READ_SMS_SMS읽어오기                          
READ_SYNC_SETTINGS                        동기설정_읽어오기                                               
READ_SYNC_STATS                            동기상태_읽어오기                                               
REBOOT                                             reboot                                                          
RECEIVE_BOOT_COMPLETED              boot완료                                                        
RECEIVE_MMS                                   MMS수신                                                         
RECEIVE_SMS                                    SMS수신                                                         
RECEIVE_WAP_PUSH                           WAP수신                                                         
RECORD_AUDIO                                 오디오_수신                                                     
REORDER_TASKS                               태스크_Z오더                                                    
RESTART_PACKAGES                         패키지_리스타트                                                 
SEND_SMS                                        SMS송신                                                         
SET_ACTIVITY_WATCHER                   액티비티_왓쳐지정                                               
SET_ALWAYS_FINISH                          액티비티_전체_종료                                              
SET_ANIMATION_SCALE                    스케일_애니메이션_지정                                          
SET_DEBUG_APP                               디버그어플리케이션_지정                                         
SET_ORIENTATION                            스크린_로테이션지정                                             
SET_PREFERRED_APPLICATIONS       자주_사용하는_어플리케이션_지정                                 
SET_PROCESS_FOREGROUND           포어그라운드_처리지정                                           
SET_PROCESS_LIMIT                        제한처리_지정                                                   
SET_TIME_ZONE                              타임존_지정                                                     
SET_WALLPAPER                             배경화면_지정                                                   
SET_WALLPAPER_HINTS                    배경화면_힌트_지정                                              
SIGNAL_PERSISTENT_PROCESSES    지속처리_시그널_지정                                            
STATUS_BAR                                    상태표시줄_지정                                                 
SUBSCRIBED_FEEDS_READ               서브스트립드_피즈_읽어오기                                      
SUBSCRIBED_FEEDS_WRITE             서브스트립드_피즈_쓰기                                          
SYSTEM_ALERT_WINDOW                알림_윈도우                                                     
VIBRATE                                         진동                                                            
WAKE_LOCK                                    알람                                                            
WRITE_APN_SETTINGS                    APN설정_쓰기                                                    
WRITE_CALENDAR                           캘린더_쓰기                                                     
WRITE_CONTACTS                          주소록_쓰기
WRITE_EXTERNAL_STORAGE           외장SD카드 쓰기
WRITE_GSERVICES                          G서비스_쓰기                                                    
WRITE_OWNER_DATA                       owner_data쓰기                                                  
WRITE_SETTINGS                            설정_쓰기                                                       
WRITE_SMS                                    SMS쓰기                                                         
WRITE_SYNC_SETTINGS                 동기설정_쓰기  
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Ctrl + Shift + F
자동으로 소스 코드를 정리해 준다.
팀프로젝트시 개인별로 코딩 스타일이 다르다면, 일단 각자 자기 스타일대로 소스를 작성하고
이 단축키를 사용하여 코딩 스타일을 일치시켜주면 좋을 것 같다.


Ctrl + F6
Microsoft Visual Studio의 Ctrl + Tab과 동일하다.
이클립스에서는 Ctrl + Tab으로 열려진 파일간 이동을 할 수는 없고 대신 이 단축키를 사용하면 된다. Ctrl + F6과 동일하고 방향만 반대인 Ctrl + Shift + F6 단축키도 존재한다.
 
 
Ctrl + F7
각종 '보기' 사이를 이동한다. 예를 들어 편집기에서 콘솔창으로 이동하거나 편집기에서
아웃라인으로 이동할 때 사용할 수 있다. 역시 방향만 반대인 Ctrl + Shift + F7 단축키도 존재한다.
 
 
Ctrl + F8
다음 'Perspective'로 이동한다. 역시 방향만 반대인 Ctrl + Shift + F8 단축키도 존재하다.
 
 
Ctrl + L
특정 줄번호로 이동할 때 사용한다.
 
 
Ctrl + F11
저장, 컴파일 및 실행


===== 실행 =====
1. Ctrl + F11 : 바로 전에 실행했던 클래스 실행

 
===== 소스 네비게이션 =====
1. Ctrl + 마우스커서(혹은 F3) : 클래스나 메소드 혹은 멤버를 상세하게 검색하고자 할때
2. Alt + ->, Alt + <- : 이후, 이전
3. Ctrl + o : 해당 소스의 메소드 리스트를 확인하려 할때
4. F4 : 클래스명을 선택하고 누르면 해당 클래스의 Hierarchy 를 볼 수 있다.
 
 
===== 문자열 찾기 =====
1. Ctrl + k : 찾고자 하는 문자열을 블럭으로 설정한 후 키를 누른다.
2. Ctrl + Shift + k : 역으로 찾고자 하는 문자열을 찾아감.
3. Ctrl + j : 입력하면서 찾을 수 있음.
4. Ctrl + Shift + j : 입력하면서 거꾸로 찾아갈 수 있음.
5. Ctrl + f : 기본적으로 찾기

 
===== 소스 편집 =====
1. Ctrl + Space : 입력 보조장치(Content Assistance) 강제 호출 => 입력하는 도중엔 언제라도 강제 호출 가능하다.
2. F2 : 컴파일 에러의 빨간줄에 커서를 갖져다가 이 키를 누르면 에러의 원인에 대한 힌트를 제공한다.
3. Ctrl + l : 원하는 소스 라인으로 이동
   로컬 히스토리 기능을 이용하면 이전에 편집했던 내용으로 변환이 가능하다.
4. Ctrl + Shift + Space : 메소드의 가로안에 커서를 놓고 이 키를 누르면 파라미터 타입 힌트를 볼 수 있다.
5. 한줄 삭제 CTRL + D
6. 파일 닫기 : CTRL+W 
7. 들여쓰기 자동 수정. (3.0 NEW) : CTRL+I 
8. 블록 주석(/*..*/) 추가.(3.0 NEW): CTRL+SHIFT+/ 
  8.1 Ctrl + / 해주면 여러줄이 한꺼번에 주석처리됨. 주석 해제하려면 반대로 하면 됨.
9. 위(아래)줄과 바꾸기 : ALT+UP(DOWN) 
10. 블록 선택하기.  : ALT+SHIFT+방향키 
11. 메소드의 파라메터 목록 보기. : CTRL+SHIFT+SPACE
12. 자동으로 import 하기 : CTRL+SHIFT+O 
13. 열린 파일 모두 닫기 : CTRL + SHIFT + F4
14. 블록 주석 제거 : CTRL+SHIFT+\
15. 전체화면 토글 : CTRL+M 
16. 한줄(블럭) 복사 : Ctrl + Alt + 위(아래) 
17. 다음 annotation(에러, 워닝, 북마크 가능)으로 점프 : Ctrl + , or . 
18. 퀵 픽스 : Ctrl + 1  
19. 메소드 정의부로 이동 : F3
20. 하이어라키 팦업 창 띄우기(인터페이스 구현 클래스간 이동시 편리) : Ctrl + T  
21. 메소드나 필드 이동하기 CTRL + O
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License


와!
구글 정말 나하고 무슨 원수를 졌는가?!!!

구글 애드센스 계정정지 당한지 한달이 되지도 않았는데, 이젠 내가 만든 어플에 광고 붙인 애드몹까지 계정정지 먹인다. 이제 겨우 앱등록한지 몇일 됬다고 계정정지 먹이는데... 아... 피가 거꾸로 솟는 것 같다.

구글 애드센스에서도 완전히 일방적으로 아무 잘못도 안 했는데 계정정지 시키더니 이번엔 안드로이드앱에 붙인 애드몹 광고까지도 정지를 시켜버렸다.

아아악!!!!! 


구글 애드센스 계정을 연결시킨 것 때문에 이런 처우를 받아야 하는건가?

내가 애드센스 계정정지 먹은 마당에 내가 내 손으로 앱광고를 클릭해서 수익(한 클릭당 0.02~0.04$)을 올리려고 했을까 안 했을까?

아 짜증나 죽겠다. 
 
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

SKT 가 11년 2월부터 출시되는 안드로이드 단말 (진저브레드) 이상에는 SKAF 를 탑재하지 않겠다고 발표했습니다.
기존의 유용했던 프로그램들은 Native 버전 (포함되서 나오는 버전) 으로 출시한다고 하네요.
구지 필요치 않았던 SKAF 의 구속에서 벗어난 느낌이네요.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License




하드웨어


운영체제 : 안드로이드 3.0 허니콤
디스플레이 : 10.1 인치 TFT-LCD
CPU : 1Ghz NVIDIA TEGRA 2 듀얼코어 프로세서
RAM : DDR2 1GB RAM
카메라 : 500만 화소 듀얼 LED 플래시
WIFI : 802.1n
배터리 : 10시간 재생시간 (6,000mA 예상)
무게 : 730g


아이패드의 대항마

크기는 키우면서 DDR2 1GB 램을 장착하고 배터리도 기존의 아이패드보다 더 용량이 큰 것을 사용해 아이패드의 강력한 대항마로 불리고 있습니다. 또한 NVIDIA 사의 Tegra 2 프로세서는 이미 2011 CES 에 출품된 거의 모든 태블릿 pc에 사용된 듀얼코어 프로세서인데요. 모토로라 줌에도 이 강력한 CPU를 채택하여 매우 부드럽고 시원시원한 화면전개가 될 것으로 봅니다.




소개 영상




저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
재사용 가능한 UI 컴포넌트로 레이아웃 구성하기

안드로이드 플랫폼은 아주 다양한 UI 위젯을 제공합니다. 작은 위젯 조각을 합쳐서 복잡하고 정교한 인터페이스를 사용자에게 보여줄 수 있습니다.
하지만 애플리케이션을 개발 할 때 더 수준높은 인터페이스가 필요 할 때가 있습니다. 이 인터페이스를 완성하면서 그것도 효율적으로 만들기 위해서는 수 개의 표준위젯을 하나이면서 
재사용이 가능한 컴포넌트로 합쳐야 합니다.

예를 들어 프로그레스바와 취소버튼이 있고 아이콘과 제목, 설명이 있고 Positive 와 Negative 액션과 등등이 포함된 패널을 만듭니다.
이런 UI 컴포넌트를 만들기 위해서는 커스텀 뷰를 만드는 방법도 있지만 XML을 통해서 더욱 쉽게 할 수 있습니다.

안드로이드의 XML 레이아웃 파일에서 각각의 태그는 클래스 인스턴스에 맵핑(상호 연결)되어 있습니다.
클래스는 항상 뷰의 서브클래스이고 UI 툴은 뷰의 인스턴스에 맵핑되어있지 않은 세가지 태그를 지원합니다. <requestFocus />, <merge >, <include /> 입니다.
이 기술문서는 <include /> 태그를 어떻게 사용해서 순수하게 XML 로만 작성한 컴포넌트를 만드는지 알아보겠습니다.
<include /> 문과 같이써서 강력한 효과를 내는 <merge /> 태그의 사용법은 Merging Layouts 문서를 참고하세요.

<include /> 의 하는 일은 이름 그대로입니다.
즉, 다른 XML 레이아웃을 포함(include)하는 것입니다. 이 태그를 사용하는 것은 아래의 예제에서 보이는 것과 같이 아주 직관적입니다.
아래 예제는 안드로이드 내장 애플리케이션인 the source code of the Home application 에서 직접 가져왔습니다.

<com.android.launcher.Workspace
    android:id="@+id/workspace"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    launcher:defaultScreen="1">
</com.android.launcher.Workspace>


<include /> 태그안에서는 layout 속성만 써야합니다. 이 속성은 android 접두어가 붙지 않으면 포함 시키고자 하는 레이아웃 파일을 참조합니다. (사용한다는 말)
이 예제에서는 똑같은 레이아웃이 3번 연속으로 적용되었습니다. 이 태그는 또한 포함시키고자 하는 레이아웃의 몇가지 속성들을 오버라이드 할 수도 있습니다.
위의 예제에서는 android:id 를 사용해서 포함된 레이아웃의 루트 뷰(최상단 뷰)에 id를 부여 할 수 있습니다. id가 부여 되면 포함된 레이아웃의 id 도 오버라이드 됩니다.
또한 모든 레이아웃의 속성값들을 오버라이드 하는것도 가능합니다. 즉, 어떠한 android:layout_* 속성이라도 <include /> 태그안에서 쓰일 수 있다는 말입니다.
아래 예제에서는 똑같은 레이아웃이 두번 포함되었는데 첫번째 것만 레이아웃 속성들을 오버라이드 했습니다.
살펴보죠.

<!-- override the layout height and width -->
<include layout="@layout/image_holder"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent" />
<!-- do not override layout dimensions; inherit them from image_holder -->
<include layout="@layout/image_holder" />


주의
안드로이드 위젯의 dimension(폭과 높이)를 오버리아드 하고자 한다면 android:layout_height와 android:layout_width 속성을 다 오버라이드해야 합니다.
어느 한 가지 속성만 오버라이드 해서는 안됩니다. 한 가지만 오버라이드 하게 되면 아무 효과도 나타나지 않습니다. (weight 같은 이외의 속성들은 소스레이아웃에서 상속됩니다.)


<include />태그는 기기의 설정에따라 UI의 일부 특정한 부분만 수정하고자 할 때 매우 유용합니다.
예를 들어 액티비티의 메인 레이아웃 layout/ 폴더에 넣고 다른 레이아웃은(화면 방향을 예로 들어) layout_land/ 나 layout_port/ 폴더에 따로 보관 할 수 있습니다.
이렇게 레이아웃을 따로 보관한다면 유지보수가 한 층 더 용이해지는 것은 당연하겠죠.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License



안드로이드 SDK 3.0 버전 출시되었습니다.
SDK 받고 에뮬로 이런 저런 앱들 구동시켜보면서 
어떤 것들이 달라졌나 눈으로 확인해 볼 수 있는 길이 열렸습니다.

우선 유튜브에서 런칭 데모 영상 참고 하세요.




사용자 UI 측면에서도 많은 변화와 좀 더 멋진 기능들이 많이 추가 되었는데요.
사용자 UI 측면에서 향상된 기능들은 우선 뒤로 미루고 개발을 하는 입장에서 허니컴이 어떤 것들이 바뀌었는지 살펴보죠.

비디오에서 Hugo 라는 사람이 개발자를 위해서 한 말을 잠시 읽어보죠.

Thank you Andy.

From the very beginning, the Android project, as Andy said, has been committed to open development.
and one of the most critical aspects of open development is creating an ecosystem platform that enables developers to
iterate and innovate as quickly as possible. So our approach with Android has been to equip developers with the best possible tool kit that we can build and then simply get out of their way.

So with Honeycomb, we're enabling this style of rapid, agile development that the internet has been used to for so many years
on this new generation of tablet-sized mobile computers.

빨간색 글을 잠깐 보시면 안드로이드 개발팀이 개발자들을 위해서 개발시 필요한 최고의 툴킷을 제공해서 개발자들에게 방해가 되지 않겠다는 의지를 보이는데요. 과연 이 의지대로 어떤 툴킷과 기술들이 적용되었는지 API 문서를 통해서 살펴 봅시다.


New Developer Features

The Android 3.0 platform is designed specially to meet the unique needs of applications on devices with larger screen sizes. It offers all of the tools developers need to create incredible visual and interaction experiences on these devices.


  • 태블릿 앱을 위한 새로운 UI 프레임워크2
  • 2D 와 3D 그래픽 성능 향상
  • 멀티코어 프로세서 지원
  • 리치 멀티미디어 지원
  • 이전 버전의 앱과의 호환 

등이 있습니다.


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
윈도우 백그라운드 & UI 속도

안드로이드의 어떤 애플리케이션은 UI 의 속도를 최대한 끌어올릴 필요가 있습니다. 방법은 여러가지가 있습니다.
이번 문서에서는 애플리케이션의 그리기 성능과 액티비티의 지각(느낄 수 있는) 할 수 있는 스타트업 속도를 어떻게 향상시킬수 있는지 알아봅니다.
이 두가지 성능향상을 위한 기법은 한 요소에 의해 결정됩니다. 윈도우의 백그라운드 Drawable 입니다.

윈도우 백그라운드라는 용어는 약간은 오해의 소지가 있습니다. 하지만 액티비티에서 setContentView() 메서드를 이용해서 UI를 구축한다면
안드로이드는 액티비티의 윈도우에 뷰를 추가합니다. 하지만 윈도우는 단지 뷰만 추가하는 것이 아니라 몇몇 다른 요소들을 포함합니다.
가장 중요한 요소는 T-Mobile G1에서 사용되고 있는 DecorView 입니다.
아래 표에서 뷰 계층(View Hierarchy) 에서 확인해보죠.



DecorView는 윈도우의 Drawable을 실제로 담고 있는 뷰입니다.
액티비티에서 getWindow().setBackgroundDrawable() 메서드를 호출하고 DecorView의 백그라운드 Drawable을 바꾸면 윈도우의 백그라운드가 바뀝니다.
이 설정은 매우 구체적인 설정이고 차후버전이나 심지어 다른 기기들에서도 바꿀 수 있습니다.

개발시에 표준 안드로이드 테마를 사용한다면 안드로이드는 기본 백그라운드 Drawable을 액티비티의 기본 배경으로 사용합니다.
T-Mobile G1 에서 현재 사용하고 있는 표준 테마는 ColorDrawable 입니다. 대부분의 애플리케이션에서 백그라운드 Drawable은 잘 동작하며 혼자서도 동작이 가능합니다.
하지만 이 백그라운드 Drawable은 애플리케이션의 그리기 성능에 영향을 미칠 수 있습니다.
애플리케이션이 백그라운드에 항상 투명 사진을 그리는 예제를 한 번 보죠.





위의 스크린샷에서 윈도우의 백그라운드가 보이지 않는 것을 확인 할 수 있습니다.
윈도우의 백그라운드 전체가 ImageView 에 가려져 있죠. 애플리케이션이 44FPS(초당 프레임수)의 속도로 이미지를 그리고 있습니다.
이 애플리케이션이 더 빠르게 이미지를 그리게 하는 방법은 백그라운드 Drawable 을 제거하는 것입니다.
UI가 완전히 투명이기 때문에 백그라운드에 이미지를 그리는 것은 너무나 소모적이죠.
백그라운드 이미지를 제거하는 것은 성능을 끌어 올리는데 아주 좋습니다.





위의 스크린샷에서 백그라운드 이미지를 제거한 후에 FPS를 재어보니 51FPS가 나왔습니다. 초당 3밀리초의 차이는 T-Mobile G1의 메모리 버스에서 생기는 지연효과로 
풀스크린 이미지의 픽셀을 메모리 버스로 옮기는데 걸리는 시간을 의미합니다. 기본 백그라운드가 훨씬 더 화려하고 메모리 상주크기가 높다면 이 차이는 더 확연해 집니다.

윈도우의 백그라운드를 쉽게 삭제하는 방법은 커스텀 테마를 사용하는 것입니다. res/values/theme.xml 파일을 만듭니다.
그리고 아래의 코드를 넣습니다.

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>


이제 android:theme="@style/Theme.NoBackground" 속성을 <activity /> 나 <application />태그에 삽입하여 개발하고자하는 액티비티에 적용시킵니다.
MapView 나 WebView를 사용하거나 풀스크린 투명 뷰를 사용하는 애플리케이션을 개발한다면 매우 손쉽게 적용시킬 수 있습니다.

투명 뷰와 안드로이드 : 이 작업은 최적화 작업이 필요한데 안드로이드 UI 툴은 투명 자식객체로 숨겨진 뷰들을 다시 그리는 것을 방지할 만큼 똑똑하진 않기 때문입니다.
이 최적화 작업이 실행되지 않은 가장 주요한 이유는 안드로이드 애플리케이션에는 보통 투명 뷰가 없거나 아주 소수이기 때문입니다.
상황이 이렇다해도 최대한 이른 시기안에 이 최적화 작업을 진행하겠습니다. 좀 더 일찍 실행하지 못한 점이 죄송합니다.(번역자 주: 프레젠테이션에서 발표한 자료같음)

테마를 사용해서 윈도우의 백그라운드를 바꾸는 것 또한 액티비티의 스타트업 속도를 향상시킬 수 있습니다.
단, 텍스쳐나 로고를 이용한 커스텀 백그라운드를 사용하는 액티비티에만 적용됩니다.
아래 스크린샷에서 보이는 책장선반 애플리케이션이 좋은 보기입니다.






만약 이 애플리케이션의 XML이나 onCreate()메서드에서 그냥 나무 백그라운드를 지정해버린다면 사용자는 기본테마와 어두운 백그라운드를 보게 됩니다.
나무 텍스쳐(질감)은 context 뷰의 로드 후와 첫번째 레이아웃/그리기 작업이 끝난다음에만 나타나게 됩니다.
이런 작업을 보는 사용자는 애플리케이션이 불안하고 로딩하는데 시간이 오래 걸린다고 생각합니다.(실제로도 그렇습니다)
대신에 애플리케이션이 나무 백그라운드를 테마로 정의하고 애플리케이션이 시작되자마자 안드로이드 시스템이 이 설정을 적용시킨다면 사용자는 기본 테마를 보지 않게 되고
애플리케이션이 빠릿빠릿하고 바로 실행되어 빠르다는 인상을 갖게 됩니다.
메모리와 디스크 사용량을 줄이기 위해서는 res/drawable/background_shelf.xml 파일에 아래와 같이 백그라운드 타일을 정의합니다.

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/shelf_panel"
    android:tileMode="repeat" />

이 Drawable 은 테마를 참조합니다.

<resources>
    <style name="Theme.Shelves" parent="android:Theme">
        <item name="android:windowBackground">@drawable/background_shelf</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>

Google Maps 애플리케이션에 위에서 보인 기법과 똑같은 기법이 사용되었습니다. 애플리케이션이 구동되면 사용자는 즉시 MapView의 타일들을 보게 됩니다.
테마는 MapView에서 타일을 로드하는 것과 똑같이 보이는 타일 백그라운드를 사용합니다.

가끔식 보면 최고의 기법들은 아주 간단합니다.
다음번에 투명 UI 혹은 커스텀 백그라운드를 사용하는 액티비티를 만들때는 윈도우의 백그라운드를 바꾸는 걸 기억하세요.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
효율적인 레이아웃 구성하는 기법

안드로이드 UI 툴은 사용하기 쉽고 편한 관리툴을 제공합니다.
대부분의 경우에는 관리툴이 제공하는 몇몇 기본적인 것들만 이용하면 UI를 간편하게 구성할 수 있습니다.

하지만 기본적인 것들만 이용해서는 효율적인 사용자 UI를 만들지 못하겠죠.
보기 좋은 예가 LinearLayout의 남용을 들 수 있는데 이렇게 남용하게 되면 View 계층에서 View가 넘쳐나게 되는 결과를 야기합니다.
애플리케이션에서 보여지는 모든 뷰와 레이아웃 관리툴은 초기화라는 비용을 수반합니다.
이런 비용은 레이아웃과 그리기 성능을 저하시키죠. 특히 다중 LinearLayout 에서 weight 속성을 여러번 사용하면
weight 속성의 특성상 자식객체를 두번 측정해야하기 때문에 매우 값비싼 비용을 치르게 됩니다.

여기 아주 단순하고 흔한 레이아웃 예제가 있습니다. 리스트 아이템 왼쪽에 아이콘이 있고, 제목이 있고 제목 밑에 설명이 잇습니다.
어떻게 생겼는지 한 번 보죠.


위의 예제를 분석해 봅시다. 
하나의 ImageView 와 두개의 TextView가 각각의 자리를 차지하고 있습니다. HierarchyViewer 를 통해서 캡쳐한 예제의 틀을 한번 살펴봅시다.



LinearLayout을 통하면 이 레이아웃을 단번에 만들수 있습니다.
아이템 자체는 수평 LinearLayout 이고 하나의 ImageView와 두개의 TextView를 포함한 수직 LienarLayout 이 있습니다.
이 레이아웃의 코드를 살펴봅시다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    
    android:padding="6dip">
    
    <ImageView
        android:id="@+id/icon"
        
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6dip"
        
        android:src="@drawable/icon" />

    <LinearLayout
        android:orientation="vertical"
    
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
                    
            android:gravity="center_vertical"
            android:text="My Application" />
            
        <TextView  
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" 
            
            android:singleLine="true"
            android:ellipsize="marquee"
            android:text="Simple application that shows how to use RelativeLayout" />
            
    </LinearLayout>

</LinearLayout>

이렇게 만들면 동작은 하지만 ListView의 각각의 아이템을 인스턴스화 한다면 매우 소모적입니다.
같은 레이아웃을 RelativeLayout을 통해서 만들수가 있는데, 이렇게 함으로서 하나의 View를 아낄수 있고 View 계층에서 한단계 더 높습니다.
RelativeLayout을 사용한 코드를 한 번 살펴봅시다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    
    android:padding="6dip">
    
    <ImageView
        android:id="@+id/icon"
        
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip"
        
        android:src="@drawable/icon" />

    <TextView  
        android:id="@+id/secondLine"

        android:layout_width="fill_parent"
        android:layout_height="26dip" 
        
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/secondLine"
        android:layout_alignWithParentIfMissing="true"
                
        android:gravity="center_vertical"
        android:text="My Application" />

</RelativeLayout>

이 구조로 된 레이아웃은 물론 이전의 레이아웃과 똑같이 동작합니다.
단, 리스트아이템을 두 줄로 하고 싶을 때를 제외합니다. 즉, 제목과 설명이 필요하다면 다른 접근이 필요합니다.
주어진 리스트 아이템에 제목말고 설명이 없다면 애플리케이션은 설명에 해당하는 TextView 의 Visibility(보임옵션)을 GONE(보이지도 않고 자리를 차지하지도 않음)으로 처리해버립니다.
이 방식은 LinearLayout에는 완벽하게 동작하지만 RelativeLayout은 동작하지 않습니다.




RelativeLayout에서는 View가 부모객체를 기준으로 정렬을 합니다. 부모가 RelativeLayout 자신이 될 수도 있고, 다른 View가 될 수도 있습니다.
예를 들어, 개발시에 설명 TextView를 RelativeLayout의 아래를 기준으로 정렬하고 제목은 설명위로 정렬하고 부모객체위에 자리를 잡게 설정했다고 한다면 이 상황에서 설명 TextView의 Visibility를 GONE으로 설정시에는 RelativeLayout은 제목의 하단을 어디를 기준으로 정렬해야 할지 모르는 상황이 발생합니다. 이 문제를 해결하기 위해서 아주 특별한 속성값을 사용할 수 있습니다.
layout_alignWithParentIfMissing 입니다.

Boolean 속성을 지니는 이 값이 하는 일은 지정된 타켓이 사라진다면 그에 맞춰 정렬된 다른 객체의 하단을 고정시키는 역할을 합니다.
예를 들어, View를 Visibility 속성이 GONE인 View 옆에 두고 alignParentIfMissing 속성을 true로 놓으면 RelativeLayout은 View를 왼쪽 가장자리에 고정시킵니다.
위의 예에 적용시키면 alignWithParentIfMisiing 속성은 RelativeLayout을 제목의 아래에 정렬시키게됩니다.
결과화면은 다음과 같습니다.





레이아웃의 출력결과는 완벽합니다. 설명이 GONE 이라도 완벽하게 동작합니다. LinearLayout의 weight 옵션도 쓰지 않기 때문에 더 효율적이고 간단합니다.
HierarchyViewer 에서 두 레이아웃의 View 계층도를 확인해보면 더 확실히 구분할 수 있습니다.




다시 말하지만 인스턴스를 위한 리스트뷰에서 각각의 아이템을 나타내기위한 두 레이아웃의 차이점은 매우 중요합니다.
바라건데 UI를 구성하고 최적화하는 방법을 배우는데에 이런 예제들이 도움이 될 수 있었으면 좋겠습니다.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
크기에 사용할 수 있는 단위는 다음과 같다.


표기  단위 의미
px 픽셀 수 사용 중 화면에서의 픽셀 수해상도가 높아지면 픽셀의 물리적인 크기가 줄어든다.
in 인치 사용 중 화면에서의 인치단위의 길이
mm 미리 미터 사용 중 화면에서의 미리 미터 단위의 길이
pt 포인트 수 사용 중 화면에서의 1/72 인치를 1포인트로 하는 길이
dp 해상도 의존하지 않는 픽셀 수 1는 해상도가 160dpi일 때 1픽셀10dp가 160dpi일 때에는 10픽셀, 320dpi일 때에는 20픽셀
sp 폰트 사이즈를 고려한 픽셀 수 사용자가 설정하고 있는 폰트사이즈를 고려한 스케일된 픽셀 수.실제 픽셀 수는 사용 중 화면의 해상도와 폰트 사이즈에 의해 변함



dpi란?

dpi는 Dot Per Inch의 약자로 1인치(2.54cm)당 들어가는 점의 수를 말한다이 값이 클수록 같은 공간 안에 더 많은 점이 있어서 더 선명하다, 150dpi보다 300dpi가 더 선명하다.



크기를 정의하는 파일명은 일반적으로 dimens.xml으로 한다.


<!--?xml version="1.0" encoding="UTF-8"?-->
<resources>
<dimen name="small_size">8sp
<dimen name="large_size">32sp
</resources>

 


정의한 사이즈를 프로그램에서 참조하려면 클래스의 메소드를 사용한다



float dimen = getResources().getDimension(R.dimen.large_size);




정의한 사이즈를 다른 리소스파일에서 참조하려면 “@dimen/”에 정의한 이름을 붙여 지정한다



<TextView ... android:textSize="@dimen/large_size" />


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License