MVNO에서 발급하는 유심의 경우 나밍을 해야 전화번호를 가져올 수 있는 이슈가 있음.

이슈 발생한 단말기에서 나밍을 해야 한다.

 https://www.mobing.co.kr/html/product/sub03_3.php

Posted by outliers
,

Configuring Android Studio

Intro

Android Studio has a cool feature to Import and Export settings. So during installation of new Android Studio version I usually import my previous settings. But recently a bad thing happened to me - I have lost my Android Studio settings file.

My advice to you: always keep backup of your Android Studio settings file somewhere on the cloud.

And since I am configuring my Android Studio from scratch anyway, below are some things which may be useful for you.

Show line numbers

When I first fired up Android Studio and started using it, one of the first things I wanted to do was to be able to see line numbers within the file. I was always curious why this thing is not turned on by default?

Without line numbers
With line numbers

To do so

  • In toolbar menu select File|Settings
  • Choose Editor|General|Appearance
  • Tick on Show line numbers
Settings

Camel humps

Android Studio doesn’t respect ‘Camel Humps’ words when you navigate through your code with pressed Ctrl+Left/Right arrow keys.

Without ‘Camel Humps’
With ‘Camel Humps’

To do so

  • In toolbar menu select File|Settings
  • Choose Editor|General|Smart Keys
  • Tick on Use ‘Camel Humps’ words
Settings

Note: if you still want to select whole word on mouse double click go to

  • In toolbar menu select File|Settings
  • Choose Editor|General
  • Remove tick on ‘Honor Camel Humps words settings when selecting on double click’

Field naming conventions

I am usually following field naming conventions from Android Code Style Guidelines for Contributors. There is one thing which Android Studio can automatically do for us - generate field name prefix for:

  • Non-public, non-static field names start with m.
  • Static field names start with s.
Field name prefix

To do so

  • In toolbar menu select File|Settings
  • Choose Editor|Code Style|Java
  • Select Code Generation tab
  • Add m prefix for field and s prefix for static field
Settings

Imports on the fly

In Android Studio there are shortcuts to auto import or clean-up non used imports. But we live in 2015 right? Those things should be done on the fly.

Without imports on the fly
With imports on the fly

To do so

  • In toolbar menu select File|Settings
  • Choose Editor|General|Auto Import
  • Tick on Optimize imports on the fly
  • Tick on Add unambiguous imports on the fly
Settings

Android log colors

With default Darcula theme Logcat highlighting I am not able to recognize type of log.

Darcula theme Logcat highlighting

I prefer to use bright colors from plain old Android Holo theme.

Holo theme Logcat highlighting

To do so

  • In toolbar menu select File|Settings
  • Choose Editor|Colors & Fonts|Android Logcat
  • Change all colors to ‘Holo’

Holo theme colors

출처 : https://medium.com/google-developer-experts/configuring-android-studio-4aa4f54f1153#.h25pwwsfd

 

Posted by outliers
,

안드로이드 네트워크 시간 설정 시 서버를 변경하고 싶다면
/system/etc/gps.conf 파일 안의 내용을 변경 하면 된다. 변경 후 재부팅을 해야 반영이 됨.

NTP_SERVER=north-america.pool.ntp.org
XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin

위의 부분을 변경해주면 된다.

/system 의 권한이 없으므로 루팅된 폰에서만 변경 가능하다.

Posted by outliers
,

style.xml 에서 <item name="android:windowTranslucentStatus">true</item> 사용 시 adjustResize 동작을 하지 않을 때

activity.xml 에 android:fitsSystemWindows="true"  를 사용하면 동작이 된다.

Posted by outliers
,

RecyclerView 적용 방법 요약

1. import android.support.v7.widget.RecyclerView library 후 layout 에 RecyclerView 추가.
   activity_main.xml
     .......
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    ......

2. List item layout xml 작성
  item_row.xml
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="100dp"
     android:orientation="horizontal" >
     <ImageView
          android:id="@+id/item_icon"
          android:layout_width="64dp"
          android:layout_height="64dp"
          android:layout_gravity="center_vertical"
          android:src="@drawable/ic_launcher"
          />
     
     <TextView
          android:id="@+id/item_title"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textColor="@android:color/darker_gray"
          android:layout_gravity="center_vertical"
          android:layout_marginLeft="8dp"
          android:textSize="22dp"
          />
 </LinearLayout>

