[Android-java] MVVM Activity 안에 Fragment 넣기 (+ 버튼 적용)
아래와 같이 Activity 안에서 Radio Button에 따라 Fragment 표기를 해보자.
(이 포스팅은 Activity 내 Fragment를 구성한다. Fragment 내 Fragment를 구성할 경우 다음 포스팅 참조)
1. 먼저 Activity와 Fragment를 생성해 준다.
MVVM 패턴을 적용하기 위해 Fragment (with ViewModel)을 선택한다.
2. xml을 간단히 작성한다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="activity_main 입니다." />
<RadioGroup
android:id="@+id/radio_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center">
<RadioButton
android:id="@+id/first_radio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="fragment_first 띄우기"/>
<RadioButton
android:id="@+id/second_radio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="fragment_second 띄우기"/>
</RadioGroup>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/parent_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
** 주의 **
FragmentContainerView에 layout이나 name을 지정하지 않는다.
왜냐면 radio button에 따라 유동적으로 변할 값이니까.
지정하지 않을 경우 경고가 뜰 수 있는데, 경고 무시하기 클릭하면 된다.
fragment_first.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="fragment_first 입니다."
android:textSize="30sp"
android:gravity="center"
android:background="#4b44"/>
</FrameLayout>
fragment_second.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="fragment_second 입니다."
android:textSize="30sp"
android:gravity="center"
android:background="#4fe0"/>
</FrameLayout>
3. MainActivity.java를 작성한다.
// import는 생략
public class MainActivity extends AppCompatActivity {
FirstFragment firstFragment = new FirstFragment();
SecondFragment secondFragment = new SecondFragment();
RadioGroup radioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
radioGroup = findViewById(R.id.radio_group);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
changeParentFragment(checkedId);
}
});
}
public void changeParentFragment(int checkedId) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (checkedId == R.id.first_radio) ft.replace(R.id.parent_fragment, firstFragment);
else ft.replace(R.id.parent_fragment, secondFragment);
ft.commit();
}
}
radioGroup에 온체크 리스너를 달아준다.
check 된 radio button이 바뀌면 changeParentFragment를 부른다.
(Fragment 안에 Fragment를 넣은 포스팅도 할 예정이라 네이밍을 Parent로 했다.)
checkedId를 인자로 갖고 있고, 이 id는 first_radio 또는 second_radio이다.
Fragment를 관리해 주는 매니저를 getSupportFragmentManager()로 불러온다.
(주의 : Fragment 내에서 Fragement를 불러올 경우, getChildFragmentManager()를 사용해야 한다.)
해당 매니저에 beginTransaction()을 걸고,
radio 값에 따라 Activity 내에 위치한 FragmentContainerView에 원하는 Fragement를 replace 한다.
(replace 대신 add도 가능하나, add는 중복이 될 경우 에러가 발생하므로, 해당 fragment를 remove 후 add 해야 한다.)
그리고 commit을 하면 적용이 된다.