'전체 글'에 해당되는 글 171건

  1. 2013.04.29 [android] TextView의 maxLines과 ellipsize 버그
  2. 2013.04.18 [android] FLAG_ACTIVITY_SINGLE_TOP으로 activity 실행시 intent 받아 처리하기
  3. 2013.04.15 [뉴스] iPhone6 컨셉 영상
  4. 2013.04.12 [오렌지라벨] 오렌지 라벨의 의미, 품종 1
  5. 2013.04.10 [android] TextView 코드로 생성하면서 style 적용하기

[android] TextView의 maxLines과 ellipsize 버그

android 2013. 4. 29. 21:39

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

기본으로 제공하는 TextView을 이용해서 maxLines ellipse를 이용해서 2줄까지 표시하면서 더 긴경우에는 말줄임으로 하고 싶을때가 있다.  모두가 당연히 아래처럼 설정할 것이다.

 

<TextView

     android:id="@+id/textView1"

     android:layout_width="match_parent"

     android:layout_height="wrap_content"       

     android:maxLines="4"

     android:ellipsize="end"/>

 

maxLines 속성과 ellipsize 속성으로 4줄까지 표시되고 더 긴경우에는 말줄임이 표시되도록 의도한 것이다. Android 4.0에서 확인하면 잘 동작하는데 문제는 2.3이하에서 발생한다. 위처럼 하면 2줄까지 표시되고 말줄임이 되는 것이다.

구글링을 해보니 android의 버그라고 되어 있다.

