[안드로이드 공부] 214

안드로이드 오버라이드의 비밀과 함정 -Preference

PreferenceActivity의 기본 아이템들은 타이틀, 서머리 또는 체크박스만 있기 때문에 너무 단조롭다. 그래서 안드로이드는 오버라이드해서 내 맘대로 UI를 바꿀수 있도록 제공한다. 결국, 아래 그림처럼 seekbar를 넣어서 좀 더 다이나믹하고 인터랙티비한 형태로 바꿀 수 있다. 방법은1. Preference를 extends 하는 클래스를 하나 만든 다.2. 새로 만든 클래스에서 반드시 onCreateView를 만들어 줘야한다. @Override protected View onCreateView( ViewGroup parent ) { super.onCreateView(parent); mLayoutInFlater = (LayoutInflater) getContext().getSystemServic..

[안드로이드] 홈키 5초룰을 아시나요?

앱을 테스트 하던 중, 이벤트를 받고 startActivity를 했는데, mainActivity가 화면에 2-3초 후에 나타나는 현상이 발생했습니다. 왜 이렇게 느리지 하는 생각이 들어 개선점을 찾아 보기로 했지요. 속도를 개선해야 겠다 화면을 많이 그려서 그런가... 리소스를 잡아먹는 코드가 있나 고민에 빠졌죠.코드를 이것저것 빼도 전혀 빨라지지가 않네요. 그런데 이것저것 테스트를 하는 중에 Back 키로 앱을 나간 후 실행하면 바로 뜨고, Home 키로 나간 후 실행하면 뜨지 않는다는 차이점을 발견했지요. 홈 키는 뭐가 다를까?검색을 해 보니 안드로이드에는 일명 5초 룰 이라는 것이 있네요.홈키로 앱을 숨기면 그 activity는 백그라운드에서 startActivity를 해도 5초 동안 꼼짝하지 않는..

[안드로이드] 볼륨 롱키 인식하기

타이머를 써야 하나 flag를 써야 하나 고민도 해봤는데, 안드로이드에서 volume long key 인식하는 방법입니다. @Override public boolean onKeyLongPress(int keycode, KeyEvent event){ if(keycode == KeyEvent.KEYCODE_VOLUME_UP || keycode == KeyEvent.KEYCODE_VOLUME_DOWN) { Log.d(TAG, "Long press KEYCODE_VOLUME_UP"); return true; } return super.onKeyLongPress(keycode, event); } @Override public boolean onKeyDown(int keycode, KeyEvent event) { ..

비동기 작업은 아버지가 살아있을 때 해라!

일반적으로 뷰 속에 버튼등을 넣을 수 있다. 그리고 이 뷰를 오버라이드 하면 새로운 커스텀 뷰를 만들수도 있다. 그러나 조심해야 할 점이 있으니... 뷰는 닫히면 사라진다. 만약 닫을 때 제거 하지 않으면 다음에 열 때 '니 자식의 애비가 살아 있으니 애비를 저리 치우고 다시 나와라'라는 말을 듣게 될 것이다. 즉, 무조건 제거를 해주어야 하는데 여기서 문제가 발생한다. 비동기 태스크가 문제다... 얘는 뷰가 닫혀도 언제든 갑자기 툭하고 나와서 실행 될 수 있다. 해당 클래스에 있다고 무심결에 이 뷰를 불러다 쓰면 죽느다. 이건 문제가 참 쉽다. 하지만 뷰 속에 있는 아이템을 불러다 쓰면 살아 있을 수도 있다. 뷰만 제거 하고 속 살은 제거 하지 않았기 때문에 아직 가비지 청소가 되지 않았다면 속살은 살..

당신은 반드시 아이의 부모를 먼저 제거 해야 합니다?

오버라이드를 하다 보면... 또는 여러가지 뷰 작업등을 하다 보면 저런 경고 아니... 죽여 놓고 내 뱉는 문장을 만나게 된다. 유아이가 정말 복잡하게 되어있자면... 정말 난감하기 따름이 없을 것이다. 이번엔 Preference Override 에서 발생하는 문구에 대해 보겠다. 그냥 답만 내 놓자. onCreateView를 통해 1개만 만든다면 문제 없지만, 여기에다가 onCreateDialogView까지 만들게 되면 다음에 뷰를 띄울 때는 반드시 죽여야 한다. 그러지 않으면 아래 뻘건 문구와 함께 앱이 죽어 있을 것이다. java.lang.IllegalStateException: The specified child already has a parent. You must call removeView(..

백그라운드 리소스를 비 동기 태스크에서 사용하기

BackgroundResource를 asyncTask에서 사용할 때는 반드시 onPostExecute 또는 onProgressExcute 에서 사용 하도록 하자. doInBackground에서 사용 할 경우에는 시스템이 스레드를 돌면서 BackgroundResource를 해결 하러 다니는데... 따로 스레드를 돌려서 사용하면 죽는다. 시스템이 하는 일은 스레드에서 하지 말자. 아빠가 하는일은 아빠가 하도록 하자.

스레드 엄마의 심폐 소생술에... 로이드가

프로그래스 다이얼로그는 스레드 엄마가 품어줘야 비로소 새 생명이 태어 날 수 있는 조건이 갖추어진다. 즉, 스레드 엄마가 제대로 품지 않으면 언제든지 넘어져서 다치고 떨어져서 죽을 수도 있다. 여기서 '엄마가' 그리고 '제대로'가 참 중요하다. 무슨말이냐? 안드로이드의 우주 속에는 수 많은 스레드 엄마들이 새끼들을 키우고 살고 있는데... 아빠가 술먹고 집으로 돌아오다가 옆집 애가 뛰어노는 모습을 보고, 자기 자식인줄 알고 집으로 데리고 왔다면? 안드로이드 우주에선 엄마들이 자기 애가 아니면 그냥 밖으로 던져 버린다. 즉, 사망이다. 여기서 알고 넘어가야 할 것은? 1. 아빠도 누가 우리 자식인지 알아야 애를 잘 데려 와서 키울 것이고2. 엄마도 애가 멀리 나가서 다른 자식과 햇갈리지 않도록 해야 한다는..

EditeText 키보드 내리고 포커스 내보내기

EditText를 여러개 사용하다보면 포커스 때문에 불편한 점이 생길 때가 많다. 이럴 때는 필요할 때만 포커스를 넣고 그외에는 포커스를 기본적으로 죽여야 한다. 그렇지 않으면 시도 때도 없이 키보드가 올라가고 사라지지 않기 때문이다. 키보드 강제로 내리기 private void hideKeyBoard(){ InputMethodManager iM= (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE); iM.hideSoftInputFromWindow(mEditText.getWindowToken(), 0); } 키보드의 포커스를 기본으로 다른 곳으로 보내기아래 코드를 다른 레이아웃등에 넣어 주면 수동으로 포커스를 줄 수 있다..

[안드로이드 스튜디오] 간단하고 쉬운 위젯 만들기

안드로이드 스튜디오에서 간단한 위젯은 클릭 몇 번 만으로 나타나게 할 수 있다. 프로젝트 화면 - app 클릭 - 마우스 오른쪽 메뉴 - New - Widget - App Widget 을 클릭하면 다음과 같은 창이 나타난다. [Finish] 버튼을 누르고 바로 실행해서 에뮬레이터 화면에 위젯 추가한 화면 이다. 클릭만으로 위젯 껍데기는 완성되는 셈이다. 실행 되는 걸 봤으니 위 위젯 추가로 어떤 파일이 추가/수정 되었는지 보자. 추가된 파일 > ./MyAppWidget.java ./xml/my_app_widget_info.xml ./layout/my_app_widget.xml 수정된 파일 > ./AndroidManifest.xml 위젯을 만드는데 필요한 예제가 그대로 만들어 지는 셈이다. 위젯 버튼을 클..

SwitchPreference 이벤트 중복 버그

CheckboxPreference를 사용 할 때는 분명히 onPreferenceTreeClick으로 이벤트가 들어왔다. 하지만 SwitchPreference를 사용하면 onPreferenceChange로 이벤트가 들어오니 주의 하여야 한다. onPreferenceTreeClick if (KEY_SETTINGS.equals(preference.getKey())) { ..... return true; } 그러나, 더 심각한 문제는... 스위치를 끄고 켤 때 마다 이벤트가 2번씩 들어 온다는 것이다. 이를 해결 하기 위해서는 아래처럼 새 이벤트 헌 이벤트를 검사해주어야 한다. 이것이 더 웃긴 것이 단말기 마다 다르다는 점이다. 어떤 단말기는 2번 이벤트를 1번으로 줄여서 보내주고 어떤 단말기는 2번 다 보내니..

반응형