SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
ActionBar & Fragment
Leonardo YongUk Kim http://dalinaum-kr.tumblr.com
ActionBar
애플리케이션 아이콘

 최상위 화면이 아니면 캐럿(<)을 포함해야 함.

뷰 컨트롤

 여러 뷰를 사용할 때. 스피너나 탭을 제공해야.

액션 버튼(3)과 액션 오버플로우(4)

 메뉴 버튼은 사용하지 않음.

 부족한 항목은 오버플로우를 통해 표시되어야 함.
애플리케이션 아이콘



getActionBar().setDisplayAsUpEnable(true|false)
getActionBar().setDisplayUseLogoEnabled(true|false)
UP 선택시 onOptionsItemSelected(MenuItem)이 호출.

  MenuItem 값은 action.R.id.home
뷰 컨트롤
                                        getActionBar().setNavigation(
                                     ActionBar.NAVIGATION_MODE_TAB)

                                         tab = getActionBar().newTab()
                                                .setText(“TAB”)
                                  .setTabListener(new MyListener(Fragment))

                                         getActionBar().addTab(tab)




    getActionBar().setNavigation(
ActionBar.NAVIGATION_MODE_LIST)

    setListNavigationCallbacks(
          SpinnerAdapter,
       OnNavigationListener)
액션 버튼



 onCreateOptionsMenu(Menu) {
   getMenuInflater().inflate(RID, Menu)
 }
액션 버튼

  onCreateOptionsMenu(Menu) {
      getMenuInflater().inflate(ResourceID, Menu)
  }

<menu xmlns:android="http://schemas.android.com/apk/
res/android">
    <item android:id="@+id/menu_save"
          android:icon="@drawable/ic_menu_save"
          android:title="@string/menu_save"
          android:showAsAction="ifRoom|withText" />
</menu>
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this,
HomeActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
문맥 액션바 (CAB: Contextual Action Bar)
문맥 액션바

private ActionMode.Callback mCallback = new
ActionMode.Callback() {
}

       startActionMode( mCallback );
Action Provider




 <item android:id="@+id/menu_share"
        android:title="@string/share"
        android:showAsAction="ifRoom"
        android:actionProviderClass="android.widget.ShareActionProvider" />
  ...
Froyo? GingerBread?




 Jake Wharton



                http://actionbarsherlock.com
Fragment
<LinearLayout>
                        <include layout=”...>
                        <include layout=”...>
                          </LinearLayout>




   <LinearLayout>
<include layout=”...>
<include layout=”...>
  </LinearLayout>
<LinearLayout>
                        <include layout=”...>
                        <include layout=”...>
                          </LinearLayout>


      중첩된 요소를 관리할 방법이 없었습니다.
   <LinearLayout>
<include layout=”...>
<include layout=”...>
  </LinearLayout>
Activity를 중첩하면 어때?




ActivityGroup (eg. TabActivity)는 Activity를 포함시킬 수
있었습니다. (현재는 deprecated)

View 모델로는 상황에 따른 관리가 어렵다.

Activity는 중첩을 고려하지 않아 여러 문제가 존재.
계층 레이아웃이 아니면 문제 없는 것 아네요?
회전 등으로 액티비티가 사라지면
프로그래머가 알아서 해야 합니다.
액티비티 간에 정보 전달할 방법은 인텐트와
onRetainNonConfigurationInstance (deprecated)
전역적인 정보 공유 방법이 부재.

처리하던 작업이나 외부에서 오는 노티를 액티비티가
받기 어려움.
Fragment




       독립적인 UI 단위
생명 주기를 통한
시스템에 의한 관리
<FrameLayout xmlns:android="http://schemas.android.com/apk/
res/android"
    android:layout_width="match_parent"
android:layout_height="match_parent">
    <fragment
class="com.example.android.apis.app.FragmentLayout
$TitlesFragment"
             android:id="@+id/titles"
             android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>




 fragment에 class를 정적으로 넣어 생성하는 방법
