Java의 리플렉션 API




 java.lang.Class#forName  클래스명으로부터 Class 객체를 취득한다.
 java.lang.Class#forName  객체를 생성한다.
 java.lang.Class#getConstructor  생성자 객체를 취득한다.
 java.lang.Class#getMethod

 메소드 객체를 취득한다.

 java.lang.Class#getField  필드 객체를 취득한다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

Java의 리플렉션 API  (0) 2013.01.18
JNI 네이밍 규약  (0) 2012.11.13
byte to long conversion  (0) 2012.04.27
자바로 소수점 반올림하기  (1) 2012.04.10
소수점 올림  (0) 2011.11.14
디렉토리 지우기  (0) 2011.10.16

특정 라이브러리가 없으면 설치 안되게 하기



 

특정라이브러리가 없으면 설치 안되게....

        <!-- This is how we can request a library but still allow the app
             to be installed if it doesn't exist. -->
        <uses-library android:name="com.example.will.never.exist" android:required="true" />

 

설치 할 수 없다는... 에러메시지...

[2012-12-12 10:39:25 - ApiDemos] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
[2012-12-12 10:39:25 - ApiDemos] Please check logcat output for more details.
[2012-12-12 10:39:25 - ApiDemos] Launch canceled!


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

JNI 네이밍 규약






<returnType> Java_<com_mypackage>_<class>_<methodName> (JNIEnv* pEnv, <parameters> ...)


첫번째 인자는 언제나, JNIEnv타입.

그다음 인자는 자바 메소드의 실제 매개변수들.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

Java의 리플렉션 API  (0) 2013.01.18
JNI 네이밍 규약  (0) 2012.11.13
byte to long conversion  (0) 2012.04.27
자바로 소수점 반올림하기  (1) 2012.04.10
소수점 올림  (0) 2011.11.14
디렉토리 지우기  (0) 2011.10.16

이진검색 (Binary Search)




이진검색이란 ?


이진검색은, 정렬된 데이터에서 특정한 데이터를 찾는 방법이다. . 처음과 중간의 값을 임의의 값으로 선택하여, 그 값을 찾고자 하는 값과 크고 작음을 비교하는 방식을 채택한다. 또 다시, 처음 선택한 중앙값이 만약 찾는 값보다 크면 그 값은 새로운 최고값이 되며, 작으면 그 값은 새로운 최하값이 된다. 이 일을 반복한다. 


예를 들어, 아래 16개의 데이터에서, 1개의 숫자를 찾는다고 하면... 4번의 시도로 숫자를 찾을 수 있다.


따라서, 복잡도는 O(logN)이 된다. 

계산해 보면, 생각해보면 당연한 일.


내가 하던.. 사전에서 자주 사용하던 알고리즘이다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > 자료구조' 카테고리의 다른 글

이진검색 (Binary Search)  (0) 2012.11.09

[DRM] 마켓별 DRM 적용방법.





1. DRM 적용 스토어 리스트.

1. 구글 스토어 

2. 티스토어 

3. 삼성앱스

4. 올레마켓


2. 적용방법 


# 각 스토어 별로 DRM 적용 방법은 , 각 스토어 별로 안내 지침 보셔야 합니다.


   제가 하나하나 알려 드리면 좋지만, 

   - 스토어 별로 DRM이 주기적으로 업데이트 되며, ( DRM 라이브러리의 버전이 맞지 않다면, 리젝됩니다. ), 주기적으로 소스도 바뀝니다.

   - 파일 하나로 끝나는 것이 아니라, java 파일, manifest파일, proguard관련 설정 까지 경우에 따라서 맞추어야 합니다.

  그래서, 스토어 안내사항 보시는 것이 최고입니다. 


# 스토어별 링크 


1. 구글 스토어 

- 추가적 DRM 필요 없습니다. 


2. 티스토어 

 - http://dev.tstore.co.kr/devpoc/download/downloadApplicationDRM.omp?ctgrCd=applicationDRM&menuId=1


3. 삼성앱스 

 - http://developer.samsung.com/android ( 요기 들어가서 열심히 검색. )


4. 올레마켓 

- https://seller.ollehmarket.com/page/cs_devpds_front/devpds_view_list.jsp?selectnid=51200011123208&pagesize=5&pagecount=10&pagecurrent=1&pagestart=1


# 해당 마켓에 자세히 설명이 나와있으니, 안내사항대로 순차적으로 적용하시면 어려운 점 없으실 겁니다.



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 개발자 간담회 후기 ( 2 )




안드로이드 개발자 간담회 각 세션에 대한 상세 설명을 기록해 보자. ^^ 

감상평은 요기. 

2012/09/18 - [Programming/android] - 안드로이드 개발자 간담회 후기 ( 1 )

앞쪽에서는, 열심히 적었는데.. 뒤로 갈수록 졸음이 밀려와서 약간은 기록이 허술하다. ㅜ_ㅜ


사진 출처는 : 권순선 님의 구글 플러스 


모든 세션은 영어로만 진행되고, 통역지원조차 되지 않아 불가피하게 영어로 필기. 

뭐 통역하면서 필기하는 것이 더 어려우니까.. 휴..

흠... 몇가지만 한글로 살짝 통역하고... 나머지는 뭐 패스. ^^;;


아, 발표 내용중에 VSync라는 내용에 대하여, 조금은 길게 설명했는데...

이는 잘 모르겠는 내용. 공부가 필요하다.


1st. Definitive Android Design ( 결정적인 안드로이드 디자인 ? ) 


- Density independent pixels


  Allows developers to build flexible UIs

  > 유연한 UI를 만들어라.


  ldpi / mdpi / hdpi / xhdpi

  > density 에 따라서, 위의 리소스 타입을 모두 구현하라.


- Bitmap assets


  Build assets for each density

  ldpi, mdpi, hdpi, xhdpi


  scale up ( interpolation)

  scale down (aliasing)


  > Bitmap asset을 사용할때도, density 에 따라서, 위의 리소스 타입을 모두 구현하라.

     자체적으로 , scale up <-> scale down을 하긴 하지만, 이것이 이미지의 품질을 보장하지는 않는다.


