[안드로이드 공부]/프리퍼런스 11

[안드로이드] 프리퍼런스가 업데이트 안된다면?

말그대로 프리퍼런스(preference) summary가 없데이트 안 될 경우에는 어떻게 하느냐? 다른 화면을 갔다 올 경우에는 비교적 summary가 업데이트 잘 되지만, 한 화면에서 바로 바로 수정이 필요 할 경우에는 쉽지 않다. 만약, 잘 되다가 destory를 한 뒤 다시 들어 왔는데 이 때 부터 작동이 안된다면 ? 이전 글(BadTokenException)과 같은 내용의 해결 방법을 사용하면 된다. Preference를 static으로 만들어서 setSummary를 하면 된다. 어디서? onPreferenceChange(Preference pref, Object newValue) { 에서 받아온 pref로 pref.setSummary() 하지 말고 전역으로 선언해 놓고 하면 된다. 즉, publ..

[안드로이드] BadTokenException -is your activity running? 프리퍼런스에서 발생한다면?

이 에러는 참으로 갑자기 불쑥 나오기로 유명하다. 액티비티 종료 중에 컨텍스트를 사용하다가 잘 발생한다. android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@40b47bd8 is not valid; is your activity running? 1. 그래서 액티비티 종료 후에도 핸들러가 돌아 갈수도 있기에 갑자기 다이얼로그를 띄우는 등의 행동은 하지 말아야 할 것이다. 이럴때는 isFinishing()을 사용해서 예방 할 수 있다. 2. 또는 다른 액티비티와 연계되어서 발생 할 경우에는 getContext(), this.activity가 아닌 getParent()를 사용 하면 해결..

CheckBoxPreference - check상태에 따라 활성, 비활성 바뀌게 하기

활성상태일때만 설정을 가능하게 하고픈 메뉴가 있을 것이다.체크박스프리퍼런스를 사용하고 있다면,이럴때 유용한 field가 android:dependency 이다. android:dependency 자리에 CheckBoxPreference의 key값을 넣어주면 별도 .java 코딩없이 xml파일 만으로도 아래와 같은 결과를 얻을 수 있다. [그림]정각알림 사용하기 설정이 check되지 않았을 때는 분 설정하기 메뉴가 비활성화되고,check되었을 때에는 분 설정하기 메뉴가 활성화 된다. -> [소스]

안드로이드 프리퍼런스 보이기 안보이기

PreferenceScreen은 xml에서 gone을 해도 보인다. 그럼 소스코드에서 변경해야 하는데 일반적인 방법으로 해서는 되지 않는다. PreviewPreference mCheckBoxPref = (PreviewPreference) findPreference(KEY_SETTINGS); PreferenceCategory mCategory = (PreferenceCategory) findPreference("key_PreferenceCategory"); mCategory.removePreference(mCheckBoxPref); 프리퍼런스를 카테고리에 추가하고 카테고리에 있는 프리퍼런스를 보이지 않게 만들면 된다.

Preference item 클릭 효과 만들기

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

안드로이드 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..

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

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

SwitchPreference 이벤트 중복 버그

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

Preference dialog 수동으로 띄우기

Preference Dailog 즉, listprefernce, dialogpreference, muliselectelistpreference등은 기본적으로 Preference Screen에서 선택하면 뜨도록 되어있다. 하지만, 수동으로 띄워야 할 경우도 생긴다. 방법은 생각보다 간단하지만, 이 방법을 생각 해내기 까지는 쉽지 않다. ((MyDialogPreference) findPreference(KEY_DIALOG)).show(); public void show() { showDialog(null); } 1. 다이얼로그를 띄울 곳에서 .show를 해주고,2. Preference에 가서 show 메서드를 만들어 주면 된다.