ANDROID/Android 앱 프로그래밍

[Android] 프래그먼트(Fragment)

주 녕 2021. 5. 31. 23:17
728x90

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 

 

프래그먼트(Fragment)

🤷‍♀️ 리니어 레이아웃 안에 다른 레이아웃을 추가하거나 각각의 레이아웃 안에 필요한 뷰를 넣어 화면을 구성하는 방법은?

😩 여러 개의 레이아웃을 넣어 중첩시킨 후 가시성 속성으로 필요한 레이아웃만 보이게 하는 방식으로 구현..

       각각의 레이아웃이 동시에 보이는 상태인지 아닌지에 대한 정보 등 코드가 많이 복잡해짐

 

🙋‍♀️ 하나의 액티비티에 여러 개의 부분 화면을 올려주는 방법?

🤨 Activity 클래스와 ActivityGroup 클래스를 사용하면 구현이 가능함.

  • 하지만 액티비티는 하나의 화면을 독립적으로 구성할 때 필요한 여러 가지 속성들을 사용하게 되고,
  • 안드로이드 시스템에서 관리하는 앱 구성 요소이기 때문에
  • 액티비티 안에 다른 액티비티를 넣는 것은 단말의 리소스를 많이 사용하는 비효율적인 방법 

💡 하나의 화면을 여러 부분으로 나눠서 보여주거나 각각의 부분 화면 단위로 바꿔서 보여주고 싶을 때 사용하는 프래그먼트!

→ 하나의 레이아웃처럼 보이지만 액티비티처럼 독립적으로 동작하는 부분 화면임

  • 분할된 화면들을 독립적으로 구성하기 위해 사용
  • 분할된 화면들의 상태를 관리하기 위해 사용

 

프래그먼트의 작동 방식

프래그먼트는 항상 액티비티 위에 올라가 있어야 함

액티비티의 각각의 부분 화면을 프래그먼트로 만들고 그 프래그먼트를 독립적으로 관리하는 것이 목표

→ 프래그먼트가 제대로 동작하는 시점은 프래그먼트가 액티비티에 올라가는 시점 (메모리에 만들어진 시점X)

액티비티(Activity)와 프래그먼트(Fragment)

[액티비티]

  • 액티비티는 앱 구성 요소이므로 안드로이드 시스템에서 관리함
    • 액티비티 매니저가 액티비티의 동작 순서나 처리 방식을 결정
    • 시스팀이 이해하는 형식으로 명령이나 데이터를 만들어 보냄 → 인텐트(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() 메서드를 사용하는 것을 권장함

 

FragmentTestActivity와 MainFragment

  • 액티비티에 id 속성(R.id.container)을 추가하고 그 안에 <fragment> 태그를 추가함
    • 프래그먼트는 뷰와 달라서 뷰를 담고 있는 공간만 확보
    • 태그 이름으로 프래그먼트의 이름을 사용할 수 없고, name 속성에 패키지 이름을 포함한 MainFragment의 이름을 설정함

 

 

 

[Android] 인텐트(Intent)

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 인텐트(Intent) 앞에서 본 인텐트는 작업을 수행하기 위해 사용되는 명령 or 데이터를 전달하는 기능 → 인텐트를 만든

junyoung-developer.tistory.com

 

 

728x90