티스토리 뷰
# 프래그먼트
하나의 화면을 여러 부분으로 나눠거 보여주거나 각각의 부분 화면 단위로 바꿔서 보여주고 싶을 때 사용하는 것
- 프래그먼트는 항상 액티비티 위에 올라가 있어야 함(프래그먼트가 제대로 동작하는 시점은 메모리에 만들어진 시점이 아니라 액티비티에 올라가는 시점)
- 프래그먼트도 '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판)
'안드로이드 > 자바' 카테고리의 다른 글
[안드로이드] 상단탭과 하단탭 (0) | 2021.08.26 |
---|---|
[안드로이드] 액션바 (0) | 2021.08.23 |
[안드로이드] 인텐트 (0) | 2021.08.21 |
[안드로이드] 액티비티(화면전환, 플래그, 수명주기) (0) | 2021.08.17 |
[안드로이드] 레이아웃 인플레이션 (0) | 2021.08.15 |