- Tablet 


  >= Android 3.2, Smallest width 600dp(sw600dp)layout-sw600dp

  < Android 3.2, large or xlarge layouts - layout-large , layout-xlarge


  - 48dp height = ~9mm

  Touchscreen objects should be 7-10mm


  > 터치영역은 최소 48dp height는 되어야 한다. 사용자에게 터치 실수를 하게 하면 안된다.

- Mind the Gap 

Leave space for borders


- Gap 


  > 사용자가 잘못 터치하는 것을 미연에 방지하기 위하여...

  padding 16dip정도… 주어야 한다. 컨텐츠 크기를 넓히기 위해서 Gap을 좁게 하면 안된다.


- Action Bar 

  > 액션바에는 다음 4가지가 있다.


   1. App icon - 이동을 도와주기도 한다.

   2. View control

   3. Action buttons

   4. Action overflow - 휴대 기기의 한정된 공간을 이용하기 위하여….


- Rotation & different screen sizes


  > 상태에 따라 한가지 어플리케이션도 다르게 화면 구성을 해야 한다.


- Notification


- Base Layout (?)


  Not changed in Jelly Bean

  > 잘 모르겠다. 공부 하자.


-Expanded layout (?)

  > 잘 모르겠다. 공부 하자.


-Actions (?)


   Handle most common tasks

   Streamline trianging

   Do not abuse it

  > 잘 모르겠다. 공부 하자.

   

* App Structure


- General structure


   - Top level views - Put content forward


- Up vs back


   Up and back is different


- Navigation controls


- Fragments 


   Reusable UI components

      Can be used as non-UI data objects


   Organise layouts in sections

      Each section is a fragment


   Display multiple fragments on tablets

      One or two on phones


 - Swipeable pages

   

   ViewPager class

      PagerAdapter - swipe able views


- Support Library


   1.6 +


- Pure Android 

  > 안드로이드를 안드로이드 답게 개발하자.


  Don'ts 

     Mimic UI from other platforms

     > 다른 플랫폼을 흉내내어 디자인 하지 말자.

     Carry over platform-specific icons

     Use bottom tab bars 

     > 안드로이드 탭은 위.. 아이폰은 아래…

        안드로이드의 백키 및 메뉴키가 같이 눌릴 수 있으므로... 위에 놓는 것이 좋다.

     Use labeled back buttons

     Use right-point caret buttons ">"표시!

     > 이 또한 아이폰을 흉내내지 말라.


 Do's 

     Use Action bar

     Build intelligent context-aware apps

     Pre-load data at appropriate times

     Focus on the user experience

     Provide offline support

     > 모든 사용자들이 네트워크게 연결되어 있다고 생각하지 말고, 오프라인일때도 사용할 수 있게 하라.


2st. What's new in Android.


* Project Butter


- UI Goals

  - Smooth

  - Responsive


- Jank

  - Missed frames

  - Repeated frames

  - Resulting in jittery animation


- VSync ( Before JellyBean.!? )


  - Displays draw at 60 fps

  - VSync is a control signal

    - For each frame


- Drawing without VSync

- Drawing with VSync


- Double Buffering

- Triple Buffering


* Rich Notifications


* SDK Tools


- New tools

    - Lint

    - Device Monitor

    - System Trace


- Rapid development

    - Improved visual layout editor

    - App template


* Building Android App with Wep API's.


* Google Play


발표자 : Tony Chan , Ankur Kotwal


* 추가 질문 : 구글 플러스와 같은… 홈버튼을 누르면 나오는 슬라이드 드로워 같은… 것은 공개 여부가 있는가?

하고 있다. 공개 예정이다.


3st. In App Billling

  - 인앱 빌링은... 필기까지는 안했다. 

    여튼, 발표자분 귀여우셨다는... 


4st. How to get featured


1. What are we looking for?

  - Always think about the user!


2. Greate looking App Page


- 멋진 아이콘

- 멋진 포트터 사진

- 내용이 좋은… 어플리케이션 설명.

- Video를 넣어도 좋다!


3. Think "Pure Android"


 - Don't use bottom tab navigation bars. 

     ( 터치가 겹칠 수 있다. )

 - Be mindful about back button navigation. 


4. Other things we look for


- Apps over 1MB should allow users to "Move to SD card"

- User ratings ( > 4.0 )

- Not everyone in the world has great mobile networks -> Think about your offline experience.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 개발자 간담회 후기 ( 1 )





휴가 중 짬을 내어, 안드로이드 개발자 간담회에 다녀왔다.


열정적인 개발자들이 참 많았던 자리, 

이런 모임은 항상 스스로를 독려하게 한다.


발표자들의 모습을 보면... 타고난 재능을 기반으로, 즐겁게 최선을 다하며 개발을 즐기고 있는 그들의 모습이 느껴진다.

나는 정말 그들만큼 하면서, 주어진 현실을 비판하고 있는 것일까? 


아이구야, 이상한 사족이 길다.


강남 파이낸스 센터 . 구글 본사에서 진행된, 안드로이드 간담회.

권순선 부장님의 구글 플러스에서 가져온 사진입니다.

70여명의 사람들이 모여있다. 우르르르~ 열정적인 개발자님들... 항상 존경스럽다. 


흠, 세션은 다음과 같다.


상세 일정


- 6:00 ~ 6:30 저녁식사

- 6:30 ~ 7:00 Android Design Guide

- 7:00 ~ 7:30 What's New in Android

- 7:30 ~ 8:00 In App Billing / Subscription : 요 세션에서.. 발표자분. 너무 귀여우시던... 하하..

- 8:00 ~ 8:30 Fighting Piracy 또는 How to get featured in Play Store

- 8:30 ~ 9:00 QnA (온라인 질문)

- 9:00 ~ 9:30 QnA (현장 질문)


개인적으로, What's New in Android 가 좋았다.

개발을 하다보면, 항상 익숙하던 것만 무던하게 사용하는데... 


