안드로이드 프래그먼트 기본 사용법. (Android Fragment)

2016. 4. 21. 17:24


1. 안드로이드 Fragment

안드로이드에서 화면에 출력되는 UI 구성의 가장 기본이 되는 요소는 Activity입니다. 안드로이드 앱이 TextView, Button 등의 위젯을 화면에 표시하기 위해서는 최소한 하나의 Activity는 가져야 하며, Activity가 화면에 표시되는 순간 자식 View 위젯들이 화면에 그려지게 됩니다. Activity는 일반적으로 화면을 가득 채우지만, 화면의 일부에만 표시되도록 만들어 다른 Activity위에 띄울 수도 있습니다.(다이얼로그 형태)


안드로이드 앱 개발자들은 이러한 Activity를 기준으로 한 화면에 표시될 UI를 구성할 수 있습니다. Activity내에 들어갈 구성요소들을, 여러 View 위젯들을 사용하여 구성해야 하죠.


안드로이드가 나온지 얼마 되지 않은 초기 시절에, 전화기와 같은 작은 화면을 가진 디바이스만 있을 때는 Activity단위로 UI를 구성하는데 큰 번거러움이 없었습니다. 화면 크기가 작아서 배치할 수 있는 구성요소가 많지 않고, 사용 방법이 다양하지 않았으니까요.


그런데 큰 화면을 가진 안드로이드 태블릿 디바이스가 나오면서 상황이 조금 달라졌습니다. 화면이 크다보니 많은 위젯들이 사용되어질 수 밖에 없는데, Activity 단위만으로는 그 복잡성을 커버하기가 쉽지 않아진 거죠. 물론 여러 종류의 Layout들로 영역을 구분짓는 방법을 사용해도 되지만 다이나믹한 동작(디바이스에 따른 View 보이기, 감추기, 위치이동 등)이 요구되는 UI를 작성하자니 여간 번거로운 작업이 아니었습니다.


이런 번거로움을 해결하기 위해 안드로이드 허니컴(3.0, API Level 11)부터 Fragment가 도입되었습니다. Fragment는 Activity 내에 생성되는, UI 구성을 여러 개의 모듈 단위로 작성할 수 있도록 해주는 기능입니다. 또한 한번 작성된 Fragment는 여러 Activity에서 재사용이 가능하므로 UI 구성에 소요되는 작업량을 많은 부분 감소시킬 수 있습니다.


이러한 Fragment를 구글에서는 다음과 같이 정의하고 있습니다.


프래그먼트는 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈식 섹션이라고 생각하면 됩니다(다른 액티비티에 재사용할 수 있는 "하위 액티비티"와 같은 개념).

또한 Fragment에 대한 이해를 돕기 위해 작성된 예시 화면과 그에 대한 설명은 아래와 같습니다.


안드로이드 프래그먼트 예시


지금부터 Fragment를 사용하는 방법에 대해 알아보겠습니다.

2. Fragment 기본 사용법.

Fragment에 대한 기본 이해를 돕기 위해 간단한 형태의 예제를 작성하겠습니다.


예제 화면은 세 개의 Fragment와 하나의 Button으로 구성됩니다. 각 Fragment는 자신을 식별하기 위한 TextView를 가집니다. 예제를 실행하면 Fragment A는 화면 상단의 고정 위치에 출력되고, 그 밑에 Fragment B가 출력됩니다. 그 다음 Button을 클릭하면 Fragment B와 C가 매번 교체되도록 동작됩니다.


안드로이드 프래그먼트 예제 레이아웃


2.1 워크플로우

안드로이드 프래그먼트 예제 작성 절차


2.2 Activity에 Fragment 추가.

Activity에 Fragment를 추가하는 방법은 Layout 리소스 XML을 사용하는 것과 Java 코드에서 FragmentManager를 사용하여 ViewGroup에 지정하는 두 가지가 있습니다.


Layout 리소스 XML에 지정하는 방법은 처음 화면에 출력될 Fragment를 지정하거나 화면에서의 동적 변화(show/hide)가 없는 경우에 주로 사용합니다. 반면 FragmentManager를 사용하는 방법은 앱 실행 중 Fragment를 동적으로 추가하거나 변경할 때 사용합니다.