3. 각 item 의 데이터 클래스 작성
    public class Item {
        private String title;
        private int iconResId;
       
        public Item(String title, int iconResId) {
            super();
            this.title = title;
            this.iconResId = iconResId;
        }
       
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public int getIconResourceId() {
            return iconResId;
        }
        public void setIconResource(int iconResId) {
            this.iconResId = iconResId;
        }
    }

4. RecyclerView Adapter 과 ecyclerView.ViewHolder 작성
    public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
       
        private ArrayList<Item> itemList;
       
        public ItemAdapter(ArrayList<Item> itemList) {
            super();
            this.itemList = itemList;
        }
   
        @Override
        public int getItemCount() {
            return itemList.size();
        }
       
        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int position) {
            viewHolder.tvTitle.setText(itemList.get(position).getTitle());
            viewHolder.ivIcon.setImageResource(itemList.get(position).getIconResourceId());
        }
   
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = View.inflate(parent.getContext(), R.layout.item_row, null);
            return new ViewHolder(itemView);
        }
       
        public static class ViewHolder extends RecyclerView.ViewHolder {
           
            public TextView tvTitle;
            public ImageView ivIcon;
            
            public ViewHolder(View itemLayoutView) {
                super(itemLayoutView);
                tvTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
                ivIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
            }
        }
    }

5. Activity에서 RecyclerView 설정
    public class MainActivity extends Activity {
       
        RecyclerView recyclerView;
       
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
           
            setContentView(R.layout.activity_main);
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
           
            ArrayList<Item> list = new ArrayList<Item>();
            for (int i = 0; i < 20; i++) {
                list.add(new Item("Title " + i, R.drawable.ic_launcher));
            }
           
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            ItemAdapter adapter = new ItemAdapter(list);
            recyclerView.setAdapter(adapter);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
        }
    } 
  

RecyclerView 설명

Android L 프리뷰 버전에서 등장한 RecyclerView는 이번 Android 5.0 프리뷰 버전과 함께 Support-Library-v7의 최신 버전에 정식으로 추가되었다. RecyclerView는 기존의 ListView보다 유연하고 성능이 향상된 고급 위젯이다. 기존의 ListView는 커스텀하기에는 구조적인 문제로 많은 제약이 따랐으며, 구조적인 문제로 인해 성능문제가 있었다. RecyclerView는 이런 고질적인 문제를 해결하기위해 좀 더 다양한 형태로 개발자가 커스텀할 수 있도록 유연하며 성능에 중점을 두어 만들어졌다.

 

RecyclerView

 

 

 

 

ListView에 비해 RecyclerView의 가장큰 변경 사항은 LayoutManager과 ViewHolder, Item에 대한 뷰의 변형이나 애니메이션할 수 있는 개념이 추가 되었다. 이들은 리스트의 아이템이 표시될 재활용뷰를 관리하는데 사용되며 아이템의 포지션에 따른 레이아웃의 배치를 결정하게 된다. 또한 불필요한 뷰의 생성을 피하기 위해 레이아웃을 관리하는 역할을 하게 된다.

 

주요 클래스

  • Adapter – 기존의 ListView에서 사용하는 Adapter와 같은 개념으로 데이터와 아이템에 대한 View생성
  • ViewHolder – 재활용 View에 대한 모든 서브 뷰를 보유
  • LayoutManager – 아이템의 항목을 배치
  • ItemDecoration – 아이템 항목에서 서브뷰에 대한 처리
  • ItemAnimation – 아이템 항목이 추가, 제거되거나 정렬될때 애니메이션 처리

 

 

LayoutManager

RecyclerView에서 가장 흥미로운 부분이다. RecyclerView를 생성시 반드시 생성되어야 하며 이를 통해 모든 아이템의 뷰의 레이아웃을 관리한다. 수평/수직 배치 뿐만아니라 그리드형태의 다양하게 레이아웃을 배치 할 수 있다.

기본적으로 제공하는 LayoutManager

  • LinearLayoutManager – 수평/수직의 스크롤 리스트
  • GridLayoutManager – 그리드 리스트
  • StaggeredGridLayoutManage – 높이가 불구칙적인 형태의 그리드 리스트

 

이외에 개발자는 LayoutManager를 확장하여 다양한 형태를 만들 수 있다. 아래와 같이 사용한다.

 

LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
layoutManager.scrollToPosition(currPos);
recyclerView.setLayoutManager(layoutManager);

 

 

ViewHolder

ViewHolder는 기존의 ListView에서 많이 사용하고 구글 안드로이드 팀에서도 오랫동안 추천 된 패턴이다. 하지만 이를 사용하는 것을 강제적으로 제한하지 않았지만 RecyclerView에서는 Adapter와 ViewHolder를 반듯이 같이 사용 할 수 밖에 없는 구조로 바꼈다. ViewHolder패턴을 사용 하지 않은 개발자는 약간의 훈련이 필요 할것이다.

 

public final static class ListItemViewHolder extends RecyclerView.ViewHolder {
   TextView label;
   TextView dateTime;
   
   public ListItemViewHolder(View itemView) {
      super(itemView);
      label = (TextView) itemView.findViewById(R.id.txt_label_item);
      dateTime = (TextView) itemView.findViewById(R.id.txt_date_time);
   }
}

 

사용법은 ViewHolder를 확장 후 서브 클래스를 findViewById()를 통해 저장해놓으면 된다. 이렇게 함으로 한번 생성한 클래스를 통해 서브 클래스(뷰)를 빠르게 다시 액세스 할 수 있다.

 

 

Adapter

ListView에서 Adpater와 동일한 형태의 구조로 해당 아이템의 데이터와 뷰간의 처리를 한다. 다음과 같은 3가지의 인터페이스를 구현해야 한다.

  • public ListItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    • 제네릭 형식의 변수로 ViewHolder를 생성
  • public void onBindViewHolder(ListItemViewHolder holder, int position)
    • 만들어진 ViewHolder에 데이터를 넣는 작업, ListView의 getView()와 동일
  • public int getItemCount()
    • 데이터의 갯수

 

public class RecyclerViewDemoAdapter extends RecyclerView.Adapter {

    private List items;

    RecyclerViewDemoAdapter(List modelData) {
        if (modelData == null) {
            throw new IllegalArgumentException(
                  "modelData must not be null");
        }
        this.items = modelData;
    }

    @Override
    public ListItemViewHolder onCreateViewHolder(
            ViewGroup viewGroup, int viewType) {
        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.item_demo_01, viewGroup, false);
        return new ListItemViewHolder(itemView, viewType);
    }

    @Override
    public void onBindViewHolder(
            ListItemViewHolder viewHolder, int position) {
        DemoModel model = items.get(position);
        viewHolder.label.setText(model.label);
        String dateStr = DateUtils.formatDateTime(
                viewHolder.label.getContext(),
                model.dateTime.getTime(),
                DateUtils.FORMAT_ABBREV_ALL);
        viewHolder.dateTime.setText(dateStr);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    public final static class ListItemViewHolder 
           extends RecyclerView.ViewHolder {
        // ViewHolder
    }
}

 

기존의 ListView와 동일한 구조라서 쉽게 구현이 가능하며, Adapter의 기본 클래스를 확장한 형태(CursorAdapter, ArrayAdapter)는 없다.

 

 

ItemDecoration

각 아이템 항목별로 오프셋을 추가 하거나 아이템을 꾸미는 작업을 하게 된다.  예를 들어 스크롤시 컨텐츠의 내용에 따라 View의 높이가 달라져 레이아웃의 위치를 이동해야 하는 작업하는 경우 여기에서 처리 하면된다.

 

필요시 다음과 같은 3가지를 구현해야 한다.

  • public void onDraw(Canvas c, RecyclerView parent)
  • public void onDrawOver(Canvas c, RecyclerView parent)
  • public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent)

 

LayoutManager에서 getItemOffsets()의 호출을 통해 아이템의 레이아웃의 크기를 측정 하기 때문에 위의 예시는 getItemOffsets()에서 작업하면된다.

 

 

 

ItemAnimtor

ListView에서 아이템별 애니메이션을 일으키기 위해 notifyDataSetChanged()를 호출해 모든 아이템 변경이 발생 할때 처리를 하였으나 notifyItemChanged(int position), notifyItemInserted(int position), notifyItemRemoved(int position)를 통해 ItemAnimator를 통해 특정 아이템에 대한 애니메이션을 발생 할 수 있다.

  • public final void notifyItemInserted(int position)
  • public final void notifyItemRemoved(int position)

 

 

RecyclerView.ItemDecoration itemDecoration =
        new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