새로운 것도 한번 사용하여 개발을 진행해야 겠다! 라는 결심이 서게 해주었으니 ^^


아 맞다. 귀여운 스티커들도 주셨다. 

그래서, 내 맥북이에 살포시 붙여주었지만, 안이쁘다는 오류.. ㅜㅠ


먼저, 간단한 간담회에 대한 감상은 이정도...



세션에 대한 상세 설명은 다음 글에 이어서... ^^



2012/09/18 - [Programming/android] - 안드로이드 개발자 간담회 후기 ( 2 )



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android' 카테고리의 다른 글

[DRM] 마켓별 DRM 적용방법.  (1) 2012.11.09
안드로이드 개발자 간담회 후기 ( 2 )  (5) 2012.09.18
안드로이드 개발자 간담회 후기 ( 1 )  (0) 2012.09.18
android weightSum사용하기.  (4) 2012.07.24
Android sqlCipher Proguard 오류시...  (0) 2012.07.20
sqlCipher  (2) 2012.07.17

android weightSum사용하기.



parent에 weight_sum을 1로 정하시고, child에 layout_weight 을 .7로 주면.. 70%를 차지하게 됩니다.


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:weightSum="1"

    android:background="#ffffffff">

<LinearLayout  

    android:layout_width="fill_parent" 

    android:layout_height="0dip"

    android:layout_weight="0.7"

    android:background="#ff000000"/>

</LinearLayout>


안드로이드 한지, 2년만에 알게된, 새로운 사실... -_-;;;


출처 : http://www.androidpub.com/1507297

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Android sqlCipher Proguard 오류시...



SQLCIPHER

 