예제에서는 최초 출력될 Fragment를 아래와 같이 Activity에 추가하겠습니다. 아래의 내용 중 FrameLayout은 Fragment B와 C가 교체되어 표시될 ViewGroup으로 사용됩니다.

[STEP-1] "activity_main.xml" - MainActivity에 Fragment 추가. 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:orientation="vertical"
    tools:context="com.recipes4dev.examples.fragmentexample1.MainActivity"
    tools:showIn="@layout/activity_main">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fragmentA"
        android:name="com.recipes4dev.examples.fragmentexample1.FragmentA"
        android:layout_weight="1"
        tools:layout="@layout/activity_main" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/fragmentBorC" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Switch Fragment"
        android:textSize="20sp" />

</LinearLayout>

위의 코드에서 Fragment의 속성 중 "android:name"에는 화면에 출력할 Fragment 클래스를 지정합니다. Fragment는 개발자가 Layout을 만들어줘야 하기 때문에 Activity를 사용할 때와 마찬가지로 Fragment를 상속한 사용자 클래스를 만들어서 사용해야 합니다. 즉, "2.3 Fragment 클래스 상속 및 구현."에서 만들게 될 클래스를 "android:name"에 지정하는 것입니다.

2.3 Fragment를 위한 Layout 리소스 XML.

각 Fragment를 위한 Layout 리소스 XML을 작성합니다. 참고로 Fragment의 구분을 쉽게 하기 위해 Fragment의 LinearLayout에 "background" 속성을 사용하여 각각 다른 컬러를 지정하였습니다.

[STEP-2.1] "fragment_a.xml" - FragmentA의 Layout 리소스 XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFAAAA"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="Fragment A" android:gravity="center" /> </LinearLayout>

[STEP-2.2] "fragment_b.xml" - FragmentB의 Layout 리소스 XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#AAFFAA"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="Fragment B" android:gravity="center" /> </LinearLayout>

[STEP-2.3] "fragment_c.xml" - FragmentC의 Layout 리소스 XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#AAAAFF"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="Fragment C" android:gravity="center" /> </LinearLayout>

2.4 Fragment 클래스 상속 및 구현.

Fragment를 상속받은 FragmentA, FragmentB, FragmentC 클래스를 생성합니다.

[STEP-3.1] "fragmentA.java" - FragmentA 클래스
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class FragmentA extends Fragment { public FragmentA() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_a, container, false); } }
[STEP-3.2] "fragmentB.java" - FragmentB 클래스
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class FragmentB extends Fragment { public FragmentB() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_b, container, false); } }
[STEP-3.3] "fragmentC.java" - FragmentC 클래스
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class FragmentC extends Fragment { public FragmentC() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_c, container, false); } }


2.5 Activity의 onCreate()에서 Fragment 초기화

각 Fragment에 대한 Layout 리소스 XML를 작성하고 클래스도 구현하였으니, Java 코드에서 Fragment를 추가하는 코드에 대해 설명하겠습니다.


Java 코드에서 Fragment를 다룰 때는 FragmentManager와 FragmentTransaction 클래스를 사용합니다.


사용 방법은 매우 간단합니다. Activity 클래스의 getFragmentManager() 함수를 사용하여 FragmentManager에 대한 참조를 획득한 다음, FragmentManager의 beginTransaction() 함수를 호출하여 FragmentTransaction을 시작합니다.
그런 다음 FragmentTransaction의 add() 함수를 이용하여 Fragment를 Activity의 ViewGroup(FrameLayout)에 추가합니다. Fragment와 관련된 모든 작업이 완료되면 FragmentTransaction의 commit() 함수를 호출하여 Fragment와 관련된 작업이 완료되었음을 알려줍니다.


예제에서 작성한 Activity의 onCreate() 함수는 아래와 같습니다.

[STEP-4] "MainActivity.java" - onCreate() 함수에서 Fragment 추가.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ... 코드 계속

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.add(R.id.fragmentBorC, new FragmentB());
        fragmentTransaction.commit();

        // 코드 계속 ...
    }

Fragment의 Transaction과 관련하여 중요한 내용 중에 addToBackStack() 함수가 있습니다. 바로 commit()이 실행되기 이전 상태를 "백 스택"에 추가할 수 있는 함수입니다. "백 스택"에 들어간 내용은 Activity에 의해 관리되며, "뒤로(Back)" 버튼을 누르면 이전 상태에 저장된 Fragment를 다시 가져올 수 있는 것이죠.
addToBackStack() 함수의 사용에 대한 내용은 다음 기회에 자세히 다루겠습니다.

2.6 Button 클릭 시, FragmentTransaction을 사용한 Fragment 교체

마지막으로 Button이 클릭되면 Fragment가 교체되는 기능을 작성합니다. onCreate() 함수 내용과 마찬가지로 Fragment를 제어하는 기능이 구현되므로 FragmentManager와 FragmentTransaction을 사용합니다.

[STEP-5] "MainActivity.java" - Button 클릭 시 Fragment 교체.
public class MainActivity extends AppCompatActivity {

    private boolean isFragmentB = true ;

    // ... 코드 계속
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ... 코드 계속 [STE]

        Button button1 = (Button) findViewById(R.id.button1) ;
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchFragment() ;
            }
        });
    }

    public void switchFragment() {
        Fragment fr;

        if (isFragmentB) {
            fr = new FragmentB() ;
        } else {
            fr = new FragmentC() ;
        }

        isFragmentB = (isFragmentB) ? false : true ;

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentBorC, fr);
        fragmentTransaction.commit();
    }
}

3. Fragment 예제 실행 화면

아래는 예제 실행 화면입니다.


안드로이드 프래그먼트 예제 실행 화면


예제는 다음과 같이 동작합니다.

4. 참고.

.END.


ANDROID 프로그래밍/FRAGMENT , , , , , , ,

  1. 이전 댓글 더보기
  2. Blog Icon
    tty11

    안녕하세요...좋은자료 잘 보고있습니다. 그런데 이 예제 실행이 되는게 맞나요?
    제가 뭘 빠트린건지 테스트를 해보려고해도 잘 안되네요..

  3. 네. 본문의 예제는 전부 실행 확인하고 작성했기 때문에 본문 그대로 작성하면 정상적으로 실행되는 것을 확인하실 수 있습니다. ^^

  4. Blog Icon
    tty11

    아 해결했습니다...이게 보니까 import 하는게 2가지가 있더라구요.

    import android.app.Fragment;
    import android.support.v4.app.Frament......

    이 2개 때문에 삽질했었네요;

    어쩐지
    FragmentManager fm = getSupportFragmentManager();
    이부분도 오류가 나더라구요..
    그리고

    FragmentA,B,C 클래스를 상속하는 부분이 저는
    extends android.support.v4.app.Fragment

    이렇게 맞춰주니까 정상적으로 잘 작동하네요..
    support.v4.app.Fragment 가 최신같은데..무조건 이걸 써야하는건가요?
    아니면 그냥 버전만 맞춰준다면 아무거나 써도 상관없는건가요?

  5. Support Library가 존재하는 이유는 하위 버전의 안드로이드 시스템이 설치된 기기에서도 해당 요소를 사용할 수 있도록 하기 위함인데요.

    Fragment의 경우도 마찬가지로, 하위 버전과의 호환성을 위해서는 support.v4.app.Fragment를 사용하고, 그렇지 않은 경우는 android.app.Fragment를 사용하면 됩니다. (v4 지원 라이브러리는 Android 2.3(API Level 9) 이상에서 사용하도록 만들어진 라이브러리입니다.)

    일반적인 상황에서, 하위 버전과의 호환성은 장점으로 작용하니, Support Library를 사용하는 것이 더 좋을 것 같네요.

    자세한 내용은 (https://developer.android.com/topic/libraries/support-library/features.html?hl=ko#v4) 링크를 참고하시길 바랍니다.

    감사합니다.

  6. Blog Icon
    암이 나았습니다

    그저 빛입니다 . 감사합니다 ..

  7. 저는 그저 거울일 뿐입니다.
    그대의 가슴 속 열정에서 나온 빛을 반사한 것일 뿐.. 훗.  ◟( ˘ ³˘)◞ 

    감사합니다.

  8. 존경합니다

  9. 어익후.. 존경받을만한 내용이 아닌데...
    격려의 댓글 감사합니다.

  10. 잘보고갑니다.
    그동안 플밍공부하며 이 블로그를 어떻게 못 볼 수 있었나 싶네요.
    너무 정리가 잘 되어있어서 놀랍습니다.. 일목요연하게 ㅎㅎ
    앞으로 자주 보러오겠습니다.

  11. 아마, 내용이 허접하여 검색 결과에 드러나지 않는 것 아닐까요? ㅠㅠ
    부족한 글이지만 모쪼록 도움되시면 좋겠습니다.

    궁금한 내용 있으면 언제든 질문글 남겨주세요.

    감사합니다.

  12. Blog Icon
    우미

    허접해서가 아니라 제가 안드로이드 공부는 이제 시작해서 그런가보네요
    다시 보니 블로그 내용이 거의 안드로이드셔서!
    덕분에 잘 공부할 수 있겠어요

  13. 이제 안드로이드 공부를 시작하신다니, 아주 조금은 도움을 드릴 수 있겠네요.
    열심히 블로그 글들을 작성했지만, 글 내용을 너무 믿지는 마시고.. ^^;;
    다른 많은 자료 잘 참고하셔서 멋진 앱 만드시길 바랍니다.

    감사합니다.

  14. Blog Icon
    물궁

    프레그먼트 처음 사용하는데 많은 도움 받고 갑니다.
    감사합니다!

  15. 도움되셨다니 다행입니다.
    방문해 주셔서 감사합니다.

  16. Blog Icon
    태원

    작성된 프로젝트의 API LEVEL은 알 수 있을까요?

  17. 오래 전에 작성한 글이라, 자료가 딱히 남아 있지 않아서 API 레벨은 정확히 모르겠네요.

    혹시 Deprecated 된 사항 때문에 질문글 남기신 건가요? 그렇다면, 위 소스 내용 중에 Fragment와 관련된 코드를 아래와 같이 바꿔보세요.

    android.app.Fragment -> android.support.v4.app.Fragment
    android.app.FragmentManager -> android.support.v4.app.FragmentManager;
    android.app.FragmentTransaction; -> android.support.v4.app.FragmentTransaction

    FragmentManager fm = getFragmentManager(); -> FragmentManager fm = getSupportFragmentManager();

    FragmentManager fm = getFragmentManager(); ->
    FragmentManager fm = getSupportFragmentManager();

    만약 질문에 대한 답변이 부족하다면, 다시 질문 글 남겨주시길 바랍니다.

    위의 내용은 본문에 반영해 놓을게요.

    감사합니다.

  18. Blog Icon
    12213

    잘보고갑니다!

  19. 방문해 주셔서 감사합니다!

  20. Blog Icon
    to45123

    잘보고 갑니다. 제가 궁금한 것은 new로 동적할당한 Fragment 객체는 언제 소멸되는지요??
    switch 할때마다 new가 발생하는데.. gcc에 맡겨야하는건가요?? 아니면 swtich 되면서 저절로 소멸되는지요??

  21. new로 동적 할당한 객체들은 GC에 의해 관리됩니다. switch 되는 순간 자동 소멸되는 건 아니고, GC에 의해서 메모리가 필요없다고 판단되는 때에 반환됩니다.

    본문에서는 프래그먼트에 대한 내용에 중점을 두었기 때문에, 메모리 관리에 대한 내용은 따로 정리하지 않았는데요. 보통은 직접 메모리를 관리하거나, 싱글톤 패턴 등을 통해 반복적으로 메모리가 할당되지 않게 만듭니다.

    기회가 되면 이와 관련된 내용을 정리하면 좋을텐데, 역시나 시간이 문제군요. ㅜㅜ

  22. 혹시 fragmnet와 fragmentlayout의 차이는 무엇인가요 ? 상황에 따라 어떻게 구분하나요 ~

  23. 음.. FragmentLayout이 무얼 의미하시는 건가요?

    혹시 FrameLayout을 말씀하시는 건가요? 아니면 직접 만드신 FragmentLayout 클래스가 아닌가요?

    FragmentLayout을 어디에서 보셨는지 알려주시면 도움을 드릴 수 있을 것 같습니다.

    감사합니다.

  24. Blog Icon
    wsyang

    <fragment
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/fragmentA"
    android:name="com.recipes4dev.examples.fragmentexample1.FragmentA"
    android:layout_weight="1"
    tools:layout="@layout/activity_main" /> -----> 이 부분을
    이렇게 바꿔야 할거 같습니다.
    tools:layout="@layout/fragment_a" />

  25. 직접 소스 실행해보시고, 검토해야 할 점까지 댓글로 남겨주셔서 감사합니다.

  26. Blog Icon
    swe

    잘 배우고 갑니다. 감사합니다!

  27. 방문해 주셔서 감사합니다!

  28. Blog Icon
    ㅂㅂㅂ

    안녕하세요

    android:name="com.recipes4dev.examples.fragmentexample1.FragmentA"
    name이 class라고 하셨는데 그럼 FragmentA가 아래 있는 클래스 지칭한다고 생각하면 되는지요?
    public class FragmentA extends Fragment

  29. 네. 맞습니다.
    본문에서 "com.recipes4dev.examples.fragmentexample1.FragmentA"는 FragmentA를 가리키는 게 맞습니다.

  30. Blog Icon
    ㅂㅂㅂ

    그리고 Fragment B 나 C의 경우는 Framelayout에서 불러지는 것이라서 android:name 지정이 안되었는데 Fragment Manager에서 컨트롤하니 문제 없는건지? 아님 어딘가에 android:name 설정이 필요한지요?

  31. android:name을 사용하는 이유는, 레이아웃에 표시될 프래그먼트를 가리키기 위함입니다.

    최초에 액티비티가 화면에 표시될 때 하나의 프래그먼트가 표시되어야 하는 경우를 생각해보죠.

    코드 상에서, 액티비티의 onCreate()에 프래그먼트를 생성하는 코드를 작성할수도 있지만,
    아예 처음부터 레이아웃 XML에 프래그먼트를 넣어버리는 방법을 사용할 수 있습니다.

    본문에서 사용한 방법이 후자이고요. 액티비티의 레이아웃에 <fragment>를 사용해서 하나의 프래그먼트를 추가한 것이바로 그것이죠.
    그리고 <fragment>에 어떤 프래그먼트가 표시될 것인지를 결정하는 속성이 바로 "android:name" 인 것입니다.

    반면 FragmentB와 FragmentC는 처음부터 화면에 표시하지 않기 때문에 "android:name" 필드를 사용할 이유는 없고요, 대신 FragmentManager를 사용해 FrameLayout에 프래그먼트를 동적으로 표시했습니다.

    요약하자면, 프래그먼트를 레이아웃에 바로 지정하여 표시하고자 할 때, <fragment>에 "android:name" 속성을 사용하여 인스턴스화 하고자 하는 클래스 이름을 지정합니다.

    답변이 되었는지 모르겠네요.
    추가적으로 궁금한 것이 있으면 다시 질문글 남겨주세요.

    감사합니다.

  32. Blog Icon
    코딩슬레이브

    안녕하세요 항상 글잘보고있습니다.
    다름이 아니라 제가 Naviagation Drawer 액티비티를 사용하는중에, 이 액티비티에 존재하는 NavGraph의 역할을 하는 <fragment>태그를 사용할 일이 생겼습니다. 이 프래그먼트는 viewpager2로 되어있고, viewpager2는 리사이클러뷰를 사용해 각 페이지를 나타내기에 그리 사용했습니다. 제가 할일은
    Navigation Drawer 액티비티에서 해당 프래그먼트로 각기 다른 데이터를 보내 서로다른 페이지를 나타내는게 목표입니다.
    액티비티->프래그먼트의 데이터 전달에 setArgument라는걸 알게 되었고 사용하였는데,
    받는 쪽 입장에서 즉 getString이라던지..getParcelable이라던지에서 자꾸 null object 에러가 납니다.
    코드에는 문제가 없었기에 원인을 모르고 헤매다가.. <fragment> 태그가 원인이라는걸 알게됐습니다.
    <fragment>대신 다른 어느 레이아웃을 사용해 getSupportFragmentManager를 사용하고, newInstance를 통해 프래그먼트를 생성하고 데이터를 보내면 정상적으로 보내지나..
    왜 하필 <fragment>태그는 안되는건지 잘모르겠습니다.
    차이점은 위 방법은 제가 동적으로 생성하고 <fragment>는 앱실행시 자동으로 인플레이션 되어 올라간다는점 밖에 모르겠습니다.
    다른 방법을 찾다가 <fragment>를 사용시 코드상에서 getSupportFragmentManager().findFragmentByid(id)를 해서 <fragment> 태그를 참조(?)하는 방식으로해 setArgument를 사용해보기도 했으나 결과는 똑같은 에러가나네요. 이방법은 <fragment>태그를 참조하는거라 될거라 생각햇는데 말이죠..
    <fragment>와 getSupportFragmentManager() 사용시에 어떤 관계가 있는건지 잘모르겠습니다.
    <fragment> 태그 사용시 setArgument해서 데이터를 보내는 방법같은건 없을까요..?
    원인을 모르겠습니다

    장문죄송합니다 감사합니다

  33. 질문글에서 작성한 코드를 올려주시면 원인을 파악하는데 도움될 것 같습니다.

    특히, 액티비티->프래그먼트로 데이터를 전달하는 것과 관련된 코드를 올려주시면 좋을 것 같네요.

    1. 레이아웃에서 프래그먼트를 사용한 코드.
    2. 액티비티에서 프래그먼트 참조를 획득한 방법.
    3. 액티비티에서 데이터를 전달하는 코드.
    4. 프래그먼트에서 데이터를 가져오는 코드.

    그리고 문제가 될 때 에러 메시지도 올려주시면 좋을 것 같습니다.

    최종적으로 도움을 드릴 수 있을지 모르겠지만, 현재 내용만으로는 정확한 원인을 알 수가 없네요.

    감사합니다.

  34. Blog Icon
    푸들

    마지막 부분에
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

    return inflater.inflate(R.layout.fragment_a, container, false);
    }
    false 인 이유를 간단하게 설명해주실 수 있나요? 찾아보는데 이해하기가 쉽지 않네요ㅠㅠ
    그리고 혹시 탭이 5개있을 때 프래그먼트 5개와 뷰페이저를 만드는 방법으로 앱을 만드려고 하는데, 탭 메뉴를 만들때 선호하시는 방법이 있는지 궁금합니다 좋은 정보 감사합니다 !!

  35. 세 번째 파라미터(attachToRoot)는, 그냥 간단하게,
    레이아웃을 inflate하면서 두 번째 파라미터로 전달되는 Root ViewGroup에 attach할 것인지 말 것인지를 결정하는 값입니다. 그리고 이 attachToRoot에 따라 inflate()의 리턴 값이 달라집니다.

    attachToRoot를 true로 하면 inflate한 결과를 container에 attach하고 inflate() 함수가 container를 리턴합니다.

    attachToRoot를 false로 하면 어느 곳에도 attach하지 않고 inflate한 레이아웃의 Root를 리턴합니다.

    프래그먼트의 onCreateView() 메서드는 프래그먼트의 UI 뷰를 인스턴스화할때 호출하는 메서드이며, 프래그먼트에 표시될 뷰를 리턴하면 됩니다. 즉, inflate한 레이아웃의 Root를 리턴하면 됩니다.
    그래서 inflate()의 마지막 파라미터(attachToRoot)를 false로 지정하였습니다.

    감사합니다.

  36. Blog Icon
    gowata7

    좋은 글 감사합니다.!!
    학습용으로 블로그를 운영하고있는데
    블로그 포스팅에 참고 해도 될까요??

  37. 링크를 달아주시는 것은 언제든 환영입니다!

    감사합니다.

  38. Blog Icon
    great

    깔끔한 설명 감사드립니다 ^^ 초보 안드 개발자한테 많은 도움 되었습니다.

  39. 도움되셨다니 다행이네요.
    방문해 주셔서 감사합니다.

  40. Blog Icon
    gf0308@naver.com

    덕분에 fragment를 알 수 있었습니다
    좋은 내용 감사합니다

  41. 방문해 주셔서 감사합니다.

  42. Blog Icon
    김혀두

    ndroid:name="com.recipes4dev.examples.fragmentexample1.FragmentA"
    name 속성은 class의 경로를 의미하는건가요? 그럼 org로 시작해야되지 않을까요? org.techtown.~

  43. Fragment의 name 속성에 지정되는 값은 프래그먼트를 구현하는 클래스의 이름입니다.

    FragmentA가 포함된 패키지 전체 이름을 지정하면 됩니다.

    감사합니다.