Programming/Android

[Android-java] MVVM Activity 안에 Fragment 넣기 (+ 버튼 적용)

IN.0 2023. 2. 15. 21:50
728x90
반응형

아래와 같이 Activity 안에서 Radio Button에 따라 Fragment 표기를 해보자.

(이 포스팅은 Activity 내 Fragment를 구성한다. Fragment 내 Fragment를 구성할 경우 다음 포스팅 참조)

목표

 

1. 먼저 Activity와 Fragment를 생성해 준다.

MVVM 패턴을 적용하기 위해 Fragment (with ViewModel)을 선택한다.

ViewModel로 Fragment 추가하기
Activity 하나에 Fragment 두개 있는 상태

 

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을 하면 적용이 된다.

728x90
반응형