In Android development, you probably want to encrypt the database (*.sdf) so that user (especially with rooted device) can't read the database without the application; for example, using SQLite Database Browser (http://sqlitebrowser.sourceforge.net). Fortunately, you can useSQLCipher (http://sqlcipher.net) to complete the task. Here are the implementation steps:

  • Download the latest SQLCipher library from their website. I recommend you download the binaries (*.zip).
  • Extract the file. It should contains libs and assets folder.
  • Copy (and replace) these 2 folders into your project.
  • Add these new libraries into your project classpath. For example if you are using Eclipse IDE (http://www.eclipse.org), you can resolve by click menu Project > Properties. ChoseJava Build Path tab, and then Libraries on the next tab. Click Add JARs, chose all *.zipand *.jar files from SQLCipher libraries. Click OK.
  • Change all packages import statements from android.database.sqlite.* intoinfo.guardianproject.database.sqlcipher.*. But the original android.database.Cursorcan still be used.
  • Add these lines at onCreate method in first activity class. pragmaKey is a key you defined (String).

         SQLiteDatabase.LoadLibs(this);

         SQLiteOpenHelper.getWritableDatabase(pragmaKey); 

  • Run the application.
  • Pull the database (*.sdf). It should be unrecognized as a database when you open it withSQLite Database Browser.

 

PROGUARD

 

With ProGuard (http://proguard.sourceforge.net) you can shrink, optimize, and obfuscate your code so that your exported (*.apk) file become smaller in size and more difficult to reverse by another engineer. Here are the implementation steps:

  • In your project, add this line into default.properties file. It shows that your proguard configuration is based on proguard.cfg file.

         proguard.config=proguard.cfg 

  • You can fix errors while exporting your project or running your application by adding –keepline in proguard.cfg file. For example like:

         -keep public class * extends android.app.Activity

 

 

INTEGRATION

 

When I develop this integration, it seems ProGuard hasn't tested with SQLCipher yet. So I have to exclude SQLCipher libraries in ProGuard configuration.

 

     -keep public class info.guardianproject.database.** {

         *;

     }

 

     -libraryjars libs/commons-codec.jar

     -libraryjars libs/guava-r09.jar

     -libraryjars libs/jsr305-1.3.9.jar

     -libraryjars libs/sqlcipher.jar

     -libraryjars assets/icudt46l.zip

 

If you find errors similar with insertWithOnConflict or Verifier rejected class from SQLCipherpackage, you should upgrade your ProGuard libraries in your android-sdk.


출처 : http://www.facebook.com/notes/hendrick-prasdito/how-to-integrating-sqlcipher-and-proguard-in-android-development/10150980582279008


 추가자료 : 

1. https://groups.google.com/forum/?fromgroups#!searchin/sqlcipher/proguard/sqlcipher/-odd0jrXH-I/jwdQAfwPwegJ

2. http://proguard.sourceforge.net/#manual/usage.html


외국 아이들은 참 친절한듯... 

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

sqlCipher




요즘, 프로젝트에 sqlCipher를 쓰고 있다...

sqlite 암호화 툴로, 안드로이드, IOS, php등 다양하게 사용 가능합니다.

공식 홈페이지 : http://sqlcipher.net/


# 헌데 생긴 문제점 !!


Performance가 너무 안나왔다.

데이터가 70000건까지는 원활한 속도로 수행하였으나, 


뭐, 120000건이 넘어가자... 쿼리 하나를 하는 속도가 2초까지 나왔다. 흠...

쿼리를 아무리 최적화하고, 인덱스를 잡고 등등 다해도....

나는 200000건이 넘어가는 테이블도 있었는데... ㅠ_ㅠ 

왜그렇게 만들었냐고 묻는다면, 내가 안만들었으니 주는대로 쓸뿐이다...

이 정도까지 모바일에서 사용해보겠다고 만들어본것도 조금은 용감하네... 흠...


그래서, 적용하다가... 일부 중요한 데이터에만 사용하기로 하였다.


여하튼, sqlcipher...

"너무 많은 데이터에 사용하기에는 퍼포먼스가 안나올수 있다."


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 복사한 데이터 베이스 사용하려면,




파일은 asset에 넣고, 복사하여 사용하면, 되지만, 


"android_metadata"라는 테이블이 없으면, 오류가 생긴다. Locale정보를 저장한다는.

http://developer.android.com/reference/java/util/Locale.html

* 데이터베이스를 열 때, 생성한 데이터베이스가 아닌 외부에서 만들어져서 복사된 데이터 베이스인 경우

android_metadata라는 테이블이 데이터베이스 마다 존재해야 하며, 해당 테이블에는 로케일과 관련된 정보가 저장된다. 다음과 같은 쿼리 둘을 실행시켜 테이블을 생성하고, 필드를 추가해야 한다.

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'ko_KR')

INSERT INTO "android_metadata" VALUES ('ko_KR')


- 위의 방법을 이용해서 테이블에 로케일을 지정해준 경우에는 setLocale() 메소드를 이용해 로케일을 변경해 줄 수 있다. 현재 안드로이드에서 지원하는 로케일의 종류에 대해서는 Locale 클래스를 참조:

http://developer.android.com/reference/java/util/Locale.html


* 그러나, 로케일 지정을 원하지 않는 경우, 데이터베이스를 SQLiteDatabase.openDatabase() 클래스 메소드를 이용하여 열 때 SQLiteDatabase.NO_LOCALIZED_COLLATORS 옵션을 추가해서 열어 주어야 한다.

SQLiteDatabase db = SQLiteDatabase.openDatabase(dbPath, null,

                  SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);


* 위 테이블이 존재하지 않는 경우 에러가 발생한다.


Note.

1. 솔직히 에러가 날 때도 있고 그렇지 않을 때 도 있었다. 불행하게도 이유는 찾지 못했다. 왜지?

2. SQLiteDatabase.NO_LOCALIZED_COLLATORS 를 추가해도 문제가 해결되지 않는 경우도 있다고 한다. 역시 이유는 알 수 없다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

서식 문자의 종류




 서식문자   출력 형태

 %c

  단일 문자

 %d   부호 있는 10진 정수
 %i   부호 있는 10진 정수, %d와 같음
 %f

  부호 있는 10진 실수

 %s   문자열
 %o

  부호 없는 8진 정수

 %u

  부호 없는 10진 정수

 %x   부호없는 16진 정수, 소문자 사용
 %X

  부호없는 16진 정수, 대문자 사용.

 %e 

  e 표기법에 의한 실수

 %E 

  E 표기법에 의한 실수 

 %g   값에 따라서 %f, %e 둘 중 하나를 선택
 %G 

  값에 따라서 %f, %E 중 하나를 선택

 %%

  % 기호출력 


* 서식 문자를 응용해, 필드 폭을 지정.

  서식 문자

 출력의 형태 
  %3d  필드 폭을 3칸 확보하고 오른쪽 정렬하여 출력. 
  %-3d  필드 폭을 3칸 확보하고 왼쪽 정렬하여 출력. 
  %+3d

 필드 폭을 3칸 확보하고 오른쪽 정렬한 상태에서 양수는 +, 음수는 -를 붙여서 출력 


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming' 카테고리의 다른 글

서식 문자의 종류  (0) 2012.06.27
GPL라이선스 정보  (0) 2012.05.25
고급언어와 저급언어  (0) 2011.06.19
사용가능한 API 리스트 정리  (0) 2011.06.16
이클립스 자바독 인코딩에러 해결법  (0) 2011.02.18
guava-libraries  (0) 2011.02.08

카카오톡 테마 만들기




시간이 살짝 비는데, 카카오톡 테마를 만들어볼까나,

http://www.kakao.com/talk/theme


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > etc' 카테고리의 다른 글

카카오톡 테마 만들기  (0) 2012.06.27
프랭클린 플래너 속지  (1) 2011.07.23

cocos2dx android back키 적용




요약. -> 안드로이드 하드웨어키인 back키를 누르면 종료되도록 한다.


1. I added a virtual void keyBackClicked(); in MainMenu.h

2. Then in MainMenu.cpp I added this->setIsKeypadEnabled(true); 
3. in MainMenu::init() and added a method:
void MainMenu::keyBackClicked() {
  CCDirector::sharedDirector()->end();
}


출처 http://www.cocos2d-x.org/boards/6/topics/5041?r=10363#message-10363





신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > cocos2d-x' 카테고리의 다른 글

cocos2dx android back키 적용  (0) 2012.06.27
cocos 2d란 ?  (0) 2011.06.16
[ Cocos 2d Example ] ActionManagerTest  (0) 2011.06.16

안드로이드 단말별 해상도 정보



(단위 : 픽셀)

범주기기명가로세로가로비세로비
Apple아이패드7681024

1

1.3

아이폰4G640960

1

1.5

아이폰3G320460

1

1.4375

HVGAG1, 옵티머스1, 이자르 등320480

1

1.5

WVGA 800넥서스원, 갤럭시S, 갤럭시S2, 디자이어 등480800

1

1.66

WVGA 854모토로라, 드로이드, XPeria, X10 등480854

1

1.77

7인치 태블릿킨들파이어, 누크태블릿, 갤럭시탭 7인치6001024

1

1.7

10인치 태블릿갤럭시탭 10.1, Asus transformer8001280

1

1.6

10인치 태블릿2모토로라 XOOM7201280

1

1.77

-갤럭시 S2 LTE, 갤럭시 S37201280

1

1.77

갤럭시 노트8001280

1

1.6

갤럭시 넥서스7201280

1

1.77


잘못 기재된 내용이 있다면, 덧글 부탁드립니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

GPL라이선스 정보



http://www.gnu.org/licenses/gpl-faq.ko.html#AnonFTPAndSendSources


항상 잊기 때문에... 기록해둔다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming' 카테고리의 다른 글

서식 문자의 종류  (0) 2012.06.27
GPL라이선스 정보  (0) 2012.05.25
고급언어와 저급언어  (0) 2011.06.19
사용가능한 API 리스트 정리  (0) 2011.06.16
이클립스 자바독 인코딩에러 해결법  (0) 2011.02.18
guava-libraries  (0) 2011.02.08

android NDK 개발하기 설정.



출처 : http://thdev.net/117


Android NDK r7(최신버전)을 설치하고 build하는 방법을 설명하겠습니다.

 r7 이라고해서 기존 버전과 설치 방법이 다르거나 하지는 않았습니다. 다른 블로그를 참고해서 실행방법을 알아보고 제 환경에 맞는 NDK를 사용해보았습니다. 이번 글은 Ubuntu에서 NDK를 설치하고 NDK에서 제공하는 예제 코드를 사용해서 테스트 해보도록 하겠습니다.

android 개발자 페이지
  http://d.android.com

NDK 다운받기
 NDK는 위의 홈페이지로 접속하여, SDK -> android NDK, r7 을 클릭하시고 해당 OS 버전에 맞는 NDK를 다운 받으시면 됩니다.

다운 받은 NDK를 압축 해제하기
 명령어를 통한 압축 해제 방법입니다. tar -xvf android-ndk-r7b-linux-x86.tar.bz 으로 압축 해제를 하거나


다운로드 폴더로 직접이동하여 압축 해제하시면 됩니다.(윈도우와 동일)

NDK 예제 사용하기
 압축 해제가 완료되면 해당 폴더에 android-ndk-r7b 폴더가 생깁니다. 해당 폴더에 접근하면 NDK 관련 파일들이 나열되어 있습니다. docs폴더에는 ndk사용에 관한 설명과 설치관련 설명 문서가 들어있습니다. 이중 홈페이지(안드로이드 개발자 페이지)의 ndk 사용법 설명에  OVERVIEW.HTML 파일을 읽어보라고 되어 있습니다.

 이번 설명에는 NDK에서 제공하는 예제를 사용해보려고 합니다. 예제가 있는 경로는 ./samples/ 폴더안에 있고, 이중 ./hello-jni/ 샘플 프로젝트를 사용해보겠습니다. 먼저 c코드를 확인하고 빌딩하기 위해 jni 폴더로 이동합니다. jni 폴더에는 Android.mk(메이크 파일)과 hello-jni.c(소스코드)가 포함되어 있습니다.

hello-jni.c
 Apache License 2.0에 관한 내용이 설명되어 있고, string.h jni.h 가 포함되어 있습니다.
 아래 코드는 Hello TaeHwan!! My Blog : http://thdev.net 을 jstring(jni에서 사용하는 string) 값으로 return 해주는 코드입니다.
 함수명은 stringFromJNI(JNIEnv* env, jobject thiz) 이 됩니다.

 함수명에 Java_com_example_hellojni_HelloJni 가 추가로 붙어있습니다.
   com_example_hellojni 이 부분은 java 패키지 파일명 이름이 됩니다.
   HelloJni : 이 부분은 java class의 이름이 됩니다.
   만약 함수명이 result이고, 패키지명이 net.thdev.test, Class 명이 hello 라면
   Java_net_thdev_test_hello_result(); 가 되게 됩니다.

String 값은 UTF 형으로 변환하여 return 됩니다.

Android.mk 파일
 ndk-build 하기위해 필요한 파일입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LOCAL_PATH:=$(call my-dir)
   my-dir은 현재 위치(Android.mk의 위치) 현재 소스코드가 존재하는 폴더위치를 반환
 
include $(CLEAR_VARS)
   : 빌드시 GNU Makefile에 필요한 변수들을 초기화
     (e.g. LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, etc...)
 
LOCAL_MODULE
  : 각 모듈을 식별하기 위해 정의되어야 하고, 고유한 이름과 공백을 포함할 수 없습니다.
    "hello-jni" 파일의 공유 라이브러리 모듈은 "libhello-jni.so"가 됩니다.
 
LOCAL_SRC_FILES
   : head를 제외한 C 소스파일이 나열되어야 합니다.
 
include $(BUILD_SHARED_LIBRARY)
  : 공유 라이브러리를 만들지점

이정도로 설명이 되겠네요. 영어가 짧아서 해석하는데 문제가 많습니다. 원본 파일의 위치는 /docs/ANDROID-MK.html 파일을 참고해주세요.

ndk-build
 build 하는 방법입니다. 현재는 PATH로 등록하지 않았기에 아래처럼 사용할 수 있습니다.
 제 android-ndk-r7b의 위치는 Downloads에 있습니다.
  명령어는 : ~/Downloads/android-ndk-r7b/ndk-build 로 실행했습니다. android-ndk-r7b의 위치에 따라 변경하시면 됩니다.

build가 완료되면 아래 처럼 확인이 가능합니다.

Android 실행해보기
 New Android Project를 통해서 실행 가능합니다. 최신 NDK r7버전의 예제코드는 android 4.0.3 에뮬레이터로 동작합니다. 
 Create project from existing source를 통해서 가져오시면 됩니다. 경로는 위에서 작업했던 경로이며 hello-jni 폴더를 선택하셔야 합니다.

아래와 같이 HelloJni.java와 libs/armeabi/폴더 아래 3개 파일을 확인 가능합니다. gdb.setup, gdbserver, libhello-jni.so입니다.

java 코드
 static 으로 hello-jni를 호출 합니다. ndk를 통해서 생성된 lib파일의 이름은 libhello-jni.so 입니다. load할때는 hello-jni만 입력하면 됩니다.

1
2
3
static {
    System.loadLibrary("hello-jni");
}

native 인터페이스
 public native String  stringFromJNI();
   stringFromJNI() 코드는 위 C코드에 작성된 함수를 호출 하기 위한 Native 인터페이스입니다.

코드 사용

1
2
3
TextView  tv = new TextView(this);
tv.setText( stringFromJNI() )
setContentView(tv);
TextView를 생성하고, 거기에 setText해주는 코드입니다. stringFromJNI()를 호출 합니다.

아래와 같은 결과를 얻을 수 있습니다.


마무리
 급하게 한다고..내용이 엉망인것 같습니다. 좀더 공부해서 추가내용 올리도록 하겠습니다. 간단한 프로그램 작성도 하구요!


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

byte to long conversion



package handler.file;


public class ByteHandler {

/**

long -> byte array

* @param data

* @return

*/


public static byte[] toByte(long data) {

 return new byte[] {

  (byte)((data >> 56) & 0xff),

  (byte)((data >> 48) & 0xff),

  (byte)((data >> 40) & 0xff),

  (byte)((data >> 32) & 0xff),

  (byte)((data >> 24) & 0xff),

  (byte)((data >> 16) & 0xff),

  (byte)((data >> 8) & 0xff),

  (byte)((data >> 0) & 0xff),

  };

}


/**

long array -> byte array

* @param data

* @return

*/

public static byte[] toByte(long[] data) {

 if (data == null) 

  return null;

 byte[] bytes = new byte[data.length * 8];

 for (int i = 0; i < data.length; i++)

  System.arraycopy(toByte(data[i]), 0, bytes, i * 8, 8);

 

 return bytes;



/**

byte array -> long

* @param data

* @return

*/

public static long toLong(byte[] data) {

 if (data == null || data.length != 8) 

  return 0x0;

  

 return (long)((long)(0xff & data[0]) << 56 | 

  (long)(0xff & data[1]) << 48 |

  (long)(0xff & data[2]) << 40 |

  (long)(0xff & data[3]) << 32 |

  (long)(0xff & data[4]) << 24 |

  (long)(0xff & data[5]) << 16 |

  (long)(0xff & data[6]) << 8 |

  (long)(0xff & data[7]) << 0 );

}

public static void main(String[] args) {

 long longNum = 325351L;

 System.out.println(toLong(toByte(longNum)));

  }

}


출처 : http://www.sjava.net/111


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

Java의 리플렉션 API  (0) 2013.01.18
JNI 네이밍 규약  (0) 2012.11.13
byte to long conversion  (0) 2012.04.27
자바로 소수점 반올림하기  (1) 2012.04.10
소수점 올림  (0) 2011.11.14
디렉토리 지우기  (0) 2011.10.16

C로 소숫점 반올림하기




아래의 소스를 참조합니다.

반올림 하는 매크로를 작성하여 사용합니다. 

#include <math.h>를 하는 것을 잊지 맙시다.

예 : RoundOff.c

/*

 * RoundOff.c

 *  Created on: 2012. 4. 10.

 *      Author: Lee Hyun Jung

 */

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

/**

 * num : 반올림할 대상 

 * point : 반올림할 자릿수

 */

#define roundOff(num, point) ((floor((x)* (pow(10, point)) + 0.5)/ (pow(10, point))))


int main() {

double x = 12345.67847897;


int i;


for(i=2; i<8; i++){

printf("%f의 %d자리 반올림=%f\n", x, i, roundOff(x, i));

}

return EXIT_SUCCESS;

}

실행결과 :

12345.678479의 2자리 반올림=12345.680000

12345.678479의 3자리 반올림=12345.678000

12345.678479의 4자리 반올림=12345.678500

12345.678479의 5자리 반올림=12345.678480

12345.678479의 6자리 반올림=12345.678479

12345.678479의 7자리 반올림=12345.678479

출처 : 김상형님의 [혼자서 연구하며 배우는 C / C++ ]

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > c' 카테고리의 다른 글

C로 소숫점 반올림하기  (0) 2012.04.10
c언어를 공부하자.  (0) 2011.06.16

자바로 소수점 반올림하기




음수일 경우에도 정상작동하며, 로직은 곰곰히 생각하시면, 이해가실 겁니다~

아래의 roundOff method 이용 한다. 

예 : RoundOff.java

package round;


public class RoundOff {

public static void main(String[] args) {

for(int i=2; i< 9; i++){

System.out.println(roundOff(3.146592416, i));

}

  }

/**

       * num : 반올림할 숫자.

       * point : 어디까지 반올림할 것인가?.

       */

public static String roundOff(double num, int point){

return String.valueOf(Math.floor(num * Math.pow(10, point) + 0.5) / Math.pow(10, point));

}

}


실행결과 : 

3.15

3.147

3.1466

3.14659

3.146592

3.1465924

3.14659242


출처 : 김상형 님의 [ 생각하며 배우는 C / C++ ] 책의 소스를 자바로 변환한 것입니다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

JNI 네이밍 규약  (0) 2012.11.13
byte to long conversion  (0) 2012.04.27
자바로 소수점 반올림하기  (1) 2012.04.10
소수점 올림  (0) 2011.11.14
디렉토리 지우기  (0) 2011.10.16
자바에서 랜덤숫자 만들기  (0) 2011.09.29

Sqlite 문자 합치기.




Sqlite에서의 문자열 합치기는 ||를 이용한다.

사용예 > 

SELECT  "▶ " || CountryName AS CountryName FROM Country;



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > sqlite' 카테고리의 다른 글

Sqlite 문자 합치기.  (0) 2012.01.24
Sqlite에서의 Replace문.  (2) 2012.01.24
SQLite 에서의 NULL 체크  (0) 2012.01.24
sqlite 에서의 if문.  (0) 2012.01.24

Sqlite에서의 Replace문.




문자열 Replace시 사용.

replace(X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. The BINARY collating sequence is used for comparisons. If Y is an empty string then return X unchanged. If Z is not initially a string, it is cast to a UTF-8 string prior to processing.

출처 >  http://www.sqlite.org/lang_corefunc.html#replace


사용예 > 

SELECT REPLACE(CountryName, "K", "L") FROM Country ;


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > sqlite' 카테고리의 다른 글

Sqlite 문자 합치기.  (0) 2012.01.24
Sqlite에서의 Replace문.  (2) 2012.01.24
SQLite 에서의 NULL 체크  (0) 2012.01.24
sqlite 에서의 if문.  (0) 2012.01.24

SQLite 에서의 NULL 체크




Sqlite에서의 NOT NULL은 다음과 같이 체크.

>> COLUMN_NAME IS NULL 
>> COLUMN_NAME IS NOT NULL

 
사용예 >

SELECT CountryName FROM Word WHERE CountryName IS NOT NULL



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > sqlite' 카테고리의 다른 글

Sqlite 문자 합치기.  (0) 2012.01.24
Sqlite에서의 Replace문.  (2) 2012.01.24
SQLite 에서의 NULL 체크  (0) 2012.01.24
sqlite 에서의 if문.  (0) 2012.01.24

sqlite 에서의 if문.




특별히, if문은 존재하지 않는듯.

공식 홈페이지 가면, if문 대신 case문을 쓰라고 한다. 상세 설명은 다음과 같음...
읽어볼 사람은 읽어보시고, 

The CASE expression

A CASE expression serves a role similar to IF-THEN-ELSE in other programming languages.

The optional expression that occurs in between the CASE keyword and the first WHEN keyword is called the "base" expression. There are two basic forms of the CASE expression: those with a base expression and those without.

In a CASE without a base expression, each WHEN expression is evaluated and the result treated as a boolean, starting with the leftmost and continuing to the right. The result of the CASE expression is the evaluation of the THEN expression that corresponds to the first WHEN expression that evaluates to true. Or, if none of the WHEN expressions evaluate to true, the result of evaluating the ELSE expression, if any. If there is no ELSE expression and none of the WHEN expressions are true, then the overall result is NULL.

A NULL result is considered untrue when evaluating WHEN terms.

In a CASE with a base expression, the base expression is evaluated just once and the result is compared against the evaluation of each WHEN expression from left to right. The result of the CASE expression is the evaluation of the THEN expression that corresponds to the first WHEN expression for which the comparison is true. Or, if none of the WHEN expressions evaluate to a value equal to the base expression, the result of evaluating the ELSE expression, if any. If there is no ELSE expression and none of the WHEN expressions produce a result equal to the base expression, the overall result is NULL.

When comparing a base expression against a WHEN expression, the same collating sequence, affinity, and NULL-handling rules apply as if the base expression and WHEN expression are respectively the left- and right-hand operands of an = operator.

If the base expression is NULL then the result of the CASE is always the result of evaluating the ELSE expression if it exists, or NULL if it does not.

Both forms of the CASE expression use lazy, or short-circuit, evaluation.

The only difference between the following two CASE expressions is that the x expression is evaluated exactly once in the first example but might be evaluated multiple times in the second:

  • CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
  • CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END


출처 >  http://www.sqlite.org/lang_expr.html#case 

주저리주저리, 나와있기는 한데.. 그닥 어려운 영어와 내용은 아니다. 아래 사용예 보고 응용하여 사용하면 될듯...

사용예 > 

SELECT case when(rowid==1) then "1이다" else "1이 아니다" end FROM main




 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > sqlite' 카테고리의 다른 글

Sqlite 문자 합치기.  (0) 2012.01.24
Sqlite에서의 Replace문.  (2) 2012.01.24
SQLite 에서의 NULL 체크  (0) 2012.01.24
sqlite 에서의 if문.  (0) 2012.01.24

안드로이드 문자 보내기 (2)




안드로이드 문자 어플리케이션을 통해서 보내는 방법은 다음과 같다.

# MIME type을 이용 ("vnd.android-dir/mms-sms")

# 이렇게 하면, 실행됨.

 private void sendSmsByApplication(){
     Intent i = new Intent(Intent.ACTION_VIEW);
     i.putExtra("address", "01025481781");
     i.putExtra("sms_body", "Hello my friends!");
     i.setType("vnd.android-dir/mms-sms");
     startActivity(i);
 }


하지만, 갤럭시 탭에서는 에러가 발생한다. 

실행할 문자 어플리케이션이 없어서 그렇다. 이런 경우, Exception발생.
다음과 같은 Exception. 이런 경우도 대비해야겠다. 

12-28 12:46:17.520: E/AndroidRuntime(1637): FATAL EXCEPTION: main
12-28 12:46:17.520: E/AndroidRuntime(1637): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1510)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1384)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Activity.startActivityForResult(Activity.java:3131)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Activity.startActivity(Activity.java:3237)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity.sendSmsByApplication(MainActivity.java:40)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity.access$0(MainActivity.java:35)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity$1.onClick(MainActivity.java:30)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.view.View.performClick(View.java:3122)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.view.View$PerformClick.run(View.java:12020)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Handler.handleCallback(Handler.java:587)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Looper.loop(Looper.java:132)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.ActivityThread.main(ActivityThread.java:4126)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at java.lang.reflect.Method.invokeNative(Native Method)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at java.lang.reflect.Method.invoke(Method.java:491)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at dalvik.system.NativeStart.main(Native Method) 


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 문자보내기 (1)




문자를 보내는 방법은, 다음과 같다.

1. AndroidManifest.xml 파일에 퍼미션을 추가한다.

<uses-permission android:name="android.permission.SEND_SMS" />        
<uses-permission android:name="android.permission.RECEIVE_SMS" />        


2. 자바 코드에 코드를 추가한다.
전화기능이 없는 갤탭 10인치에서는 NoService가 옴. 

public class MainActivity extends Activity {
private Button btnSendSMS; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViewById(R.id.btnSendSMS).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSMS("01012345678", "Send, sms, please.!");
}
});
    }
    
    /**
     * 문자를 보내는 메소드
     * @param phoneNumber
     * @param message
     */
    private void sendSMS(String phoneNumber, String message){
    
     String SENT = "SMS_SENT";
     String DELIVERED = "SMS_DELIVERED";
     
 
       // 문자 보내는 상태를 감지하는 PendingIntent
     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
        // 문자 받은 상태를 감지하는 PendingIntent
     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
       
 
       // 문자 보내는 상태를 감지하는 BroadcastReceiver를 등록한다.
     registerReceiver(new BroadcastReceiver() {

                       // 문자를 수신하면, 발생. 

@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
    
     // 문자를 받는 상태를 확인하는 BroadcastReceiver를 등록.
     registerReceiver(new BroadcastReceiver() {

                        // 문자를 받게 되면, 불린다. 
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
     
 
       // SmsManager를 가져온다.
     SmsManager sms = SmsManager.getDefault();
        // sms를 보낸다. 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    
    }
}


※ 문자를 보내는 메소드 설명.
 

sms.sendTextMessage(String destinationAddress, scAddress, Stringn text, PendingIntent sendIntent, deliveryIntent);

destinationAddress, phoneNumber,
scAddress - Service center address, use null for default SMSC
text - SMS message
sendIntent - pending intent to invoke when the message is sent
deliveryIntent - pending intent to invoke when the message has been delivered.

만약, 문자를 수신하는상태 및 보낸 상태를 파악하고 싶지 않으면, sendIntent, deliveryIntent를 null로 주면 된다.

※ 문자를 보내는 기능이 없는 갤럭시 탭 와이파이 버전같은 경우, 

SmsManager.RESULT_ERROR_NO_SERVICE:  콜백이 onReceive에서 온다.

관련글.
2011/12/30 - [Programming/android] - 안드로이드 문자 보내기 (2)

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Intent.FLAG_ACTIVITY_CLEAR_TOP




Intent.FLAG_ACTIVITY_CLEAR_TOP flag ensures that the series of activities in the backstack is cleared.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

ActionBar에 메뉴 넣기.




액션바에 메뉴를 넣는 방법은 , 

1.  Activity의  
     public boolean onCreateOptionsMenu(Menu menu)  메소드를 오버라이드 한다.
     메뉴를 넣을려면 이 메소드를 오버라이드 한다.

2. Activity의    
     public boolean onOptionsItemSelected(MenuItem item) 메소드를 오버라이드한다.
     메뉴가 나오고, 메뉴가 선택되면 호출된다.

예제

public class ActionBarExample01Activity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

    

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    super.onCreateOptionsMenu(menu);

    MenuItem item1 = menu.add(0, 0, 0, "사과");

    {

    item1.setAlphabeticShortcut('a');

    item1.setIcon(android.R.drawable.btn_default_small);

    }

    MenuItem item2 = menu.add(0, 1, 1, "배");

    {

    item2.setAlphabeticShortcut('b');

    item2.setIcon(android.R.drawable.btn_default_small);

    }

    MenuItem item3 = menu.add(0, 2, 2, "딸기");

    {

    item3.setAlphabeticShortcut('c');

    item3.setIcon(android.R.drawable.btn_default_small);

    }

    menu.add(0, 3, 3, "감");

    menu.add(0, 4, 4, "귤");

    menu.add(0, 5, 5, "바나나");

    return true;

    }

    

   @Override

   public boolean onOptionsItemSelected(MenuItem item) {

       if(item != null){

  Toast.makeText(this, item.getTitle() + " selected", Toast.LENGTH_SHORT).show();

  return true;

       } else {

  return false;

       }

   }

 
이렇게 하면, 액션바 옆에 메뉴가 생긴다.

메뉴 화면 말고, 메뉴화면 옆에 아이콘을 따로 뺄수도 있는데, 그렇다면,
다음의 코드를 넣어주면 된다. 

 item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT|MenuItem.SHOW_AS_ACTION_IF_ROOM);


예제.

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    super.onCreateOptionsMenu(menu);

    MenuItem item1 = menu.add(0, 0, 0, "사과");

    {

    item1.setAlphabeticShortcut('a');

    item1.setIcon(android.R.drawable.btn_plus);
               item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT
                                                              |MenuItem.SHOW_AS_ACTION_IF_ROOM);

    }




