'[+++ JAVA +++]/- - Android'에 해당되는 글 6건

  1. 2015.01.18 모바일 DB Realm (렘) 개날림정리
  2. 2015.01.17 android lollipop에서 구동시 마주친 문제
  3. 2012.03.31 [Android] 엑티비티 하나만 띄울수 있도록 만들때...
  4. 2012.03.16 [AndEngine] 강체에 이미지 적용하기 (3)
  5. 2012.03.14 [AndEngine] AndEngine? (3)
  6. 2012.03.04 [Android] 리스트뷰(ListView)에서 ClickListener가 작동하지 않을때..... (1)
2015.01.18 00:20

Deview2014 에서 직접 세션을 듣진 않았지만 대충 이런 모바일 DB가 뜬다는것만 알고 있었는데, 이번에 기회가 되서 함 정리해봄.


sqlite 는 너무 옛날에 사용해서 비교하지 못할거 같음.


Realm realm = Realm.getInstance(contex);


로 인스턴스를 가져오고 원하는 작업을 할 수있는데 먼저 Realm의 특징은 매우 빠르고, jpa 처럼 객체자체를 집어넣을 수 있는 ORM 이다. 그런데 뭔가 불편한 점이 있는데, 모델이 되는 객체는 반드시 RealmObject를 상속해야하고, 매서드로 getter/setter 만 가질 수 있다는 점이다.(0.76.0 기준, 다른 매서드가 들어가니 빌드 에러가 난다 -> 어노테이션프로세싱을 하기때문에 매서드 중복을 막기위해서 막아둔것 같다. 아니 그러면 차라리 모두 어노테이션프로세싱으로 돌려야지!? 불편하게 이게 뭐야....-> 음. 아직 모르는 기능인가보다.) 이게 왜 짜증나나면, DDD방식으로 개발하려면 모델자체가 어떤 간단한 기능들을 내포할 수 있어야 하는데 이게 불가능해지니...그래서 차라리 디비엔 Dto(Vo)를 널고 읽어온뒤에 오브젝트매퍼같은 녀석을 이용해 매핑해주면 그나마 편리하게 이용할 수 있을것 같다. 


쨋든, 처음에 객체를 만들땐 반드시 realm 인스턴스를 통해서 만들어야 저장이 된다. 따로 save 매서드가 있는지는 모르겠다.


realm.beginTransaction();

MyDto dto = realm.createObject(MyDto.class);

realm.commitTransaction();


쿼리할땐 where clause를 이용해서 할 수 있다. 그런데 스트링매치에 대해선 beginWith, endWith, contains 밖에 없는듯한데, like clause 가 없어서 좀 불편하다. 와일드카드가 먹히는지는 아직 확인해보지 않았다. (메서드 이름만 봐도 안되는거 같기도...)


MyDto first = realm.where(MyDto.class).findFirst();


dsl 로 여러가지 작성할수 있어서 좋긴함.


삭제의 경우 처음에 deleteRealmFile 를 사용했었는데 이게 파일을 삭제하는거다보니 문제가 조금 있었다. 

드랍 테이블과 같은 효과를 내기 위해선 그냥 clear 또는 realm.allObjects(MyDto.class).clear();와 같이 해주면 된다.


한글로 정리된것도 있어서 좋다.

http://realm.io/kr/

http://realm.io/kr/docs/java/0.75.0/


사실 저기 홈에 나온 코드만 봐도 끝인거 같다.


나머지는 예제를 보면 좋을거 같은데 예제를 androidstudio에서 열었더니 굉장히 오랫동안 로드를함..(macbook air 2013) 그마저도 약간 빌드가 꼬인거 같아서 걍 버리고코드만 구경했음.


뉴스에 있던 코드인데 이것만 봐도 90%는 알 수 있는거 같다.


Realm realm = Realm.getInstance(this);

// All writes are wrapped in a transaction
// to facilitate safe multi threading
realm.beginTransaction();

