안드로이드 개발 정보
(글 수 1,067)
API 11의 주요 기능중에 하나인 Fragment 를 기존 장비 (API 8, 9, 10)에서 돌릴 수 있는 방법을 설명합니다.
API 11의 API demos program에서 FragmentLayout.java 에 대해 이를 단독으로 돌릴 수 있는 방법에 대해 설명하겠습니다.
(환경 설정)
1. 일단 Eclipse에서 최신 version을 모두 받았다면 {SDK}/extras/android/compatibility/v4/android-support-v4.jar 이 있을것입니다.
이를 자기가 만드는 project의 root directory에서 libs directory를 만든후 여기에 copy를 합니다.
2. Eclipse에서 만들고자 하는 project에 마우스 오른쪽을 누르면 메뉴가 나오는데 여기서 build path - add external archives 에서
1번에서 copy한 jar file을 선택합니다. 이 결과 Eclipse project 에서 Referenced Libraries 및 libs 에 2번 android-support-v4.jar 이 표시될 것입니다.
(프로그램 변경)
3. API 11에선 Framgment가 android.app.Activity 안에 모두 들어 있으나 API 8~10 에는 이게 없기에 android.support.v4.app.Fragment 등을 import 해줍니다. 또한 Fragment를 사용 Activity에서 FragmentActivity로 extends class 이름을 변경합니다.
public class FragmentLayout extends Activity { --> public class FragmentLayout extends FragmentActivity { }
public static class DetailsActivity extends Activity { --> public static class DetailsActivity extends FragmentActivity {
만약 두번쨰 activity class 이름만 변경시 compile은 되지만 실행시 error를 냅니다.
4. android.app.Activity.getFragmentManager() 가 android.support.v4.app.FragmentActivity.getSupportFragmentManager() 에 구현되어 있으니 이름을 변경하시기 바랍니다.
getFragmentManager() --> getSupportFragmentManager()
5. API 11에서 신설되어 사용하는 변수를 API 8~10 에서 사용하는 변수로 변경하여야 합니다.
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_acrtivated_1, Shakespeare.TITLES));
-->
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, Shakespeare.TITLES));
또한 android:attr/detailElementBackground 같은 것은 삭제한다.
이렇게 하면 API 8 (Android 2.2)에서도 잘 돌아 갑니다.
도움이 되길 ..
아래에 파일을 첨부했습니다.
API 11의 API demos program에서 FragmentLayout.java 에 대해 이를 단독으로 돌릴 수 있는 방법에 대해 설명하겠습니다.
(환경 설정)
1. 일단 Eclipse에서 최신 version을 모두 받았다면 {SDK}/extras/android/compatibility/v4/android-support-v4.jar 이 있을것입니다.
이를 자기가 만드는 project의 root directory에서 libs directory를 만든후 여기에 copy를 합니다.
2. Eclipse에서 만들고자 하는 project에 마우스 오른쪽을 누르면 메뉴가 나오는데 여기서 build path - add external archives 에서
1번에서 copy한 jar file을 선택합니다. 이 결과 Eclipse project 에서 Referenced Libraries 및 libs 에 2번 android-support-v4.jar 이 표시될 것입니다.
(프로그램 변경)
3. API 11에선 Framgment가 android.app.Activity 안에 모두 들어 있으나 API 8~10 에는 이게 없기에 android.support.v4.app.Fragment 등을 import 해줍니다. 또한 Fragment를 사용 Activity에서 FragmentActivity로 extends class 이름을 변경합니다.
public class FragmentLayout extends Activity { --> public class FragmentLayout extends FragmentActivity { }
public static class DetailsActivity extends Activity { --> public static class DetailsActivity extends FragmentActivity {
만약 두번쨰 activity class 이름만 변경시 compile은 되지만 실행시 error를 냅니다.
4. android.app.Activity.getFragmentManager() 가 android.support.v4.app.FragmentActivity.getSupportFragmentManager() 에 구현되어 있으니 이름을 변경하시기 바랍니다.
getFragmentManager() --> getSupportFragmentManager()
5. API 11에서 신설되어 사용하는 변수를 API 8~10 에서 사용하는 변수로 변경하여야 합니다.
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_acrtivated_1, Shakespeare.TITLES));
-->
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, Shakespeare.TITLES));
또한 android:attr/detailElementBackground 같은 것은 삭제한다.
이렇게 하면 API 8 (Android 2.2)에서도 잘 돌아 갑니다.
도움이 되길 ..
아래에 파일을 첨부했습니다.
2013.02.02 12:17:43

나도 예제 소스 받아서 해봤는데, 작동되지가 않네요... 하라는대로 환경쎄팅을 다하고 다운받은 파일을 풀어서 실행을 하려고 하는데 기기와 이뮬레이터에 모두 아이콘만 나타나고 메뉴바에 TestFragment 글만 나타납니다. 초보이고보니 애로가 한둘이 아니네요.
빅클라인님이 해보신것같은데 해답주시면 감사하겠어요. 환경쎄팅이 다른것이 또 있는가요?
버전이 2.3.6과 4.0.4인 테블릿에서도 실행해보았는데 안되는군요. 도대체 영문을 모르겠군요. 실행하면 에러가 뜨네요. 02-01 23:32:33.519: E/AndroidRuntime(23783): FATAL EXCEPTION: main
02-01 23:32:33.519: E/AndroidRuntime(23783): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{kr.mint.testfragment/kr.mint.testfragment.Home}: java.lang.ClassNotFoundException: kr.mint.testfragment.Home in loader dalvik.system.PathClassLoader[/data/app/kr.mint.testfragment-1.apk]02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.os.Looper.loop(Looper.java:130)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.ActivityThread.main(ActivityThread.java:3687)
02-01 23:32:33.519: E/AndroidRuntime(23783): at java.lang.reflect.Method.invokeNative(Native Method)
02-01 23:32:33.519: E/AndroidRuntime(23783): at java.lang.reflect.Method.invoke(Method.java:507)
02-01 23:32:33.519: E/AndroidRuntime(23783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
02-01 23:32:33.519: E/AndroidRuntime(23783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
02-01 23:32:33.519: E/AndroidRuntime(23783): at dalvik.system.NativeStart.main(Native Method)
02-01 23:32:33.519: E/AndroidRuntime(23783): Caused by: java.lang.ClassNotFoundException: kr.mint.testfragment.Home in loader dalvik.system.PathClassLoader[/data/app/kr.mint.testfragment-1.apk]
02-01 23:32:33.519: E/AndroidRuntime(23783): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
02-01 23:32:33.519: E/AndroidRuntime(23783): at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
02-01 23:32:33.519: E/AndroidRuntime(23783): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
02-01 23:32:33.519: E/AndroidRuntime(23783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
흠... 예제 소스 받아서 해봤는데, 작동되지가 않네요...
일단 getSupportFragmentManager() 가 에러가 뜨네요;;
하라는데로 했는데 뭐가 잘 못 된건지 모르겠습니다.... 후;;;