recyclerView.addItemDecoration(itemDecoration);

recyclerView.setItemAnimator(new CustomItemAnimator());


public class CustomItemAnimator extends PendingItemAnimator {
 
    public CustomItemAnimator() {
        setAddDuration(300);
        setRemoveDuration(300);
    }
 
    @Override
    protected boolean prepHolderForAnimateRemove(ViewHolder holder) {
        return true;
    }
 
    @Override
    protected ViewPropertyAnimatorCompat animateRemoveImpl(ViewHolder holder) {
        return ViewCompat.animate(holder.itemView)
                .rotationX(90)
                .translationY( - (holder.itemView.getMeasuredHeight() / 2));
    }
 
    @Override
    protected void onRemoveCanceled(ViewHolder holder) {
        ViewCompat.setRotationX(holder.itemView, 0);
        ViewCompat.setTranslationY(holder.itemView, 0);
    }
 
    @Override
    protected boolean prepHolderForAnimateAdd(ViewHolder holder) {
        ViewCompat.setRotationX(holder.itemView, 90);
        ViewCompat.setTranslationY(holder.itemView, - (holder.itemView.getMeasuredHeight() / 2));
        return true;
    }
 
    @Override
    protected ViewPropertyAnimatorCompat animateAddImpl(ViewHolder holder) {
        return ViewCompat.animate(holder.itemView)
                .rotationX(0)
                .translationY(0);
    }
 
    @Override
    protected void onAddCanceled(ViewHolder holder) {
        ViewCompat.setRotationX(holder.itemView, 0);
        ViewCompat.setTranslationY(holder.itemView, 0);
    }
}

 

 

 

그외

ListView OnItemClickListener, OnItemLongClickListener의 아이템 터치에 대한 리스너가 RecyclerView에서는 addOnItemTouchListener, setOnClickListener를 통해 처리 하게 되었다. 이는 GestureDetecter를 통해 좀 더 다양한 이벤트를 식별 할 수 있는 유연한 구조로 바꼈다. 한편으로는 유연하지만 한편으로는 좀 더 어려워 졌다고 볼 수 있다.

 

addHeaderView(), addFooterView()는 어디로?

없어 졌다. 이를 위해 Adapter의 onCreateViewHolder()에서 itemType으로 header나 footer를 추가 하는 방식으로 처리 해야 한다.

 

 

마치며..

ListView에서 RecyclerView를 바로 사용하기는 개념상 달라진 점이 없기 때문에 무리가 없겠으나 ListView에 있는 몇몇 기능들이 RecyclerView에서는 지원하지 않아 직접 처리 해야 하는 경우가 있어 보인다. 그리고 확실시 ListView에 다양하게 확장 할 수 있도록 유연해졌다. 하지만 유연해진 만큼 손이 많이 가는 부분도 없지 않아 있다.
참고 코드:

https://github.com/writtmeyer/recyclerviewdemo

출처 : http://www.kmshack.kr/android-recyclerview/

 

 

 

Posted by outliers
,

Status Bar 색상 지정

<resources>
 
<!-- inherit from the material theme -->
 
<style name="AppTheme" parent="android:Theme.Material">
   
<!-- Main theme colors -->
   
<!--   your app branding color for the app bar -->
   
<item name="android:colorPrimary">@color/primary</item>
   
<!--   darker variant for the status bar and contextual app bars -->
   
<item name="android:colorPrimaryDark">@color/primary_dark</item>
   
<!--   theme UI controls like checkboxes and text fields -->
   
<item name="android:colorAccent">@color/accent</item>
 
</style>
</resources>

Status Bar 투명처리

<resources>
<!-- inherit from the material theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>

Posted by outliers
,

Material Design 적용방법

1. 타겟 SDK 버전을 21 이상 사용
2. AppTheme 가 Theme.Material을 상속 받아야 함.
   
values/styles.xml : API Level 21 미만에서 사용하는 테마
    values-v21/styles.xml : API Level 21 이상에서 사용하는 테마

    Ex) values-v21/style.xml
    <style name="AppTheme" parent="android:Theme.Material">
         <item name="android:colorPrimary">@color/primary</item>
         <item name="android:colorPrimaryDark">@color/primary_dark</item>
         <item name="android:colorAccent">@color/accent</item>
    </style>
3. android:theme 속성에 해당 Theme 적용

 

AppCompatActivity 적용방법

