Activity 내에 있는 작은 단위의 모듈이 Fragment입니다.
Activity에 해당하는 xml에 <fragment/> 혹은 <frameLayout/>를 추가합니다.
<fragment/>는 하나의 Fragment만 만들기 위해 생성하는 것이고,
<frameLayout/>은 프래그먼트를 교체(FragmentB를 FragmentC로)하기 위해서 필요한 레이아웃이에요.
<LinearLayout
.......
<fragment
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragmentA"
android:name="com.recipes4dev.examples.fragmentexample1.FragmentA"
android:layout_weight="1"
tools:layout="@layout/activity_main" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/fragmentBorC" />
.......
</LinearLayout>
(Fragment의 속성중 android:name은 ..?)
Activity의 xml을 작성했으니, FragmentA,FragmentB,FragmentC 각각의 xml(Fragment안에 들어갈 내용)을 작성해 주어야 합니다.
기본적인 Fragment의 xml은 특별히 추가할 내용은 없고 본인이 원하는대로 뷰(위젯)을 넣어주면 됩니다.
하지만 Fragment를 사용하기 위해서는 Fragment를 상속받은 클래스를 생성해야 합니다.
public class FragmentA extends Fragment {
public FragmentA() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_a, container, false);
}
}
onCreateView()부분을 보면 LayoutInflater inflater과 ViewGroup container를 매개변수로 이용하는 것을 알 수 있습니다.
return inflater.inflate를 통해 fragment xml 안에 배치해둔 뷰(위젯)을 사용하기 위해 fragment레이아웃을 활성화 합니다.
이제 Activity에서 필요한것은 FragmentManager와 Fragment클래스를 사용해야 합니다.
FragmentManager는 fragment에 어떤 이벤트나 액션을 발생시키는 역할을 하는 관리자이고,
Fragment는 앞서 만들어둔 fragmentA, fragmentB, fragmentC중 어떤것을 선택할지 결정하는 클래스입니다.
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.add(R.id.fragmentBorC, new FragmentB());
fragmentTransaction.commit();
FragmentManager는 Activity에서 getSupportFragmentManager()를 통해 할당받을 수 있으며,
FragmentManager에 속한 beginTransaction()을 곧바로 사용해도 되지만
위의 코드는 FragmentTransaction의 객체를 만들어 할당하는 방법을 사용했습니다.
fragmentTransaction.add(R.id.fragmentBorC, new FragmentB());
그리고 fragmentTransaction의 add함수를 이용해서, 상단에 만들어두었던 activity의 xml중 FrameLayout을 Activity의 ViewGroup에 추가해줍니다. R.id.fragmentBorC에 해당되는 FrameLayout에, FragmentB()인 Fragment를 생성해줍니다.
fragmentTransaction.commit();
FragmentTransaction의 commit()를 호출해서 Fragment작업이 마무리되었다는 것을 표시합니다.
그리고 추가적으로 Activity에서 fragmentB와 fragmentC를 교체하기 위한 코드를 작성해야 합니다.
Fragment클래스의 fr 객체를 만들어줍니다. FrameLayout의 fragmentB와 fragmentC를 fr객체에 담아 인스턴스화 할 계획이에요.
Fragment fr;
만약 참고(하단 url)한 블로그에서와 같이 fragment를 교체하는 함수를 따로 만들어줄 경우에는 아래 두줄을 다시 작성해줘야 합니다.
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
그리고 R.id.fragmentBorC에 해당되는 FrameLayout에, fr인 Fragment를 생성해줍니다.
여기서는 fr이 어떤 Fragment인지에 따라 다른데, 위에서 생성한 Fragment가 fragmentB였기때문에 fr은 fragmentC로 바뀌었습니다.
replace함수를 통해 교체해준 뒤, commit함수를 통해 Fragment작업이 종료되었다는 것을 알려줍니다.
fragmentTransaction.replace(R.id.fragmentBorC, fr);
fragmentTransaction.commit();
참고 블로그 :
다시 정리해봤을때 헷갈리는 부분은,
Fragment는 어디서 Activity와 연결되는걸까? 였는데, 되짚어보자면
xml에서
<fragment/>
<frameLayout/> 작성
그리고 FragmentA, FragmentB, FragmentC는 각각 클래스를 만들어서
inflater.inflate() 실행
그런데 여기서, 매개변수를 살펴보면
inflate(inflate할 xml, 뷰그룹(액티비티에 띄워지는 최상위 xml),false);
이렇게 된다.
즉 헷갈리는 부분에 대한 답은,
Fragment를 상속한 클래스 내부에서 inflate한다는 것으로 알 수 있습니다.
그리고 그것을 단순히 연결만 한다면 (FragmentA처럼 화면에 띄우기) inflate만 하면 되지만
연결하고나서 Activity에 Fragment를 교체할 목적이라면, (FragmentB와 FragmentC처럼 )
이것을 바꿔주는 함수가 필요하게 됩니다.
그러나,
FragmentB와 FragmentC를 단순히 활성화해준것 뿐이지, 실제로 작동하지는 않습니다.
뷰그룹에 추가해주어야 합니다.
FragmentTransaction -> add : FrameLayout에 Fragment를 할당
FragmentManager -> beginTransaction() : fragmentTransaction 생성
FragmentTransaction -> replace() : 교체
FragmentTransaction -> commit() : 완료
getActivity() : Fragment 가 얹어진 Activity 를 호출하는 것같다. . .
https://milkissboy.tistory.com/34
https://gist.github.com/hahaicanfly/04e6fc35a789bda85abce0fcfefcd403
https://ddunnimlabs.tistory.com/124
'해본것 > 안드로이드' 카테고리의 다른 글
Android API reference (0) | 2020.02.02 |
---|---|
Log작성 (0) | 2020.01.31 |
안드로이드 스튜디오 auto import (0) | 2020.01.30 |
안드로이드 스튜디오 단축키 (0) | 2020.01.28 |
안드로이드 recyclerView (0) | 2020.01.24 |