setHasOptionsMenu 가 onActivityCreated method 에서 호출되었는지 확인한다.
Development/Android
- [GingerBread ] onOptionsItemSelected 가 Fragment 에서 늦게 호출되는 문제. 2014.11.05
- 진저브레드 ListView Footer 가 노출되지 않는 문제. 2014.11.04
- #Android XmlResourceParser 와 Reflection 2011.11.03
- #Android #FaceBookSDK 사용하기할때, invalid Key Error 2011.07.29
- [Android] Activity Life Cycle 2011.03.21
- [Android] ListActivity 에서의 ContextMenu 사용 2011.03.16 6
- [Android] ListView의 CursorAdapter Refresh 하기 2011.03.15
- [Android] EditText Text변화 감지하기. 2011.03.15
- [Android] ListView Background 세팅하기. 2011.03.02 1
- [Android] PreferenceCategory 변경하기 2011.02.16 1
[GingerBread ] onOptionsItemSelected 가 Fragment 에서 늦게 호출되는 문제.
진저브레드 ListView Footer 가 노출되지 않는 문제.
ListView 의 addFooterView 를 호출한후에 setAdapter 를 호출해야한다.
#Android XmlResourceParser 와 Reflection
XML을 파싱할 일이 생겨서, 이래저래 만져보다가 작업한 내용을 정리 합니다 :)
1. XML Parsing
Android 에서 제공하는 XmlResourceParser 를 사용하기로 했습니다.
XMLResourceParser는 다른 Java XML Parser들에 비해 성능이 좋은게 특징입니다.
이유인 즉은, 다른 Android XML 파일들 처럼, pre compiled 해서 birnary에 들어 가서 처리 하기 때문입니다.
아래는 간단하게 XML 을 읽어 들이는 코드 입니다.
public Problem parseXML(XmlResourceParser xmlParser) throws Exception { Problem problem = new Problem(); String name = null; while (xmlParser.getEventType() != XmlPullParser.END_DOCUMENT) { if (xmlParser.getEventType() == XmlPullParser.START_TAG) { name = xmlParser.getName(); } else if (xmlParser.getEventType() == XmlPullParser.TEXT) { if (name == null) { Log.d("ProblemDAO-parseXML", "name is null ? error ??"); } } else if (xmlParser.getEventType() == XmlPullParser.END_TAG) { name = null; } xmlParser.next(); } return problem; }
2. XML to Pojo
a. 첫 번째 시도 - if 지옥
자 읽어 들인 XML을 Java Plaiin Object 로 매핑할 차리 인데요.
제일 처음 작업한게 아래와 같은 코드 입니다.
if(name.equalsIgnoreCase("title") == true) { }위와 같은 코드의 문제점은 if/elseif/elseif 지옥이 나타난다는것이죠. :(
그리고, xml 형식등의 변경이 있을때, pojo/xml 이외에 추가로 관리할 곳이 늘어 난다는 점입니다.
b. 두 번째 시도 - Reflection
그래서 생각해낸것이 Java의 Reflection 입니다.
xml element 이름을 pojo 의 setter와 연결시키도록 아래와 같이 코드를 작성하였습니다..
char[] stringArray = name.toCharArray(); stringArray[0] = Character.toUpperCase(stringArray[0]); String methodName = "set"+ new String(stringArray); try { Method m = Problem.class.getMethod(methodName, String.class); m.invoke(problem, text); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); Method m = Problem.class.getMethod(methodName,Integer.class); m.invoke(problem,Integer.valueOf(text)); }
조금 신경 쓴부분이 바로 Setter의 자료형 부분입니다.
m.invoke 가 없는 메소드 인 경우에, NoSouchMethodException을 발생시키기 때문에 이를 캐치하여,
다른 형으로 시도 해보도록 코드를 작성하였습니다.
3. 더 해볼것
추후에, JacksonMapper 등에서 어떻게 json 을 pojo화 시키는지 좀 스터디해보고 좀 더 좋은 방법이 있나 생각해봐야겠습니다 :)
#Android #FaceBookSDK 사용하기할때, invalid Key Error
FaceBook사에서 Guide를 했는데도 불구하고,
위와 같은 error가 발생하며, Login Page로 가지 않는 문제가 있었다.
이래저래 서치를 해본 결과
Android Hash Key를 생성하는데서 문제가 있었다.
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
http://developer.android.com/guide/publishing/app-signing.html#debugmode
Android 개발자 사이트를 보면, debugmode에서의 app-sigining에 대한 내용이 있다.
Eclipse에서 applicatoin을 debug로 signing할때, "android"란 password를 통해서 생성sign하기때문에, keytool에서도 동일 password를 써줘야 한다.
[Android] Activity Life Cycle
후아아, Android 개발하는데 이 그림정도는 환벽히 머리속에 넣고 있어야 하지,
onPause와 onStop의 의 혼동으로 잠깐 삽질.
[Android] ListActivity 에서의 ContextMenu 사용
GOAL
- ListActivity 에서 ContextMenu를 띄운다.
- ContextMenuItem을 선택하여 특정 Position의 ListViewItem에 대한 작업을 수행한다.
ListView를 ContextMenu에 등록하여, LongClick Event발생시 ContextMenu를 띄우게 한다.registerForContextMenu(getListView());
Result : Failed
이방법은 LongClick을 받은 Item Position을 알아낼 방법이 없다.
( 아시는 분 손좀? ^^ )
Try 2.
ListView setOnItemLongClickEventListener() 에서,
openContextMenu(view) 를 통해서 ContextMenu를 Open 하고, 그 View를 이용해 Position을 가져 온다.
Result : Failed
openContextMenu의 파라미터가 되기 위해서는 registerContextMenu를 통해서 registering을 해야 하는데,
Adapter에서 View를 만들때 register를 한다고 해도, unregister를 해야 하는 시점이 불분명하고,
비직관적이다.
Try 3.
registerForContextMenu(getListViewI()) 를 통해 ListView의 ContextMenu를 Open
getListView().setOnItemLongClickListener를 등록하여, Last Long Clicked Position을 저장
ContextMenuItemSelected가 호출 될때 저장된 Position을 사용하여 Task 수행
Result : Success
그래도 뭔가 찜찜하다. 뭔가 좋은 방법이 있을것 같은데.. 아시는 분 없나요? ㅎㅎ
[Android] ListView의 CursorAdapter Refresh 하기
CursorAdapter adapter = (CursorAdapter) getListAdapter();
adapter.getCursor().requery();
adapter.notifyDataSetChanged();
CursorAdapter를 가져와서
거기에서 다시 Cursor를 가지고 오고 requery();
그리고 adapter에 notifyDataSetChanged() 해주면 된다.
[Android] EditText Text변화 감지하기.
난 또 순진했을 뿐이고 :(
ClickListener 같은 경우 setOnClickListener를 사용하기 때문에, 당연히 난 setTextBlahBlah가 있을줄 알았는데,
그런게 없어서,
setKeyListener를 사용해봤는데, SoftKey를 잡지 못하고, Hardware Key만 잡았다.
아 이런게 없을 수 있나 싶었는데.. :(
addTextChangedListener가 존재 했다..
public void addTextChangedListener (TextWatcher watcher)
mDialogEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d(TAG,"Count = " + count);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
위와 같이, before, changed, after 등의 event를 detecting 할 수 있다.
[Android] ListView Background 세팅하기.
[Android] PreferenceCategory 변경하기
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/app_name">
<PreferenceCategory
android:title="@string/category_name">
<Preference android:key="app_name"
android:persistent="false"
android:title="@string/app_name"
/>
</PreferenceCategory>
</PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="25dip" android:gravity="center_vertical" android:paddingLeft="5dip" android:background="#323331"> <ImageView android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@android:drawable/ic_menu_info_details"/> <TextView android:textStyle="bold" android:id="@android:id/title" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="test" android:gravity="center" android:textColor="#FF0000" /> </LinearLayout>