티스토리 뷰

# 프래그먼트

하나의 화면을 여러 부분으로 나눠거 보여주거나 각각의 부분 화면 단위로 바꿔서 보여주고 싶을 때 사용하는 것

- 프래그먼트는 항상 액티비티 위에 올라가 있어야 함(프래그먼트가 제대로 동작하는 시점은 메모리에 만들어진 시점이 아니라 액티비티에 올라가는 시점)

- 프래그먼트도 'xml레이아웃 파일 + java소스 파일'로 이루어짐(부분화면과 유사)

//MainFragment.java
public class MainFragment extends Fragment { //Fragment를 상속함. (DialogFragment, ListFragment도 상속 가능)

    @Override
    //xml 인플레이션을 위해 setContentView() 대신 onCreateView() 사용!
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                                                         Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_main, container, false); //xml파일과 연동 + 인플레이션;
    }
}

 

 

# 프래그먼트 사용 방법

1) 프래그먼트를 위한 XML 레이아웃 만들기

2) 프래그먼트 클래스(JAVA) 만들기

3) 프래그먼트를 xml 레이아웃에 추가하기

- (1) xml 레이아웃에 태그로 추가

<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    	
        <!-- 프래그먼트는 뷰와 달라서 뷰를 담고 있는 공간만 확보 (태그이름으로 프래그먼트 이름 X) -->
        <fragment
            android:id="@+id/mainFragment"
            android:name="com.example.fragment.MainFragment" //패키지 이름을 포함한 프래그먼트 이름
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        
    </FrameLayout>

</LinearLayout>

- (2) 자바 소스 코드로 추가

// MainFragment 안에 버튼을 누르면 MenuFragment로 전환.
// MainFragment.java
public class MainFragment extends Fragment {
    MainActivity activity;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
		MainActivity activity = (MainActivity) getActivity();
                activity.onFragmentChange(1); //프래그먼트 사이의 데이터 전달 함수는 MainActivity.java에 정의
            }
        });

        return rootView;
    }
}

'
- getActivity() : 이 프래그먼트를 포함하는 액티비티를 리턴.
- getFragmentManager() : 이 프래그먼트를 포함하는 액티비티의 프래그먼트 매니저를 리턴.
- getParentFragment() : 이 프래그먼트를 포함하는 부모자 프래그먼트일 경우 리턴, 액티비티면 null
- getId() : 이 프래그먼트의 ID 리턴.
'
// MainActivity.java (여기선, 프래그먼트가 들어갈 액티비티)
public class MainActivity extends AppCompatActivity {
    MainFragment fragment1;
    MenuFragment fragment2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragment1 = (MainFragment) getSupportFragmentManager().findeFragmentById(R.id.mainFragment); //이미 xml에 있는 프래그먼트 이므로
        fragment2 = new MenuFragment();

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment1).commit();
            }
        });

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment2).commit();
            }
        });
    }

    //프래그먼트를 전환하는 함수(프래그먼트끼리 소통할 때 사용)
    public void onFragmentChange(int index) {
        if(index == 0) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment1).commit();
        } else if(index == 1) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment2).commit();
        }
    }
}

'
- getFragmentManager() 메소드를 통해 프래그먼트 매니저 객체 참조.
- findViewById() 대신 findFragmentById() 사용.(프래그먼트는 뷰가 아님)
- onFragmentChange() 를 통해 프래그먼트에서 호출할 수 있도록 정의.
- add(), replace(), remove() 할 때, 오류가 생기면 다시 원상태로 돌릴 수 있어야 하므로 beginTransaction()으로 트랜잭션 객체 호출 -> commit()으로 실행!

- findFragmentByTag() : 태그 정보를 사용해 프래그먼트 객체를 찾음.
- executePendingTransaction() : 트랜젝션은 commit() 메소드를 호출하면 실행되지만 비동기 방식으로 실행되므로 즉시 실행하고 싶다면 이 메소드를 추가로 호출.
'

 

# 프래그먼트 사용 목적

✔ 분할된 화면들을 독립적으로 구성하기 위해 사용(코드 복잡성↓)

✔ 분할된 화면들의 상태를 관리하기 위해 사용

 

 

# 프래그먼트 VS 액티비티

액티비티는 안드로이드 시스템(액티비티 매니저)에 의해 관리되며 인텐트로 데이터를 전달,

프래그먼트는 액티비티(프래그먼트 매니저)에 의해 관리되며 메소드로 데이터를 전달

 

 

# 프래그먼트의 특성

- 뷰 특성 : 뷰그룹에 추가되거나 레이아웃의 일부가 될 수 있음(뷰에서 상속X, 뷰를 담고 있는 틀)

- 액티비티 특성 : 액티비티처럼 수명주기(Lifecycle)를 가지고 있음

 

 

#프래그먼트 수명주기 메소드?

'화면에 보이기 전에 호출'
onAttach(Activity); //프래그먼트가 액티비티와 연결될 때
onCreate(Bundle); //프래그먼트가 초기화될 때
onCreateView(LayoutInflator, ViewGroup, Bundle); //프래그먼트와 관련되는 뷰 계층을 만들어 리턴
onActivityCreated(Bundle); //프래그먼트와 연결된 액티비티가 onCreate() 메소드 작업을 완료했을 때
onStart(); //프래그먼트와 연결된 액티비티가 onStart()되어 사용자에게 프래그먼트가 보일 때
onResume(); //프래그먼트와 연결된 액티비티가 onResume()되어 사용자와 상호작용할 수 있을 때

'중지되면서 호출'
onPause(); //프래그먼트와 연결된 액티비티가 onPause()되어 사용자와 상호작용을 중지할 때
onStop(); //프래그먼트와 연결된 액티비티가 onStop()되어 화면에서 더 이상 보이지 않을 때 or 프래그먼트의 기능이 중지되었을 때
onDestroyView(); //프래그먼트와 관련된 뷰 리소스를 해체할 수 있도록 호출
onDestroy(); //프래그먼트의 상태를 마지막으로 정리할 수 있도록 호출
onDetach(); //프래그먼트가 액티비티와 연결을 끊기 바로 전에 호출

 


출처

Do it! 안드로이드 앱 프로그래밍(개정8판)

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함