DetailsFragment details = (DetailsFragment)
                                getFragmentManager().findFragmentById(R.id.details);
                        if (details == null || details.getShownIndex() != index) {
                            // Make new fragment to show this selection.
                            details = DetailsFragment.newInstance(index);

                                // Execute a transaction, replacing any existing
                                // fragment with this one inside the frame.
                                FragmentTransaction ft
                                        = getFragmentManager().beginTransaction();
                                ft.replace(R.id.details, details);
                                ft.setTransition(
                                        FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                                ft.commit();
                        }



    fragment를 동적으로 생성하거나 교체하는 방법

    한번에 여러 fragment가 교체될 수 있고 백스택에 의해
    관리됨. 그렇기 때문에 트랜잭션을 만들어야 함.

        add와 replace를 주로 사용.
한번의 트랜잭션 동안 두개의 프래그먼트를 교체.
타블렛 + 폰
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


                                                                                                   두개의 layout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment class="com.example.android.apis.app.TitlesFragment"
                android:id="@+id/titles" android:layout_weight="1"
                android:layout_width="0px"
                android:layout_height="match_parent" />

    <FrameLayout android:id="@+id/details" android:layout_weight="1"
            android:layout_width="0px"
            android:layout_height="match_parent" />
   
</LinearLayout>



                                                                <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                                                        android:layout_width="match_parent"
                                                                        android:layout_height="match_parent">
                                                                    <fragment class="com.example.android.apis.app.TitlesFragment"
                                                                            android:id="@+id/titles"
                                                                            android:layout_width="match_parent"
                                                                            android:layout_height="match_parent" />
                                                                </FrameLayout>




런타임으로 서브 Fragment 존재 확인
                          DetailsFragment details = (DetailsFragment)
                                 getFragmentManager().findFragmentById(R.id.details);
                         if (details == null || details.getShownIndex() != index) {
타블렛 + 폰
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


                                                                                                   두개의 layout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment class="com.example.android.apis.app.TitlesFragment"
                android:id="@+id/titles" android:layout_weight="1"
                android:layout_width="0px"
                android:layout_height="match_parent" />



                 뷰 컴포넌트를 재사용가능하고
    <FrameLayout android:id="@+id/details" android:layout_weight="1"
            android:layout_width="0px"
            android:layout_height="match_parent" />
   

              시스템이 리소스 관리를 도와주는 것일 뿐.
</LinearLayout>




                프로그래머는 코딩해야 합니다.
                                                                <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                                                        android:layout_width="match_parent"
                                                                        android:layout_height="match_parent">
                                                                    <fragment class="com.example.android.apis.app.TitlesFragment"
                                                                            android:id="@+id/titles"
                                                                            android:layout_width="match_parent"
                                                                            android:layout_height="match_parent" />
                                                                </FrameLayout>




런타임으로 서브 Fragment 존재 확인
                          DetailsFragment details = (DetailsFragment)
                                 getFragmentManager().findFragmentById(R.id.details);
                         if (details == null || details.getShownIndex() != index) {
기본 콤포넌트와 구글 API는 점차
Fragment 위주로

DialogFragment
ListFragment
PreferenceFragment
WebViewFragment
YouTubePlayerFragment
MapFragment
Android UI
Actionbar and fragment
Actionbar and fragment

Mais conteúdo relacionado

Destaque

Viewpager를활용한app만들기
Viewpager를활용한app만들기Viewpager를활용한app만들기
Viewpager를활용한app만들기
DaeHee Jang
 

Destaque (20)

Tensorflow 101
Tensorflow 101Tensorflow 101
Tensorflow 101
 
Realm과 RxJava
Realm과 RxJavaRealm과 RxJava
Realm과 RxJava
 
PublishSubject
PublishSubjectPublishSubject
PublishSubject
 
Viewpager를활용한app만들기
Viewpager를활용한app만들기Viewpager를활용한app만들기
Viewpager를활용한app만들기
 
나의 오픈소스 사용기
나의 오픈소스 사용기나의 오픈소스 사용기
나의 오픈소스 사용기
 
A brief guide to android gradle
A brief guide to android gradleA brief guide to android gradle
A brief guide to android gradle
 
The Git - (#1/2)
The Git - (#1/2)The Git - (#1/2)
The Git - (#1/2)
 
Anatomy of an android
Anatomy of an androidAnatomy of an android
Anatomy of an android
 
Realm Java
Realm JavaRealm Java
Realm Java
 
Butter android views
Butter android viewsButter android views
Butter android views
 
안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
3D Graphics 101
3D Graphics 1013D Graphics 101
3D Graphics 101
 
좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰
 
C++ stl
C++ stlC++ stl
C++ stl
 
Modern android
Modern androidModern android
Modern android
 
EventBus for Android
EventBus for AndroidEventBus for Android
EventBus for Android
 
A brief introduction to Realm with Kotlin
A brief introduction to Realm with KotlinA brief introduction to Realm with Kotlin
A brief introduction to Realm with Kotlin
 

Semelhante a Actionbar and fragment

캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
Daum DNA
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
우영 주
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
NAVER D2
 

Semelhante a Actionbar and fragment (20)

200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
 
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
 
Nodejs express
Nodejs expressNodejs express
Nodejs express
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device access
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptx
 
Introducing Fragments
Introducing FragmentsIntroducing Fragments
Introducing Fragments
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
 
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
 
지금은 Constraint layout 시대
지금은 Constraint layout 시대지금은 Constraint layout 시대
지금은 Constraint layout 시대
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp
 
Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
 
[React-Native-Seoul] React-Native 초심자를 위한 실습위주의 간단한 소개 및 구현법 안내
[React-Native-Seoul] React-Native 초심자를 위한 실습위주의 간단한 소개 및 구현법 안내[React-Native-Seoul] React-Native 초심자를 위한 실습위주의 간단한 소개 및 구현법 안내
[React-Native-Seoul] React-Native 초심자를 위한 실습위주의 간단한 소개 및 구현법 안내
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
웹개발자가 알아야할 기술
웹개발자가 알아야할 기술웹개발자가 알아야할 기술
웹개발자가 알아야할 기술
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
 

Mais de Leonardo YongUk Kim

Mais de Leonardo YongUk Kim (14)

Compose Multiplatform 101
Compose Multiplatform 101Compose Multiplatform 101
Compose Multiplatform 101
 
Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
 
MVC부터 MVVM, 단방향 데이터 흐름까지
MVC부터 MVVM, 단방향 데이터 흐름까지MVC부터 MVVM, 단방향 데이터 흐름까지
MVC부터 MVVM, 단방향 데이터 흐름까지
 
역시 Redux
역시 Redux역시 Redux
역시 Redux
 
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
 
Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스
 
React Everywhere
React EverywhereReact Everywhere
React Everywhere
 
React Redux React Native
React Redux React NativeReact Redux React Native
React Redux React Native
 
Veni, Vide, Built: Android Gradle Plugin
Veni, Vide, Built: Android Gradle PluginVeni, Vide, Built: Android Gradle Plugin
Veni, Vide, Built: Android Gradle Plugin
 
The git
The gitThe git
The git
 
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
 
red black tree
red black treered black tree
red black tree
 

Actionbar and fragment

  • 1. ActionBar & Fragment Leonardo YongUk Kim http://dalinaum-kr.tumblr.com
  • 3. 애플리케이션 아이콘 최상위 화면이 아니면 캐럿(<)을 포함해야 함. 뷰 컨트롤 여러 뷰를 사용할 때. 스피너나 탭을 제공해야. 액션 버튼(3)과 액션 오버플로우(4) 메뉴 버튼은 사용하지 않음. 부족한 항목은 오버플로우를 통해 표시되어야 함.
  • 4.
  • 6. 뷰 컨트롤 getActionBar().setNavigation( ActionBar.NAVIGATION_MODE_TAB) tab = getActionBar().newTab() .setText(“TAB”) .setTabListener(new MyListener(Fragment)) getActionBar().addTab(tab) getActionBar().setNavigation( ActionBar.NAVIGATION_MODE_LIST) setListNavigationCallbacks( SpinnerAdapter, OnNavigationListener)
  • 7. 액션 버튼 onCreateOptionsMenu(Menu) { getMenuInflater().inflate(RID, Menu) }
  • 8. 액션 버튼 onCreateOptionsMenu(Menu) { getMenuInflater().inflate(ResourceID, Menu) } <menu xmlns:android="http://schemas.android.com/apk/ res/android"> <item android:id="@+id/menu_save" android:icon="@drawable/ic_menu_save" android:title="@string/menu_save" android:showAsAction="ifRoom|withText" /> </menu>
  • 9. @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go home Intent intent = new Intent(this, HomeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); } }
  • 10. 문맥 액션바 (CAB: Contextual Action Bar)
  • 11. 문맥 액션바 private ActionMode.Callback mCallback = new ActionMode.Callback() { } startActionMode( mCallback );
  • 12. Action Provider <item android:id="@+id/menu_share" android:title="@string/share" android:showAsAction="ifRoom" android:actionProviderClass="android.widget.ShareActionProvider" /> ...
  • 13. Froyo? GingerBread? Jake Wharton http://actionbarsherlock.com
  • 15. <LinearLayout> <include layout=”...> <include layout=”...> </LinearLayout> <LinearLayout> <include layout=”...> <include layout=”...> </LinearLayout>
  • 16. <LinearLayout> <include layout=”...> <include layout=”...> </LinearLayout> 중첩된 요소를 관리할 방법이 없었습니다. <LinearLayout> <include layout=”...> <include layout=”...> </LinearLayout>
  • 17. Activity를 중첩하면 어때? ActivityGroup (eg. TabActivity)는 Activity를 포함시킬 수 있었습니다. (현재는 deprecated) View 모델로는 상황에 따른 관리가 어렵다. Activity는 중첩을 고려하지 않아 여러 문제가 존재.
  • 18. 계층 레이아웃이 아니면 문제 없는 것 아네요?
  • 19. 회전 등으로 액티비티가 사라지면 프로그래머가 알아서 해야 합니다.
  • 20. 액티비티 간에 정보 전달할 방법은 인텐트와 onRetainNonConfigurationInstance (deprecated) 전역적인 정보 공유 방법이 부재. 처리하던 작업이나 외부에서 오는 노티를 액티비티가 받기 어려움.
  • 21. Fragment 독립적인 UI 단위
  • 22.
  • 24. <FrameLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.example.android.apis.app.FragmentLayout $TitlesFragment" android:id="@+id/titles" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> fragment에 class를 정적으로 넣어 생성하는 방법
  • 25. DetailsFragment details = (DetailsFragment)                     getFragmentManager().findFragmentById(R.id.details);             if (details == null || details.getShownIndex() != index) {                 // Make new fragment to show this selection.                 details = DetailsFragment.newInstance(index);                 // Execute a transaction, replacing any existing                 // fragment with this one inside the frame.                 FragmentTransaction ft                         = getFragmentManager().beginTransaction();                 ft.replace(R.id.details, details);                 ft.setTransition(                         FragmentTransaction.TRANSIT_FRAGMENT_FADE);                 ft.commit();             } fragment를 동적으로 생성하거나 교체하는 방법 한번에 여러 fragment가 교체될 수 있고 백스택에 의해 관리됨. 그렇기 때문에 트랜잭션을 만들어야 함. add와 replace를 주로 사용.
  • 26. 한번의 트랜잭션 동안 두개의 프래그먼트를 교체.
  • 27. 타블렛 + 폰 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 두개의 layout         android:orientation="horizontal"         android:layout_width="match_parent"         android:layout_height="match_parent">     <fragment class="com.example.android.apis.app.TitlesFragment"             android:id="@+id/titles" android:layout_weight="1"             android:layout_width="0px"             android:layout_height="match_parent" />     <FrameLayout android:id="@+id/details" android:layout_weight="1"             android:layout_width="0px"             android:layout_height="match_parent" />     </LinearLayout> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:layout_width="match_parent"         android:layout_height="match_parent">     <fragment class="com.example.android.apis.app.TitlesFragment"             android:id="@+id/titles"             android:layout_width="match_parent"             android:layout_height="match_parent" /> </FrameLayout> 런타임으로 서브 Fragment 존재 확인 DetailsFragment details = (DetailsFragment)                     getFragmentManager().findFragmentById(R.id.details);             if (details == null || details.getShownIndex() != index) {
  • 28. 타블렛 + 폰 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 두개의 layout         android:orientation="horizontal"         android:layout_width="match_parent"         android:layout_height="match_parent">     <fragment class="com.example.android.apis.app.TitlesFragment"             android:id="@+id/titles" android:layout_weight="1"             android:layout_width="0px"             android:layout_height="match_parent" /> 뷰 컴포넌트를 재사용가능하고     <FrameLayout android:id="@+id/details" android:layout_weight="1"             android:layout_width="0px"             android:layout_height="match_parent" />     시스템이 리소스 관리를 도와주는 것일 뿐. </LinearLayout> 프로그래머는 코딩해야 합니다. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:layout_width="match_parent"         android:layout_height="match_parent">     <fragment class="com.example.android.apis.app.TitlesFragment"             android:id="@+id/titles"             android:layout_width="match_parent"             android:layout_height="match_parent" /> </FrameLayout> 런타임으로 서브 Fragment 존재 확인 DetailsFragment details = (DetailsFragment)                     getFragmentManager().findFragmentById(R.id.details);             if (details == null || details.getShownIndex() != index) {
  • 29. 기본 콤포넌트와 구글 API는 점차 Fragment 위주로 DialogFragment ListFragment PreferenceFragment WebViewFragment YouTubePlayerFragment MapFragment