신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

Action Bar 숨기기




액션바는 상단의 타이틀이 보이는 화면을 말한다. 
이를 숨기는 방법은 여러가지가 있다.

1. AndroidManifest.xml파일에서 숨기는 방법.
   theme를 다음과 같이 지정.

       <activity android:name=".ActionBarExample01Activity"

                  android:label="@string/app_name"

                  android:theme="@android:style/Theme.Holo.NoActionBar">

 
2. java코드에서 숨긴다.
    액티비티 안에서 다음과 같이 코드를 만든다.  

public class ActionBarExample01Activity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        ActionBar actionBar = getActionBar();

        actionBar.hide();

//        actionBar.show();

    }

}


이 방법을 사용할 때 유의할 점은, 1번 방법 Theme.Holo.NoActionBar"를  사용한 후에 호출하면, getActionBar()가 null이 나온다는 것.
코드로 액션바를 제어할 경우에는, 1번과 함께 쓰지 않는다.  
 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

Fragment와 AddToBackStack




Fragment에서, add나 Replace를 한 후, back버튼을 누르면, 이전 Fragment를 복원해 줄 수 있다.
바로, addToBackStack() 메소드를 이용한다.

샘플 코드는 다음과 같다.  

1. FragmentExample04Activity.java

package fragment.example04;


