여러 화면을 구성할 때는 보통 각각의 화면을 액티비티로 만든 후 액티비티를 전환하는 방법을 사용한다.
그런데 화면의 일부분을 다른 화면으로 구성하고 싶을 때는 어떻게 해야할까. 한 레이아웃이 여러 화며에서 사용할 때는 어떻게 할까.
한 레이아웃 안에 다른 레아이웃을 추가하거나 각각의 레이아웃에 필요한 뷰를 넣어 화면을 만드는 방법은 코드가 복잡해진다. 하나의 액티비티 안에 여러 개의 액티비티를 부분 화면으로 올려서 보여주는 방법은 단말의 리소스랄 많이 사용하는 비효율적인 방법이다.
같은 레이아웃을 여러 화면에 사용하는 화면 구성은 코드가 중복되는 문제가 있다.
이렇게 화면 안에 들어가는 레이아웃이 중복되는 문제를 해결하기 위해 부분 화면을 위한 레이아웃이나 소스 코드를 한 번만 정의하고 재사용할 수 있도록 만든 것이 프래그먼트(Fragment)이다.
또한 하나의 화면을 여러 부분으로 나눠서 보여주거나 각각의 부분 화면 단위로 바꿔서 보여주고 싶을 때 사용된다.
즉 프래그먼트는
만들어졌으며 사용된다.
프래그먼트는 하나의 화면을 독립적으로 다루는 액티비티와 유사한 방식으로 만들어졌다.
액티비티는 안드로이드 시스템에서 관리하는 액티비티 매니저에 의해서 관리된다.
프래그먼트는 액티비티에서 관리하는 프래그먼트 매이저에 의해서 관리된다.
액티비티간에 데이터를 전달할 때는 인텐트를 사용한다.
프래그먼트에선 인텐트를 사용할 수 없기에 단순히 메소드를 사용한다.
앞에서 말했듯이 프래그먼트는 액티비티와 유사한 방식으로 만들어졌다.
그렇기에 프래그먼트도 액티비티처럼 XML 레이아웃과 자바 소스 파일로 동작한다.
하지만 프래그먼트는 액티비티에서의 setContentView 메소드가 없다.
그러므로 인플레이션 객체인 LayoutInflater를 사용해 XML 레이아웃을 인플레이션 한다.
public class MainFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
}
inflate 메소드로 전달되는 첫 번째 파라미터는 XML 레이아웃 파일이고,
두 번째 파라미터는 XML 레이아웃이 설정될 뷰 그룹 객체이다.
프래그먼트를 액티비티에 추가하는 방법은 두 가지 있다.
하나는 액티비티의 XML 레이아웃에 태그로 추가하는 방법이고,
다른 하나는 액티비티의 소스 코드에서 추가하는 방법이다.
여기에선 태그로 추가하는 방법을 사용해보았다.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<fragment
android:id="@+id/mainFragment"
android:name="org.techtown.samplefragment.MainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
최상위 레이아웃 안에 < fragment > 태그를 추가하였다.
이 태그의 name 속성에 사용할 fragment의 이름을 패키지 이름을 포함한 이름으로 설정한다.
아니면 디자인 화면의 팔레트에서 FragmentContainerView 를 화면에 추가하며 여기서 원하는 프래그먼트를 지정하는 방법도 있다.
이것으로 프래그먼트가 액티비티 화면 위에 보이게 된다.