갑자기 아래와 같은 에러가 뜬다면,java.lang.IllegalArgumentException: Wrong state class -- expecting Preference State 아무리... 코드를 봐도... 구글링을 해봐도.... 나에게 맞는 처방전을 쉽게 찾기가 거의 불가능에 가깝다.... 원인 조차도..... 1. preference XML 에 같은 ID를 쓰는 놈이 있는지 찾아본다.2. 동적 코드에서도 같은 ID를 쓰는 놈이 있는지 찾아본다. 여기까지 해서 해결이 안되면,3. onResume() 을 체크 해본다.4. 되도록 onResume()에서 refresh()를 구현 해준다. --> final ListPreference key = (ListPreference) findPreference(..
클래스 마다 태그를 넣고 쓰지 말고, 한 곳에서 로그를 관리하도록 하면 편하다. 아래 처럼 Log 클래스를 따로 만들고 필요 한 곳에서 LOG_TAG 함수를 부르면 알아서 클래스 명까지 딱 찍어준다. public static String LOG_TAG = ""; public static String LOG_TAG(Context context){ LOG_TAG = ""; return LOG_TAG = "[" + context.getClass().getSimpleName() + "] "; } 그리고, 디버그 모드 일때만 사용하도록 자동화 시켜 놓자. public static final boolean LOGIF = BuildConfig.DEBUG ? true : false; 결국 이렇게 불러서 쓰면 if(Lo..
사용자가 직접 시간대를 변경하거나, 비행기를 타고 가다가 새로운 타임존을 만났을 때 안드로이드는 2가지 이벤트를 발생시킨다. 만약, 시간에 민감한 어플리케이션을 운영한다면 이러한 돌발? 변수에 대한 고려를 하지 않았다면.... 뒤통수가 엄청 가려워질 것이다. 사용자가 시간을 변경 했을 때ACTION_TIME_CHANGED 타임존을 변경 했을 때ACTION_TIMEZONE_CHANGED 위 브로드캐스트 메시지를 Manifest 에 등록하고 Receiver에서 아래와 같이 캐치해주면 최소한 가려운 머리에 샴푸는 바른 것이다. if(Intent.ACTION_TIME_CHANGED.equals(intent.getAction()) ){ cancelAlarmManger(); setTime(); } if(Intent..
Preference를 overide 한 경우 OncreateView를 사용하여 새롭게 만들어 준다. 하지만, 이미지가 PreferenceScreen 자리에 들어가게 된다면 고려해야 할 것이 있다. UI에서 매번 다른 동작이 발생 할 때마다(다이얼로그 열리고 닫히는 등) 이 OnCreateView가 불려지면서 안드로이드 내부를 들쑤시고 다닐 수 있다. @Override protected View onCreateView( ViewGroup parent ) { super.onCreateView(parent); mLayoutInFlater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(mView == nu..
기본적으로 SharedPreferences pref = getContext().getSharedPreferences(key, Context.MODE_PRIVATE); 위와 같은 코드를 사용하면 SharedPreference를 사용하여 앱에서 필요한 부분을 저장하고 불러올 수 있다. 하지만, Service(onReceive 등)와 같은 곳에서는 아래와 같이 getApplicationContext를 사용하여야 sharedPreference를 불러올 수 있다. 만약 위처럼 getContext()를 사용하게 되면 아무것도 얻을 수 없다. mContext.getApplicationContext().getSharedPreferences(key, Context.MODE_PRIVATE); getContext, cont..
앱에 서비스를 등록해서 사용하고 있는데, 이러저러한 이유로 갑자기 앱이 죽어버리거나 서비스가 종료되면 정말 난감하다. 이럴 때는 @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, this.START_STICKY, startId); } 위와 같이 onStartCommand를 사용하여 startService를 하도록 하며, START_STICKY 플래그를 쓰게 하면 죽어도 다시 살아나는 좀비 같은 존재가 된다.
아이스크림 샌드위치 버전까지는 안드로이드에서 TTS를 사용할 때 setOnUtteranceCompletedListener를 사용했으나, 이후 버전 부터는 setOnUtteranceProgressListener를 사용해서 Speaking의 시작과 끝에 대응할 수 있다. 또한, HashMap을 사용하도록 한 것도 큰 변화의 특징이다. 1개의 앱에서만 TTS를 사용한다면 문제가 없지만, 만약 2개 이상의 앱에 TTS를 사용할 경우엔 중복 문제가 발생하게된다. 즉, 1번 앱에서 '동해물입니다.' 라고 끝나야하는데, 2번 앱에서 '백두산인가요'라고 입력 되었던 문구가 함께 울리게 되는 것이다. (2번 앱은 실행 후 꺼버렸음에도 불구하고) 이런 문제를 해결 하기 위해서 아래와 같은 조치가 필요하다. speak 할 ..