ANDROID/Android 앱 프로그래밍
[Android] 프래그먼트(Fragment)
주 녕
2021. 5. 31. 23:17
반응형
모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다.
프래그먼트(Fragment)
🤷♀️ 리니어 레이아웃 안에 다른 레이아웃을 추가하거나 각각의 레이아웃 안에 필요한 뷰를 넣어 화면을 구성하는 방법은?
😩 여러 개의 레이아웃을 넣어 중첩시킨 후 가시성 속성으로 필요한 레이아웃만 보이게 하는 방식으로 구현..
각각의 레이아웃이 동시에 보이는 상태인지 아닌지에 대한 정보 등 코드가 많이 복잡해짐
🙋♀️ 하나의 액티비티에 여러 개의 부분 화면을 올려주는 방법?
🤨 Activity 클래스와 ActivityGroup 클래스를 사용하면 구현이 가능함.
- 하지만 액티비티는 하나의 화면을 독립적으로 구성할 때 필요한 여러 가지 속성들을 사용하게 되고,
- 안드로이드 시스템에서 관리하는 앱 구성 요소이기 때문에
- 액티비티 안에 다른 액티비티를 넣는 것은 단말의 리소스를 많이 사용하는 비효율적인 방법
💡 하나의 화면을 여러 부분으로 나눠서 보여주거나 각각의 부분 화면 단위로 바꿔서 보여주고 싶을 때 사용하는 프래그먼트!
→ 하나의 레이아웃처럼 보이지만 액티비티처럼 독립적으로 동작하는 부분 화면임
- 분할된 화면들을 독립적으로 구성하기 위해 사용
- 분할된 화면들의 상태를 관리하기 위해 사용
프래그먼트의 작동 방식
프래그먼트는 항상 액티비티 위에 올라가 있어야 함
액티비티의 각각의 부분 화면을 프래그먼트로 만들고 그 프래그먼트를 독립적으로 관리하는 것이 목표
→ 프래그먼트가 제대로 동작하는 시점은 프래그먼트가 액티비티에 올라가는 시점 (메모리에 만들어진 시점X)
[액티비티]
- 액티비티는 앱 구성 요소이므로 안드로이드 시스템에서 관리함
- 액티비티 매니저가 액티비티의 동작 순서나 처리 방식을 결정
- 시스팀이 이해하는 형식으로 명령이나 데이터를 만들어 보냄 → 인텐트(Intent)
- 액티비티 메니정 의해 액티비티가 독립적으로 동작할 수 있음
[프래그먼트]
- 액티비티가 동작하는 방식을 본떠 만들었음
- 프래그먼트 매니저가 프래그먼트를 관리함
- 액티비티가 시스템의 역할을 하게 되므로 액티비티 위에 올라가 있지 않은 프래그먼트는 정상동작X
- 인텐트는 시스템에서 이해하는 객체이므로 프래그먼트와 액티비티 사이에서 전달하는 것은 바람직X → 메서드를 만들고 호출하는 방식
- 시스템에서 관리하는 것이 아니므로 액티비티를 전환하지 않아도 훨씬 가볍게 화면 전환 효과를 만들 수 있음
프래그먼트 화면에 추가하기
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
* Use the {@link MainFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class MainFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public MainFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment MainFragment.
*/
// TODO: Rename and change types and number of parameters
public static MainFragment newInstance(String param1, String param2) {
MainFragment fragment = new MainFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_main, container, false);
}
}
처음 프래그먼트를 생성하면 이러한 클래스가 생성됨 → XML 레이아웃과 소스파일을 매칭하는 과정
💡 setContentView() 대신 onCreateView()가 있는 것을 볼 수 있음
- 인플레이션 객체인 LayoutInflater를 사용해 인플레이션을 진행해야 함
- XML 레이아웃 파일의 내용을 인플레이션한 후 클래스에서 사용하는 코드는 onCreateView()에 들어가는 것임
- 콜백 메서드로 인플레이션이 필요한 시점에 자동으로 호출됨
- 이 메서드 안에서 inflate() 메서드를 호출하면 되고, 인플레이션이 끝나면 프래그먼트가 하나의 뷰처럼 동작할 수 있게 됨
💡 코드에서 프래그먼트를 추가하고 싶다면 프래그먼트 매니저(FragmentManager) 클래스를 사용해야 함
- FragmentManager 객체는 액티비티에 프래그먼트 객체를 추가(add), 교체(replace), 삭제(remove)할 때 주로 사용함
- getSupportFragmentManager() 메서드를 호출하면 참조할 수 있음
- getFragmentManager()과 같은 기능을 하는 메서드로 예전 버전까지 호환되도록 만들기 위해 getSupportFragmentManager() 메서드를 사용하는 것을 권장함
- 액티비티에 id 속성(R.id.container)을 추가하고 그 안에 <fragment> 태그를 추가함
- 프래그먼트는 뷰와 달라서 뷰를 담고 있는 공간만 확보
- 태그 이름으로 프래그먼트의 이름을 사용할 수 없고, name 속성에 패키지 이름을 포함한 MainFragment의 이름을 설정함
반응형