// Add a person
Person person = realm.createObject(Person.class);
person.setName("Young Person");
person.setAge(14);

realm.commitTransaction();

RealmResults<User> result = realm.where(User.class)
                                 .greaterThan("age", 10)  // implicit AND
                                 .beginGroup()
                                      .equalTo("name", "Peter")
                                      .or()
                                      .contains("name", "Jo")
                                 .endGroup()
                                 .findAll();



저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 0
2015.01.17 14:17

1. AndroidAnnotations의 @Background에서 TextView의 setEnabled()을 호출했을때 에니메이션은 Looper thread 에서만 돌아야 한다는 에러

-> 롤리팝으로 올라가면서 Drawable 의 state가 변경될때 마다 에니메이션을 하는데 이게 백그라운드 쓰레드에서 안된다는것. 이전 버전들에서는 이런 에니메이션이 없기 때문에 상관이 없지만.. 특히 xml에서 setEnabled = false 처럼 값을 주게 되면 코드상에서나 xml에서나 뭐가 문제인지 알기 힘들어짐. 

해결방법: 에니메이션처리를 위해 해당 위젯을 메인쓰레드에서 setEnable을 해준다. 또는, 반드시 백그라운드쓰레드에서 돌았으면 하는것들은 android:stateListAnimator="@null" 로 세팅한다. 코드에선 view.setStateListAnimator(null); 인것 같은데 티스트 해보진 않음.


2. ActionMenu 관련 문제가 날때

values-v21디렉터리만들고 그 안에 스타일이나 테마를 넣어준다. 내 경우는 엑션바의 more버튼 눌렀을때 메뉴가 흰색인데 글씨도 흰색이라서 기본 values의 theme.xml에서 이 색을 지정해줬었는데 이때 롤리팝에선 이 색상을 걍 단순히 하나만 줘서 되는것이 아니라 리스트로 줘야함. 그래서 캐스트익셉션이 났던거 같음. 하지만 사실 내 문제의 근본적인 문제가 액션바의 메뉴였으므로 그냥 기본 패런트의 테마를 수정함으로써 해결함. 

저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 0
2012.03.31 18:29

제목이 좀 애매하긴 한데....


이 글의 요지는, 전에 만들던 앱에서 무슨 이유인지.... 로딩이 끝난뒤, 여러개의 메뉴 엑티비티를 생성했었는데, 이걸 하나만 띄우도록 하기 위한것이다.


처음엔 Intent 를 써서 어떻게 하면 될 줄 알았는데, 이것보다 더 쉽게 적용하는 방법이 있었다.


바로, 매니페스트(AndroidManifest.xml) 파일을 이용하는것......



먼저 매니페스트 파일을 열고, 아래 탭에서 애플리케이션을 연다.

그리고, 적용할 엑티비티를 선택하고, 오른쪽에 액티비티 속성을 정할 수 있는데, 런치 모드(Launch mode)의 리스트박스 클릭, 싱글인스턴스(singleinstance) 선택하면 끝이다. 테스트는 못해봤지만,, 잘 될 것 같다.ㅋ


추가로, 코드로 하는 방법이 있는데, 이는 Intent 에 플래그(flag) 를 추가해서 하는 방법이다.


Intent intent = new Intent(getApplication(), XXXActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);


저기서 

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 이 부분인데, Intent의 플래그들은 꽤 있으니, 다른것들도 참고해서 적절한것을 취하면 되겠다...;;


나머지 플래그들에 대한 설명은 아래 링크로 대체...ㅋ

http://theeye.pe.kr/entry/references-of-intent-flag-on-android-activities


저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 0
2012.03.16 10:56
일단 간단한 화면 출력은 나중에 하기로 하고..(사실 이건 웹상에 많이 있던..)

먼저 물리적 특성을 갖는 물체를 만들고, 이 물체에 이미지를 적용하는것을 테스트하겠다.

 1. 이미지가 들어있는 강체 만들기
 

이미지를 표시할 객체인 Sprite와 물리적 특성을 가지는 Body를 가지고 있어야 한다.
Sprite에 이미지를 넣을떈,  >BitmapTextureAtlas와 BitmapTextureAtlasTextureRegionFactory를 통해서 넣을 수 있다. (기본적으로 Asset 폴더의 gfx를 이미지 자원의 디렉토리로 잡는다.) 

물리적 특성은  PhysicsFactory.create.... 를 통해서 만들 수 있다.
 (Box, Circle, Line, Polygon, Triangle)

protected ITextureRegion  mFlaskTextureRegion;

///////////////////////////////////////
...
///////////////////////////////////////
// 텍스쳐로 쓸 이미지의 위치를 상대 경로로 잡기 위해 기본 베이스 경로 설정.
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
// 새로운 비트맵 텍스쳐맵 생성.(최대 사이즈를 64, 64로 잡는데, 2의 제곱수로 넣어줘야 함.)
this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 64, TextureOptions.BILINEAR);

// 두가지로 생성 가능한데, 에니메이션 되는 것, 정적 이미지. 아래는 정적 이미지로 가져온다.
// (에니메이션 되는 것은 가로로 더 그림..)
mFlaskTextureRegion
 = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this.getAssets(), "flask1.png", 0, 0);

// 왜 final 로 일일이 선언 하는지?
final Sprite face; // 기본적으로 사용하는 화면 표시 객체
final Body body; // 기본적인 강체
final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); 
		
face = new Sprite(400, 240, this.mFlaskTextureRegion, this.getVertexBufferObjectManager());
// 새 Sprite를 만드는데, 위치가 400, 240이고, 텍스쳐는 this.mFlaskTextureRegion, 정점버퍼오브젝트매니저를 넣어준다.
// 정점버퍼오브젝트매니저는 연산을 빠르게 하기 위한 처리라고 볼 수 있다.
body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
// 강체를 박스 형태로 만든다. 파라미터로 물리세상을 주고, 아까 만든 Sprite를 표시하는 것으로 주고, 움직일 수 있는 동역학 
// 강체로 셋팅, 위에서 만든 픽스쳐셋팅을 넣어준다. 따라서 물리적 특성을 띈 강체를 만든다.
this.mScene.attachChild(face); // 화면에 표시 하기 위해 Sprite를 장면(Scene)에 넣어준다.
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
// 물리 세상에 강체를 등록 시켜준다.

더보기




[전체 소스]
 

// Asset/gfx폴더에 이미지가 있어야 함.
// face_box_tiled.png, face_circle_tiled.png, flask1.png
// 사이즈는 BitmapTextureAtlas(this.getTextureManager(), 64, 64, TextureOptions.BILINEAR);
// 에 정의된 64x64를 초과하면 안된다.

더보기

저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 3
  1. 2012.03.20 21:43 address edit & del reply

    비밀댓글입니다

  2. Favicon of http://estellesiahome.tistory.com BlogIcon 에스텔시아 2012.03.21 19:26 신고 address edit & del reply

    애니메이션이 되는것이라 함은... GIF포멧의 애니메이션 같은 그림을 말하는 거겠치?

2012.03.14 23:47
AndEngine?

안드엔진(?ㅋ).....을 이번 기회에 공부해 볼려고 포스팅.ㅋㅋ

안드엔진이 있다는건 얼마전에 알았는데, 대충 찾아보니, 앵그리 버드가 이 엔진을 사용했다고 한다.

주요 지원? 하는것은 2D 그래픽 표시와 물리(Box2D) 를 지원한다고 한다.

요즘 게임엔 반드시(까진 아니지...)  물리엔진이 있어줘야 뭔가 조금이라도 현실감?이 느껴지기에.. 

사실 JBox2D를 가져오고, 나만의 2D 프레임워크를 만들려고 했지만, 생각보다 머리가 아파서 다음으로 미루고...(오픈지엘.....ㅅㅂ..ㅠㅠ) 

