[안드로이드 공부] 203

안드로이드 프래그먼트 탭 생성하기 -viewpager

호랑이가 담배 피우지 않던 시절에는 안드로이드는 탭 호스트라는 것을 사용하여 멀티 화면을 정의해서 썼다고 한다. 그럼 호랑이가 골초가 되어버린 요즘에는 어떻게 탭 효과를 낼까? 방법은 간단한데, 요즘 방식으로 되어있는 글이 없어서 남겨 보도록 한다. 1. 안드로이드 스튜디오에서 새 프로젝트 만들기를 한 뒤 Fragment Tab을 선택한다. 2. 일단 메인 액티비티 하나와 레이아웃이 생성 된다. 3. 메인 액티비티는 탭 안에 담을 프래그먼트를 조정할 수 있고, 레이아웃은 타이틀 및 탭 제목등의 효과를 담당한다. 4. 메인 액티비티는 탭을 조정 하기 때문에 탭에 담길 프래그먼트(Fragment)를 넣어주는 작업을 해야 한다.- File에서 New를 한 뒤 Fragment를 하나 생성한다.- Layout도 ..

안드로이드 error activity class does not exist

안드로이드에서 액티비티를 매니패스트에 추가를 해줬지만 아래와 같은 에러가 나는 경우가 있다. error activity class does not exist 액티비티는 분명히 존재 한다. 파일도 존재 한다. 패키지명도 올바르다. 도데체 뭐가 문제인가? 이럴때 시도 해볼 수 있는 방법 1. Clean Android Studio Project2. 빌드 디렉토리 지우기.3. 안드로이드 스튜디오 재 시작4. 리빌드/실행 안드로이드 스튜디오가 꼬이는 경우 재시작만 해도 되는 경우가 있다. 하지만, 이래도 안된다면? 철자를 잘 살펴 보라! 분명 오타가 있을 지다. 만약 액티비티가 com.comostudio.a.b.activty 인데 android:name="b.activity"라고 적으면? 문제가 없어 보인다? 점..

안드로이드 보안 취약 점 allowBackup - 비밀 정보 쉽게 빼내어 가는 법

기본적으로 android:allowBackup 옵션은 true다. 이 말의 뜻은; 앱이 시스템(OS)의 백업 정책에 참여 하겠다라는 것이다. 즉, 시스템이 백업을 할 때, 이 값이 True로 되어있는 어플리케이션의 Data도 함께 백업 되며 복구 할 때 다시 자동으로 복구 시켜준다. 결국, 폰 리셋을 할 때 어플 백업등을 하면 자동으로 앱의 데이터가 저장된다는 것인데... 여기서 문제가 있다. 만약 사용자의 스마트폰이 자의든 타의든 adb 허용으로 설정이 되어있다면, 누구든지 USB를 연결하여 앱의 데이터를 빼갈 수 있다는 것이다. 사진 zdnet 이것이 무슨 말이냐? 만약 카카오톡이 이 옵션을 true로 해 놓았을 경우.... 누군가가 폰의 설정을 만져서 adb 허용으로 바꾼다면? USB를 꽂아서 카카..

Preference item 클릭 효과 만들기

안드로이드 리스트의 경우에는 간단히 list.setSelector를 해주면 아이템 클릭 효과를 줄 수 있다. 뿐만 아니라 Preference에서도 비슷하게 사용 할 수 있는데, getListView를 한 뒤 리스트처럼 사용하면 아이템 클릭시 효과를 얻을 수 있다. 하지만 언제나 어려운 문제는 발생하는 법. 만약 Preference를 오버라이드(Override)한 다면 어떻게 처리 해야 할까? 오버라이드를 했으니 메인 프리퍼런스 액티비티가 어찌 손을 쓸 수도 없고... 오버라이드한 프리퍼런스에서 getListView를 하기도 그렇고... 그럼 도데체 이 리스트 아이템을 어떻게 가져 올 거냐? 여기 저기 검색을 해봐도 오버라이드 되지 않은 프리퍼런스의 아이템에 대한 얘기 밖에 없다. 그럼... 어차피 새로 ..

AsyncTask를 전역으로 쓰면?

안드로이드 AsyncTask를 전역으로 쓴다면? 즉, 재활용 하겠다는 의미인데 가능 할까? 불가능하다! 만약 한 번 쓴 비동기 태스크를 재 활용 하려고 하면 아래문구를 보게 될 것이다. java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 즉, 변수 이름은 재활용이 가능 하지만 다시 쓰려면 새로 할당을 받으라는 것이다. 당연한 것 아니겠나? 얼음 얼리는 통을 사서 물을 채우고 얼음을 얼려서 먹었는데, 다음 번에 얼음을 먹으려면 당연히 물을 다시 부어서 넣고 기다려야 먹을 수 있지 않겠는가? 그 당시 얼음 통과 얼음은 그 당시의 내 위장 속..

안드로이드 액티비티 싱글 탑의 비밀

안드로이드 싱글 탑? 한글로 적으니 뭔가 있어 보이기는 하는데.... 싱글탑의 비밀 중 한 개만 얘기 하고 가도록 하겠다.(사실 초보라 아는 것만 얘기 하지만 있어 보이고 싶나보다) 만약 액티비티를 실행 할 때 FLAG_ACTIVITY_SINGLE_TOP과 같은 플래그를 사용 하지 않는다면... 예를 들어 NO_HISTORY와 같은 플래그를 썼다면 돌아 올길이 막막해지는 경우가 있다. 문제1. A액티티비에서 startActivity를 FLAG_ACTIVITY_NO_HISTORY로 실행한 해서 B 액티비티로 갔다.2. B액티비티에서 startAcitivityForResult를 실행 하여 다른 액티비티 C로 이동 하였다. 3. C액티비티 또는 Preference 에서 볼일이 끝났다. 그럼 C 에서는 볼일을 ..

안드로이드 preference persisit 의 비밀 한가지

preference에서 getPersistedString 으로 저장된 값을 가져오고 있었는데 이 값을 String에서 Int로 바꾸었다. 그리고 이젠 getPersistedInt 요렇게 값을 가져 오도록 한 뒤 실행을 했더니... 저승사자가 또 와버렸다. 안드로이드 초보인 코모에겐 아직도 까만 화면의 팝업이 너무 두렵다. 그리고 희한 하게도 이상한 에러로 죽으니 참으로 입이 타들어 간다. Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 분명 int로 바꾸면서 int 변수에 넣어 줬는데 도데체 이게 무슨 귀신이 신나서? 까까불어 먹고 있는 소리인가... int a - getPersiste..

안드로이드 Edittext 엔터 인식 및 event null 처리

안드로이드 에디터 텍스트(edit text)에서 엔터키나 Done키를 받기 위해서는 아래와 같이 리스너(setOnEditorActionListener) 를 등록 하면 된다. @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ( actionId == EditorInfo.IME_ACTION_DONE || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ 그런데 여기서 문제가 있다. event가 null 이 들어 오는 것이다. 죽음이란 거다. 이럴 경우 null 처리(event != null &&)를 해주면 그만이겠거니 하고 생각 하겠지만... 그렇다면 엔터에 대한 반응 ..

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

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