( 참고 : http://code.google.com/p/android/issues/detail?id=2254 )

관련해서 여러가지 openSource로 해결책이 제시 되어 있다.

 

1. EllipsizingTextView

특징 :

* TextView StaticLayout을 이용하여 특정라인까지의 text를 자르고, 뒤에 을 붙이는 방식

* EllipsizeListener 를 이용하여 말줄임 여부를 체크할수 있도록 되어 있다.

* draw시점에 text를 동적으로 구하는 방식으로 adapter 에서 사용할 경우 성능 이슈가 있을수 있다.

* 확대(expand) / 축소(collapse) 기능 없음.

소스 : https://github.com/KhalidElSayed/EllipsizingTextView

 

 

 

2. TextViewMultilineEllipse

특징

* View를 상속받아서 TextPaint로 각각의 라인을 자르는 방식

* 동적으로 구하는 시점은 onMeasure에서

* 확대 / 축소 기능 있음.

* 내부의 LineBreaker 소스는 참고하면 좋을 듯

* 버그 : space가 없는 문자열인 경우 crash 발생하지만 debugging 하면 금방 고칠수 있음.

* 단점 : View를 상속받아서 TextView의 기능들을 사용할 수 없음 ( , SpannableString )

소스 : http://code.google.com/p/android-textview-multiline-ellipse/source/browse/trunk/TextViewMultilineEllipse.java?r=2

 

결론은 1번의 EllipsizingTextView를 속도 최적화 하여서 사용함.

또다른 버그가 발견했습니다.

Android 4.0 이상에서는 iPhone에서 입력한 이모티콘을 표시해주는 기능이 있는데, 1번의 코드를 사용하면 해당 이모티콘이 안보입니다. TextView를 상속받고 거기서 setText를 하면 발생합니다. 해결책은 여기 참고 https://github.com/sharakova/EmojiTextView/tree/master/src/jp/sharakova/android/emoji

 

* OpenSource는 완벽한게 아니라 해당상황에 대한 간단한 해결책인 경우가 많다. 사용시 여러방면의 test가 필요하다. 그리고 필요하면 수정해서 사용하자.

 

 



:

[android] FLAG_ACTIVITY_SINGLE_TOP으로 activity 실행시 intent 받아 처리하기

android 2013. 4. 18. 10:21

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

startActivity를 호출하여 전달할 값을 putExtra()를 호출하여 intent에 설정하고, 호출된 Activity에서 getIntent()intent를 얻어 왔는데 이상하게 넘겨준값이 없다.  한참 고민하다가 발견한 것은 startActivity로 넘겨주는 intent  FLAG_ACTIVITY_SINGLE_TOP을 설정한 점이다.

 

Intent intent = new Intent(context, SomeActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

            

intent.putExtra(PARAM_1, value1);

intent.putExtra(PARAM_2, value1);

intent.putExtra(PARAM_3, value1);

 

            

context.startActivity(intent);

 

FLAG_ACTIVITY_SINGLE_TOP Activity를 재사용 하기 위해서 설정한것이고 필요없는 Activity를 재거하기 위해서 FLAG_ACTIVITY_CLEAR_TOP 을 같이 조합하였다.

 

이런경우 SomeActivity에서는 onNewIntent() override 해서 intent를 받아야 한다.

그리고 setIntent()를 호출해서 다음에 ( onResume 같은데서 ) getIntentintent를 다시 참조해야 할 경우를 위해서 대비하는 것이 좋다.

 

@Override

protected void onNewIntent(Intent intent) {

       super.onNewIntent(intent);

 

       if (null != intent) {

             int defaultValue = 0;

              index = intent.getIntExtra(PARAM_1, defaultValue);

            

             setIntent(intent); 

}

}

 

호출되는 순서는 onCreate() 대신에 onNewIntent()가 호출되고 다음으로 onResume() 이 호출된다 

처음 startActivity 호출시

1.     onCreate

2.     onStart

3.     onResume

해당 Activity가 실행된 상태에서  flas를 추가하고 다시 startActivity 호출시

1.     onNewIntent

2.     onResume

 

 

 

 



:

[뉴스] iPhone6 컨셉 영상

IT활용 2013. 4. 15. 13:20

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

디자이너 "랜 아브니(Ran Avni)"는 youtube에 아이폰6 컨셉 영상을 올렸습니다.  ( 2013-04 )

 

 

 

[특징]

화면 크기가 기존 4인치에서 4.5 인치로 커짐.

본체 두께는 조금더 얆아짐.

전면의 홈버튼이 없어져서 화면이 더 커졌으나, 1줄에 표시되는 앱아이콘은 그대로 4개임

뒷몇이 투톤(상단의 무광택 검정생과 하단의 광택나는 검정색)으로 구성됨.

 

주의 : 단지 컨셉영상일뿐이므로 상당수 변화가 예상됩니다.



:

[오렌지라벨] 오렌지 라벨의 의미, 품종

사회&문화 2013. 4. 12. 14:07

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

4월이 되자 마트에 또 오렌지가 나오기 시작했다. 지금이 오렌지의 철이라고 합니다.
매년 요맘때면 오렌지를 마트에서 사먹었는데, 항상 4012 숫자가 붙은 라벨이 붙어 있었습니다.
그런데, 지난주에 백화점에 갔다가 블랙라벨 오렌지라면서 팔더라구요. 시식을 해보니 더 맛있었습니다.
역시 백화점에서 파는 물건이 더 좋구나( 물론 가격도 더 비싸죠~ )

그래서 오렌지의 라벨에는 숫자와 색깔이있는데 무척이나 궁금했습니다. 인터넷을 찾아봐더 여러가지 설들이 있는데, 이것저것 조사해서 정리하면 아래와 같습니다. 

1. 오렌지 품종

발렌시아 오렌지
오렌지의 원산지인 인도에서 15세기 포르투갈로 전파된 것이 발렌시아 오렌지가 되었다. 명칭은 스페인 사람들이 자국의 발렌시아 지방에서 나는 것과 비슷하다고 말한 데서 유래되었다. 오렌지 가운데 세계에서 가장 많이 재배되는 품종으로, 보통 오렌지라고 하면 이 오렌지를 가리킨다. 2월부터 11월까지가 제철로, 이 시기에 생산된 것은 당도가 높고 즙이 풍부하며 씨도 적다. 완전히 익은 것은 황금색을 띠는데, 따지 않고 그대로 두면 따뜻한 지표 온도와 엽록소의 작용으로 인해 줄기에 매달린 부분부터 다시 표피만 녹색으로 변한다. 이를 재초록화 현상이라고 하는데, 당도나 과즙의 맛 등에는 영향을 끼치지 않는다.

네이블 오렌지
네이블은 '배꼽'이라는 뜻으로, 꼭지 아래쪽이 배꼽 모양을 하고 있다고 하여 붙여진 이름이다. 오렌지는 원산지인 인도에서 포르투갈로 전파된 것이 발렌시아 오렌지가 되었고, 브라질로 전파된 것은 다시 미국으로 퍼져 네이블 오렌지가 되었다. 19세기 초에 브라질의 오렌지 나무에서 돌연변이체가 나타나 씨 없는 오렌지가 열렸는데, 오늘날의 네이블 오렌지는 모두 이 돌연변이체에서 유래된 것이라고 한다.

 

2. 라벨의 숫자는 멀까요~
라벨의 숫자는 PLU(Price-Look up) 코드입니다.
오렌지가 과일이다 보니 가격을 정하기 쉽게 품종이나 크기에 따라서 구분해 놓은 것입니다.
PLU는 미국에서 생활할 때 알아두면 좋은 정보더라구요. 

 


마트에서 많이 사먹던 4012 는 크기가 큰 오렌지였네요.  이번에 백화점에서 산 3107은 중간 크기의 오렌지였구요.
우리가 많이 먹는 네이블 오렌지는 4012(큰거), 3107(중간), 4013(작은거)로 구분이 되고 발렌시아 오렌지는 3108(중간거), 4014(작은거)로 구분이 된다.  이제 번호를 보면 어떤 품종의 어떤크기인지 알 수 있게 되었습니다.

3. 라벨의 색깔은 멀까요~ 
 의미는 유통자/수출회사(distributor)별로 구분하는 상표 등급입니다. 예를 들어서 블랙라벨이라고 하면 좋다고 하는데, 블랙라벨도 다 같은게 아니라 어느회사의 블랙라벨인가를 알아야 합니다. 오렌지 회사의 브렌드는 썬키스트, 델몬트, 퓨어스팩등이 우리에게 알려져 있습니다. 요즘에는 류어스팩이 고급 브랜드로 뜨고 있는데, 퓨어스팩의 경우 블랙라벨과 흰색라벨이 있습니다. 블랙라벨이 더 비싸고 맛도 더 좋습니다.

4. 맛있는 오렌지를 고르는 방법
같은 크기면 무게가 무거운게 좋다.
표면이 매끄러운게 좋다.
껍질이 얇은게 맛있다. 
배꼽은 크게 상관 없는듯.

위와 같은 일반적인 방법들이 있는데, 하나씩 고르기도 힘들고 그냥 비싼거 사먹으면 대부분 맛있다.


 



:

[android] TextView 코드로 생성하면서 style 적용하기

android 2013. 4. 10. 17:17

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

TextView에 글자크기나 글자색깔등의 속성을 묶어서 style로 만들어 놓고 쓰면 편리하다.

아래는 글자크기를 22sp, 색상은 white로 그리고 그림자효과(shadow)를 묶어서 style로 만들었다.

 

<style name="myTitleText">

        <item name="android:textSize">22sp</item>

        <item name="android:textColor">#ffffff</item>

        <item name="android:shadowColor">#4e000000</item>

        <item name="android:shadowDy">2</item>

        <item name="android:shadowRadius">1</item>

        <item name="android:gravity">center_vertical</item>

</style>

 

Xml 파일에서 간단하게 style을 설정하면 된다.

<Textview

       android:id="@+id/my_text"

       style="@style/myTitleText"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content" />

 

그런데 TextViewXML에 선언하지 않고 코드에서 생성해서 style을 적용하려니 잘 안된다. 처음에는 그냥 직접 속성들을 적용하였다.

 

textView.setTextSize(22);

textView.setTextColor(0xffffffff);

textView.setShadowLayer(1, 0, 2, 0x4e000000);

textView.setGravity(Gravity.CENTER_VERTICAL);

 

그러나 뭔가 개운치가 않다. style로 묶은 것은 해당 style을 재사용 하기 위한것인데, XML에 정의해서 다른곳에서 사용하는 부분과, 코드에서 직접 적용한 부분으로 2중으로 정의되어 있으면 향후 style이 변경되었을 때 두군데를 다고쳐야 한다. 유지 보수시에 실수하기 좋은 방식이므로 코드에서 XML에서 정의한 style을 불러다 쓰고 싶었다. 이것저것 찾아보다 TextView에서 setTextAppearance 라는 메소드를 제공한다. 이것을 사용하면 간단하게 적용 가능하다

 

textView = new TextView(getContext());

LayoutParams textParam;

textParam = new LayoutParams(30, 30); // 임의의 크기로 param 생성

textParam.width = LayoutParams.WRAP_CONTENT;

textParam.height = LayoutParams.MATCH_PARENT;

textParam.setMargins(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());

                    

addView(textView, textParam);

textView.setTextAppearance(context, R.style.myTitleText);

 

주로 XML을 이용해서 UI 구성을 하다가 가끔 코드로 하려면 익숙지가 않다. 하지만 android도 내부적으로 어차피 XML을 읽어서 적용하는 것이기 때문에 각각의 XML에 매핑되는 함수들이 반드시 존재한다. 다만 가끔씩 직관적이지 않은 것들이 있을 뿐이다.

 



: