1. 다른 프래그먼트 호출하기

프래그먼트는 독립적으로 구성되도록 만들었기 때문에 직접 접근하는 것을 권장하지 않는다.

다른 프래그먼트를 띄우기 위해선 액티비티 쪽으로 요청해서 띄워야한다.

getActivity()를 이용해 동작하는 프래그먼트 위의 액티비티를 참조할 수 있다.


프래그먼트에서 액티비티의 메소드를 호출하거나, 액티비티에서 프래그먼트의 메소드를 호출하면 

프래그먼트와 액티비티 간에 데이터를 전달할 수 있다.

이렇게 하는 이유는 액티비티 간에 데이터를 전달할 때 인텐트를 사용하는 것처럼 

프래그먼트에서도 인텐트를 사용할 수는 없기 때문이다.

프래그먼트에서 액티비티의 메소드를 호출할 때는 인터페이스를 사용하는 것이 일반적이다.



2. 프래그먼트 수명주기

프래그먼트에도 액티비티처럼 수명주기(Life Cycle)가 있다.

프래그먼트 매니저에 의해 add(), replace() 되는 시점에 프래그먼트의 수명주기가 시작된다.


프래그먼트는 액티비티와 달리 onAttach와 onDetach 메소드가 있다.

프래그먼트는 액티비티 위에 올라갔을 때 프래그먼트로 동작할 수 있기 때문에 

액티비티 위에 올라갈 때 onAttach, 액티비티에서 내려올 때 onDetach 메소드를 자동으로 호출해줌으로써 

그 시점을 알 수 있도록 해준다.



액티비티 위에 올라가고(OnAttach), 초기화한 다음(OnCreate), 객체가 인플레이션된다(OnCreateView).



3. 실행 결과 화면

    



4.  activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?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:orientation="vertical"
    android:padding="10dp"
    android:gravity="center">
 
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       android:layout_marginTop="50dp"
       android:layout_marginBottom="30dp"
       android:gravity="center">
 
      <Button
          android:id="@+id/button1"
          android:layout_width="150dp"
          android:layout_height="wrap_content"
          android:text="프래그먼트1"/>
 
      <Button
          android:id="@+id/button2"
          android:layout_width="150dp"
          android:layout_height="wrap_content"
          android:text="프래그먼트2" />
   </LinearLayout>
 
   <FrameLayout
       android:id="@+id/frame_layout"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
      <!--<fragment
          android:id="@fragment1main"
          android:nacom.tistory.qlyh8.pracitice.FragmentActivity11vity"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>-->
   </FrameLayout>
 
</LinearLayout>
 
cs



5. MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.tistory.qlyh8.pracitice;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends AppCompatActivity {
 
    Button button1, button2;
    FragmentActivity1 frameLayout1;
    FragmentActivity2 frameLayout2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);
        frameLayout1 = new FragmentActivity1();
        frameLayout2 = new FragmentActivity2();
 
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 프래그먼트 매니저가 프래그먼트를 담당하며, 프래그먼트 매니저은 트랜잭션에 기반한다.
                // replace(): 기존에 있는게 있으면 대체한다.
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.frame_layout, frameLayout1).commit();
            }
        });
 
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.frame_layout, frameLayout2).commit();
            }
        });
    }
 
    // 인덱스를 통해 해당되는 프래그먼트를 띄운다.
    public void fragmentChange(int index){
        if(index == 1){
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.frame_layout, frameLayout1).commit();
        }
        else if(index == 2){
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.frame_layout, frameLayout2).commit();
        }
    }
}
cs



6. fragment1.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#aaaaad"
    android:padding="10dp"
    android:orientation="vertical">
 
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Fragment 1"
        android:textSize="30sp"
        android:textAlignment="center"/>
 
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:layout_gravity="center"
        android:textSize="16sp"
        android:text="프래그먼트 2 으로 화면 전환"/>
 
</LinearLayout>
 
cs



7. FragmentActivity1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.tistory.qlyh8.pracitice;
 
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
 
public class FragmentActivity1 extends Fragment {
 
    Button button;
    MainActivity mainActivity;
 
    // 메인 액티비티 위에 올린다.
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mainActivity = (MainActivity) getActivity();
    }
 
    // 메인 액티비티에서 내려온다.
    @Override
    public void onDetach() {
        super.onDetach();
        mainActivity = null;
    }
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment1, container, false);
 
        button = rootView.findViewById(R.id.button);
        // 프래그먼트 1에서 프래그먼트 2를 띄운다.
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mainActivity.fragmentChange(2);
            }
        });
 
        return rootView;
    }
}
 
cs



8. fragment2.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#aaddad"
    android:padding="10dp">
 
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Fragment 2"
        android:textSize="30sp"
        android:textAlignment="center"/>
 
</LinearLayout>
 
cs



9. FragmentActivity2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.tistory.qlyh8.pracitice;
 
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
 
public class FragmentActivity2 extends Fragment {
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment2, container, false);
        return rootView;
    }
}
 
cs



참고

- Fragment 개념 및 예제

http://webnautes.tistory.com/1089


- Frament Lifecycle

http://www.kmshack.kr/2013/02/fragment-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-2-fragment-lifecycle%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0/


- 프래그먼트: 안드로이드 모든 문제의 해결책이자 원인

https://academy.realm.io/kr/posts/michael-yotive-state-of-fragments-2017/





출처: https://www.edwith.org/boostcourse-android/lecture/17074/



+ Recent posts