듀다의 성장개발로그

[부스트코스] 안드로이드 프로그래밍 16 - 프래그먼트 만들기 본문

안드로이드/부스트코스

[부스트코스] 안드로이드 프로그래밍 16 - 프래그먼트 만들기

du-da 2020. 2. 28. 23:24

안녕하세요. 오늘은 프래그먼트 만들기에 대해서 이야기해보도록 하겠습니다.

프래그먼트란 하나의 화면에 여러 부분화면이 들어가 있는 것입니다.

각각의 부분화면은 부분화면이지만 독립적인 화면입니다.

독립적인 화면이라는 점에서 액티비티와 유사하게 느껴질 있습니다. 실제로 액티비티와 공통점을 갖는, 비슷한 용도를 가진 기능입니다.

액티비티가 액티비티 매니저에 요청해서 다른 액티비티를 띄우듯, 프래그먼트도 다른 프래그먼트를 직접 띄울 수 없고, 프래그먼트 매니저에 필요한 기능을 요청해야 합니다. 또, 프래그먼트도 하나의 레이아웃과 하나의 소스 파일로 이루어져 있다는 것도 액티비티와의 공통점입니다.

액티비티를 이용해서 만들어진 화면과의 차이점도 존재합니다.

프래그먼트는 하나의 액티비티 안에서 존재하므로 인텐트를 사용할 수 없습니다. 메소드를 대신 사용합니다. 

또한 하나의 액티비티 위에서 돌아가므로, 기능을 수행하기 위해 시스템에 요청할 필요가 없습니다.

이 점 때문에 시스템 리소스 사용 면에서, 액티비티로 구성된 화면보다 좀 더 효율적인 모습을 보이기도 합니다. 

 

프래그먼트를 만드는 방법에는 두 가지가 존재합니다.

우선 프래그먼트를 구성할 레이아웃 파일과 소스 파일을 생성해야 합니다.

 

new - Layout resource file를 선택하여 레이아웃 파일을 만듭니다.

 

그리고 new - Java Class를 선택하여 자바 소스 파일을 만듭니다.

주의할 점은 반드시 Fragment를 부모 클래스로 지정하여야 한다는 점입니다.

androidx.fragment.app의 Fragment를 부모 클래스로 설정합니다.

 

새 프래그먼트의 레이아웃을 자유롭게 구성합니다. 저는 텍스트뷰, 버튼, 빈 이미지뷰를 넣었습니다.

 

소스파일에서는 인플레이션을 해주어야 합니다.

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.new_fragment, container);

        return rootView;
    }

 

이제 메인 액티비티에 프래그먼트를 부착시켜야 합니다.

메인 액티비티에 부착하는 방법은 두 가지가 있습니다.

첫번째는 레이아웃 파일에서 붙이는 방법입니다.

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.yourfragment.Fragment_new"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

레이아웃 파일의 텍스트 탭에서 fragment를 선언하고, 아이디와 대상 소스파일을 설정하면 지정된 영역에 프래그먼트가 부착됩니다.

 

프래그먼트에 접근하려면 메인 액티비티에서 프래그먼트 매니저를 호출해야 합니다.

FragmentManager 변수를 선언하고 getSupportFragmentManager() 메소드로 프래그먼트 매니져를 불러옵니다.

그리고 메인 액티비티에 있는 프래그먼트를 findViewByid로 찾으면, 프래그먼트 매니저를 통해 접근이 가능합니다.

public class MainActivity extends AppCompatActivity {
    Fragment_new fragment_new;
    FragmentManager manager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        manager = getSupportFragmentManager();
        fragment_new = (Fragment_new) manager.findFragmentById(R.id.fragment1);

    }

}

프래그먼트를 부착하는 또 다른 방법은 자바 소스파일에서 수행하는 방법입니다.

프래그먼트가 부착될 컨테이너를 먼저 만들어놓아야 사용할 수 있는 방법인데요,

소스 코드 상에서 ragmentManager의 replace 메소드를 즉시 호출하는 방법입니다.

이 예제에서 사용된 Fragment 형식의 변수를 만들어놓고, 그 변수와 컨테이너를 replace 메소드의 인자로 사용합니다.

getSupportFragmentManager().beginTransaction().add(R.id.container, fragment_new).commit();