1. 서포트 라이브러리 v7 사용
2. 타겟 SDK 버전을 21 이상 사용
3. AppTheme 가 서포트라이브러리 테마를 상속 받아야 함.
   - res/value-v21이 없을 경우 폴더를 생성 한 후 style.xml 파일을 생성
   - AppTheme에 Theme.AppCompat Theme 를 상속받고, 기본 Theme color 을 설정한다.
   - 두 가지 버전의 style.xml 파일을 준비해야 함.
     values/styles.xml : API Level 21 미만에서 사용하는 테마
     values-v21/styles.xml : API Level 21 이상에서 사용하는 테마

    Ex) values-v21/style.xml
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/accent</item>
    </style>

4. 작성할 activity가 AppCompatActivity 상속 받아야 함.
5. android:theme 속성에 해당 Theme 적용

'Programs > Android' 카테고리의 다른 글

안드로이드 RecyclerView  (1) 2015.07.08
Tips - Status Bar 색상 지정, 투명처리  (0) 2015.07.08
ANDROID DP/PX CONVERTER  (0) 2014.08.28
안드로이드 Resource 확장 적용 순서  (0) 2014.08.26
안드로이드 Layout 인식 순서  (0) 2014.08.26
Posted by outliers
,

출처 : http://pixplicity.com/dp-px-converter/

안드로이드 px/dp/sp 변환기

 

Posted by outliers
,

출처 : http://kscho.tistory.com/271

아래의 순서로 정해짐


한정자 종류

값 

설명 

 MCC와 MNC

mcc310.. 

모바일 국가코드, SIM 카드에 저장된 모바일 네트워크 카드

 언어와 지역

en

en-rUS 

언어코드 : http://ko.wikipedia.org/wiki/ISO_639 : Alpha-2

한국(ko), 영어(en), 일본어(ja), 중국어(zh)

국가코드 : http://geotags.com/iso3166/countries.html

한국(ko), 영국(rGB), 미국(rUS), 덴마크(de)

 화면 크기

small

normal

large 

화면 크기에 따른 분류 

 화면 비율 

long

notlong 

notlong : QVGA, HVGA, VGA

Long : WQVGA, WVGA, FWVGA 

 방향

port

land 

방향(orientation) 

 Dock mode

car

desk

car : 자동차의 dock에 있을 경우

desk : 책상용 dock에 있을 경우 

 야간 모드

night

notnight 

주간, 야간 

 픽셀 밀도 

ldpi

mdip

hdpi

nodpi 

ldpi :

mdpi : 

hdpi :

nodpi : 픽셀 밀도와 상관없는 비트맵 리소스를 위해서만 사용 

 터치 스크린 타입

notouch

stylus

finger 

notouch : 터치 스크린 지원 안할 경우

stylus : 스타일러스 펜을 사용할 경우

finger : 손가락 사용 

 키보드

keysexposed 

keyshidden

keyssoft

keysexposed : 하드웨어 키보드 보유

keyshidden : 하드웨어 있지만 사용 불가, SW 키보드 없는 상태

keyshoft : SW키보드만 지원 

 키보드 배열

nokeys

qwerty

12key 

nokeys : 하드웨어 키 없음

qwerty : 하드웨어 키보드 보유

12key : 12key 하드웨어 보유 

 네비게이션 키

navexposed

navhidden 

navexposed : 사용자가 네비게이션 키를 사용 가능

navhidden : 네비게이션 키 사용 불가

 탐색 도구

nonav

dpad

trackball

wheel 

nonav : 네비게이션 장치 없음

dpad : D-패드를 지원

trackball : 트랙볼 지원

wheel : 휠 탑재

 API 레벨

v3

v4

.. 

안드로이드 SDK 버전에 따른 분류 



사용례

- 언어코드

values는 영어

values-ko : 한국어

values-ja : 일본어

values-zh : 중국어 


- 이미지

drawable-ko-hdpi

drawable-ja-hdpi

drawable-zh-hdpi



- 조합

drawable-en-rUS-land

drawable-en-rGB-hdpi

drawable-port-hdpi

values-fr-rCA




 

 ldpi(120)

mdpi(160)

hdpi(240) 

small 

 QVGA(240x320)

2.6 ~ 3.0 인치

 

 

normal

 WQVGA(240x400)

3.2 ~ 3.5 인치


 FWQGA(240x432)

