반응형

액티비티로 만들어진 화면은 시스템에서 관리합니다.

따라서 액티비티의 내부에는 속성이나 메소드의 수가 상당히 많습니다.

한 마디로 무거운 거죠.

그래서 액티비티 안에 액티비티를 부분 화면으로 올리는 것은 권장하지 않습니다.

그렇다면 레이아웃 안에 레이아웃을 넣는 방법으로 화면을 만드는 것만 가능할까요?

그렇다면 여러 개의 액티비티 안에 동일한 레이아웃이 부분적으로 추가되어야 하는 경우에는 매번 레이아웃을 복사해서 넣어야 합니다.

이런 경우 프래그먼트를 만들면 재사용이 쉬워집니다.

프래그먼트가 어떤 것이길래 재사용이 쉬워지는 것인지 알아봅시다.




프래그먼트

액티비티로 만든 화면 안에 부분 화면을 만들고 싶은 경우에는 레이아웃 안에 레이아웃을 넣으면 됩니다.

예를 들어, 화면의 왼쪽과 오른쪽에 각각 다른 내용을 보여주고 싶다면 가로 방향의 LinearLayout 안에 두 개의 LinearLayout을 layout_weight로 공간분할하여 넣을 수 있습니다.

그런데 그 중 왼쪽에 있는 LinearLayout을 다른 액티비티에서도 사용하고 싶다면 XML 레이아웃에 들어있는 태그와 소스 파일의 코드를 그대로 복사하여 다른 액티비티를 위한 파일에 붙여넣기하는 과정을 거쳐야 합니다.

이런 경우 부분화면을 독립적으로 사용할 수 있는 방법이 프래그먼트입니다.

프래그먼트는 액티비티를 본 떠 만든 것이라 액티비티가 동작하는 방식과 아주 유사합니다.

액티비티 위에 올라가도록 만들었기 때문에 액티비티가 시스템 역할을 하게 되고 액티비티보다 훨씬 가볍게 화면 구성을 할 수 있다는 장점이 있습니다.

또한 프래그먼트를 위한 XML 레이아웃과 프래그먼트를 위한 소스 파일이 한 쌍으로 만들어지고 이 프래그먼트 객체를 필요할 때 액티비티에 사용할 수 있기 때문에 독립적으로 사용할 수 있게 됩니다.

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

즉, 상태에 따라 자동으로 호출되는 수명주기 메소드가 있습니다.

대부분의 수명주기 메소드는 액티비티와 유사합니다.

프래그먼트가 메모리에 초기화되거나 화면에 보이기 전 또는 후에 호출되는 메소드, 그리고 메모리에서 없어질 때 호출되는 메소드 등이 있는 거죠.

하지만 크게 다른 점은 onAttach와 onDetach 메소드가 있다는 점입니다.

프래그먼트는 액티비티 위에 올라갔을 때 비로소 프래그먼트로서 동작할 수 있기 때문에 액티비티 위에 올라갈 때 onAttach, 액티비티에서 내려올 때 onDetach 메소드를 자동으로 호출해줌으로써 그 시점을 알 수 있도록 해 줍니다.

액티비티를 본 떠 만든 프래그먼트

프래그먼트는 부분 화면이지만 하나의 프래그먼트를 화면 전체에 꽉 차도록 만들면 프래그먼트가 전체 화면처럼 보이게 됩니다.

그리고 화면을 꽉 채우는 프래그먼트를 다른 프래그먼트로 바꾸어주면 사용자는 액티비티 간에 전환되는 것과 똑같이 느끼게 됩니다.

액티비티는 그대로 유지되는 상태에서 프래그먼트만 전환되니까 시스템이 직접 관리하지 않아 가볍게 전환시킬 수 있습니다.

하나의 액티비티 안에서 프래그먼트만 전환하기

프래그먼트를 화면에 추가하는 방법

프래그먼트도 부분화면이기 때문에 하나의 XML 레이아웃 파일과 하나의 소스 파일로 정의할 수 있습니다.

XML 레이아웃 파일을 만들고 그 파일을 소스 파일에 설정하려면 프래그먼트 안에 있는 onCreateView 메소드 안에서 레이아웃 인플레이터를 이용해 인플레이션을 진행합니다.

public class MainFragment extends Fragment {
   @Nullable
   @Override
   public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,

   @Nullable Bundle savedInstanceState) {
      ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main,

      container, false);
      return rootView;
   }
}

onCreateView 메소드는 자동으로 호출되는 메소드이며 파라미터로 LayoutInflater 객체를 전달해줍니다.

따라서 이 객체의 inflate 메소드를 이용해 인플레이션을 진행할 수 있습니다.

프래그먼트를 만들었다면 액티비티의 XML 레이아웃에 추가할 수 있습니다.

태그는 <fragment>를 사용하며 프래그먼트 클래스를 지정할 때는 name 속성을 사용합니다.

프래그먼트를 만들어 액티비티의 XML 레이아웃에 추가하는 과정

만약 소스 코드에서 프래그먼트를 추가하고 싶다면 프래그먼트 매니저를 사용해야 합니다.

프래그먼트는 프래그먼트 매니저가 관리하기 때문에 프래그먼트 매니저를 통해 화면에 추가하거나 다른 프래그먼트로 교체하거나 하는 일을 할 수 있습니다.

프래그먼트 매니저는 getSupportFragmentManager 메소드를 호출하면 참조할 수 있고 XML 레이아웃에 추가된 프래그먼트는 findFragmentById 메소드를 호출하여 찾아낼 수 있습니다.

프래그먼트도 수명주기 메소드가 있으며 프래그먼트의 상태에 따라 자동으로 호출됩니다.

그 중에서 onAttach 메소드와 onDetach 메소드는 프래그먼트가 액티비티 위에 올라갈 때 호출되며 매우 중요합니다.

왜냐하면 프래그먼트는 액티비티 위에 올라가 있을 때만 프래그먼트로서 동작할 수 있기 때문입니다.

프래그먼트에서 액티비티의 메소드를 호출하거나 액티비티에서 프래그먼트의 메소드를 호출하면 프래그먼트와 액티비티 간에 필요한 데이터를 전달하거나 필요한 기능을 수행하도록 할 수 있습니다.

이렇게 메소드 호출 방식을 이용하는 이유는 액티비티 간에 데이터를 전달할 때 인텐트를 사용하는 것처럼 프래그먼트에서도 인텐트를 사용할 수는 없기 때문입니다.

액티비티가 시스템 역할을 하긴 하지만 인텐트를 이해하도록 만들어지지는 않은 것이죠.

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


반응형

'안드로이드 개발 > 부스트코스(안드로이드 프로그래밍)' 카테고리의 다른 글

액션바 구성하기  (0) 2019.03.13
프래그먼트로 이미지뷰어 만들기  (0) 2019.03.13
위험권한 부여하기  (0) 2019.03.12
브로드캐스트  (0) 2019.03.10
서비스  (0) 2019.03.10
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기