import android.app.Activity;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;


public class FragmentExample04Activity extends Activity {

private Button addFragmentBtn;

private int currentIdx = 1;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        addFragmentBtn = (Button) findViewById(R.id.add_fragment);

        

        addFragmentBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.fragment_cont, new MyFragment(currentIdx));

ft.addToBackStack(null);

ft.commit();

currentIdx++;

}

});

    }

}

 
2. main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <LinearLayout

    android:id="@+id/fragment_cont"

    android:layout_weight="1"

    android:layout_width="0dip"

    android:layout_height="match_parent" />

    <Button

    android:id="@+id/add_fragment"

    android:layout_weight="0"

    android:layout_width="wrap_content"

    android:layout_height="match_parent"

    android:text="Add Fragment" />

</LinearLayout>

 
3. MyFragment.java

package fragment.example04;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;


public class MyFragment extends Fragment {

private int currentCnt;

public MyFragment(int _currentCnt){

this.currentCnt = _currentCnt;

}


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment, null);

((TextView) view.findViewById(R.id.title)).setText(currentCnt + "번째 Fragment.!");

return view;

}

}


 4. fragment.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

<TextView

            android:id="@+id/title"  

   android:layout_width="fill_parent" 

   android:layout_height="fill_parent" 

   android:text="@string/hello"  />

</LinearLayout>

 
위코드를 작성해 주면 된다. 

완성 화면은 다음과 같다. 


우측의 Add Fragment를 누르면, Fragment가 더해지며,

하단의 <- 버튼을 눌러주게 되면, 이전의 Fragment가 복원된다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

티스토리 툴바