3.5 ~ 3.8 인치

 HVGA(320x480)

3.0 ~ 3.5 인치

 WVGA(480x800)

3.3 ~ 4.0 인치


FWVGA(480x854)

3.5 ~ 4.0 인치

large 

 

 WVGA(480x800)

4.8 ~ 5.5 인치


 FWVGA(480x854)

3.5 ~ 4.0 인치

 


'Programs > Android' 카테고리의 다른 글

Material Design 적용 및 AppCompatActivity 적용하기  (0) 2015.07.07
ANDROID DP/PX CONVERTER  (0) 2014.08.28
안드로이드 Layout 인식 순서  (0) 2014.08.26
바탕화면 실행아이콘 크기  (0) 2014.08.18
GCM(Google Cloud Message)  (0) 2014.08.01
Posted by outliers
,

출처 : http://marga.tistory.com/598

프롤로그

안드로이드는 특유의 파편화 문제로 여러 폰을 지원하다 보면 여러 종류의 layout을 만들어야 하는 경우가 있다.
그런데 여기서 또 문제가, 안드로이드는 OS버젼별로 Layout의 인식 순서가 다르다는 데 있다.
 
덕분에 이걸 모르면 개 삽질을 미친듯이 해야 하고 (아놕 시팍ㅋㅋ경험담ㅋㅋㅋ)
결국 해상도별 픽셀 layout을 만드는 짓(!)을 해서 훗날 유지보수를 어렵게 만들게 된다.
그리고는 "어쩔 수 없다" 라는 말을 할 수 밖에 없는 상황을 발생시킨다. (이게 무슨 멍멍이 같은 상황인가ㅋㅋㅋ)
 
안드로이드 OS별 Laout 폴더 인식 순서는 간단히 아래와 같다.
 
OS 4.x 의 Layout 인식 순서
 
자신의 sw_dp > 낮은 sw_dp > 자신의 w_dp > 낮은 w_dp > 자신의 dpi > 존재하는 dpi 폴더 중 높은 dpi > 낮은 dpi > 자신의 해상도 > 낮은 해상도 > layout
 

OS 3.x 의 Layout 인식 순서

자신의 sw_dp > 낮은 sw_dp > 자신의 w_dp > 낮은 w_dp > 자신의 dpi > 본인 해상도 1024x768 > 낮은 해상도 > layout > 높은 dpi
 
OS 2.x 의 Layout 인식 순서

자신의 dpi > 높은 dpi > 낮은 dpi > 자신의 해상도 > layout
 
 
 
그래서, 몇가지 폰의 예를 들면 다음과 같다.
(아래 결과는 폰에서 직접 확인 된 사항이다.)

갤럭시S3 (OS : 4.x, 해상도 : 720 X 1280)
 
layout-sw360dp
layout-sw320dp
layout-w360dp
layout-w320dp
layout-xhdpi
layout-hdpi
layout-mdpi
layout-1280x720
layout-960x540
layout-800x480
layout-480x320
layout
 
옵티머스 2X (OS : 4.x, 해상도 : 480 X 800)
 
layout-sw320dp
layout-w320dp
layout-hdpi
layout-xhdpi
layout-mdpi
layout-800x480
layout-480x320
layout
 
갤럭시탭 (OS : 3.2, 해상도 : 1280 X 800)
 
layout-sw400dp
layout-sw384dp
layout-sw360dp
layout-sw320dp
layout-w400dp
layout-w384dp
layout-w360dp
layout-w320dp
layout-mdpi
layout-1024x768
layout-960x540
layout-800x480
layout-480x320
layout
layout-hdpi
layout-xhdpi
 
옵티머스 빅 (OS : 2.3, 해상도 : 480 X 800)
 
layout-hdpi
layout-xhdpi
layout-mdpi
layout-800x480
layout
 
옵티머스 원 (OS : 2.2, 해상도 : 320 X 480)
 
layout-mdpi
layout-480x320
layout-hdpi
layout-xhdpi
layout

'Programs > Android' 카테고리의 다른 글

ANDROID DP/PX CONVERTER  (0) 2014.08.28
안드로이드 Resource 확장 적용 순서  (0) 2014.08.26
바탕화면 실행아이콘 크기  (0) 2014.08.18
GCM(Google Cloud Message)  (0) 2014.08.01
Java 에서 한글 체크  (1) 2014.04.24
Posted by outliers
,