일단, 아주 간단한 예제인 이미지를 표시하기이다.

먼저, AndEngine을 다운 받는데....두가지 버전이 존재하는듯 하다.

GLES1, GLES2 이렇게 있는데 둘이 서로 약간 다르다...(어쩌면 많이 다른..) 

예를들어, 1의 경우엔, onLoad를 매서드 이름 접두어로 쓴것을, 2는 onCreate를 쓰는데 서로 약간 다르다.....

어쨋든 두가지 버전이 있는데, 당연히 2가 더 최신이니 여기서는 최신버전을 쓰도록 하겠다.

외국 자료에는 1버전이 많던데,,,,흐음...(또 더욱 더 간단하게 되어 있던데...) 

AndEngine에 대한 자세한 정보 및 .java 파일인 라이브러리들이 있는곳이다 .


저기서는, 필수적으로 AndEngine이 있어야 겠고, 예제인 AndEngineExample, 그리고 물리 엔진(확장)인 AndEnginePhysicsBox2DExtension 정도만 있으면 되겠다. 

나머지는 필요한데로, 증강현실이나 라이브배경화면등.. 원하는것을 또 받으면 되겠다.

이제, 이것을 이클립스에 연동 시켜줘야 하는데......이건 뭐 찾아보면 잘 나오니, 패스;;;
SVN을 쓰고 있어서, 저 깃허브 주소를 다 레포에 등록하고, 체크아웃해서 플젝에 넣어줬다. 

더보기


저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 3
  1. Favicon of http://estellesiahome.tistory.com BlogIcon 에스텔시아 2012.03.15 19:27 신고 address edit & del reply

    ㅇㅅㅇ;; 앵그리 버드..

  2. Favicon of http://ianuarias.tistory.com BlogIcon Ianuarias 2012.03.19 21:37 신고 address edit & del reply

    원래 생각난건 재깍 재깍 만들어야되... 근데 우린 나무를 진행안하고 있짢아? 안될거야아마...

    • Favicon of http://estellesiahome.tistory.com BlogIcon 에스텔시아 2012.03.21 19:21 신고 address edit & del

      내가 뿌리깊은나무 라고 네임까지 줬는데...에잉!

2012.03.04 01:40
아오, 이거때문에 내가 아주 심각한 자아 붕괴를............(아 ㅅㅂ 내가 진짜 못하는건가... 멍청한가..ㅠㅠㅠ 엄청 고민했다... 때려칠까도...;;)

원래 구현하려던 목표는 리스트뷰를 구현하되 안에는 텍스트뷰3개가 들어가고 추가로 토클 버튼이 하나 들어간다. 
(이넘의 토글 버튼때문에 또 멘탈 붕괴....ㅠㅠ) 

더보기


이 토클 버튼이 클릭이 가능한 녀석이다. 그러니까, 누르면 토글이 되는. 따라서 누를 수있는....ㅋㅋ

그런데 왜 onItemClickListener 같은게 안되지? 하면, 맨 처음 클릭을 받으면 그 클릭을 낚아 채는게 토글버튼에 달린 OnAlarmCheckedChangeListener 같은 녀석이 있어서 그렇다고 한다. 

그러니까, ListView 안에있는 뷰들이 더 상위(?) 그러니까 이벤트를 잡을때 우선순위가 높다고 볼 수 있다...

그러면 뭐 어떻게 못하나? 아직은 방법이 있다.

(참고한 블로그)

xml에서는 android:focusable="false"
 
자바에서는 checkBox.setFocusable(false);

이렇게 해주면 된다고 한다...(나는 두번째를 써서 해결했다...ㅋㅋ) 
저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 1
  1. Favicon of http://estellesiahome.tistory.com BlogIcon 에스텔시아 2012.03.11 17:08 신고 address edit & del reply

    오랫만에 보는 새 포스팅이군.
    요즘도 마영전 하느라 바쁜가염?



티스토리 툴바