이전 글(https://sand-to-desert.tistory.com/81)에 이어서 프래그먼트의 기초에 대한 예제를 진행하겠다.

 

<버튼 클릭했을 때 코드에서 프래그먼트 추가하기>

저번에 만든 프로젝트를 이어서 사용한다.

 

1. 메인 프래그먼트의 XML, java 파일을 복사 붙여넣기 하여 새로운 프래그먼트인 메뉴 프래그먼트를 만든다.

 

2. 메뉴 프래그먼트의 화면을 설정해준다.

3. <MainFragment.java>

package org.techtown.fragment;

public class MainFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);

        Button button = rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainActivity activity = (MainActivity) getActivity();
                activity.onFragmentChanged(0);
            }
        });
        return rootView;
    }
}

onCreateView에서 코드를 수정, 추가한다.

ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);
Button button = rootView.findViewById(R.id.button);

메인 프래그먼트 안의 최상위 레이아웃은 rootView이다. rootView.findViewById를 통해 버튼을 설정한다.

public void onClick(View view) {
    MainActivity activity = (MainActivity) getActivity();
    activity.onFragmentChanged(0);
}

MainActivity 객체를 참조한 후, 그 액티비티에 있는 메서드인 onFragmentChanged를 사용한다.

(아직 MainActivity에 저 이름으로 메서드를 생성하지 않았기 때문에 빨간줄이 쳐진다.)

 

4. <MenuFragment.java>

package org.techtown.fragment;

public class MenuFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        ViewGroup sonView = (ViewGroup) inflater.inflate(R.layout.fragment_menu, container, false);

        Button button = sonView.findViewById(R.id.button); // sonView
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainActivity activity = (MainActivity) getActivity();
                activity.onFragmentChanged(1); // 1
            }
        });
        return sonView; // sonView
    }
}

inflate 메서드의 첫번째 파라미터에 fragment_menu를 넣어준다.

코드는 MenuActivity와 거의 같다.(다른 부분은 주석으로 표시해둠)

 

5. <MainActivity.java>

package org.techtown.fragment;

public class MainActivity extends AppCompatActivity {
    MainFragment mainFragment;
    MenuFragment menuFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.contianor);
        mainFragment = new MainFragment();
        menuFragment = new MenuFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.contianor, mainFragment).commit();
    }

    public void onFragmentChanged(int index){
        if(index==0)
            getSupportFragmentManager().beginTransaction().replace(R.id.contianor, menuFragment).commit();
        else if(index==1){
            menuFragment = (MenuFragment) getSupportFragmentManager().findFragmentById(R.id.contianor);
            getSupportFragmentManager().beginTransaction().replace(R.id.contianor, mainFragment).commit();
        }
    }
}

 

5 - (1) 프래그먼트 생성

//mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.contianor);
mainFragment = new MainFragment();
menuFragment = new MenuFragment();

처음엔 책에 나온대로 주석처럼 작성했는데, 나는 바꿔서 작성했다.

왜냐하면 책에서 작성한 방법대로 하면 메인 프래그먼트 -> 메뉴 프래그먼트로 이동은 되는데, 그 다음에 메뉴 프래그먼트의 버튼을 눌러서 다시 메인 프래그먼트로 이동이 되지 않았다.

 

왜 책대로 하면 이동이 거기서 끝나버리냐면...

처음에 작성한 activity_main.xml

액티비티에 추가한 프래그먼트를 아예 MainFragment의 자리로 설정해놔서 그런 것 같다. (아마도?)

수정한 activity_main.xml

그래서 name 설정해주는 코드를 주석처리해주었다.

(참고로 Palette에서 드래그하는 방식으로 프래그먼트를 추가했을 때, 자동으로 id가 fragmentContainorView로 설정되는데 직접 containor로 바꿔주었다.)

 

5 - (2) 액티비티에 프래그먼트 띄우기

getSupportFragmentManager().beginTransaction().replace(R.id.contianor, mainFragment).commit();

 

첫 화면은 메인 프래그먼트가 나타나도록 설정해줌.

 

5 - (3) onFragmentChanged 메서드 : 버튼을 누르면 화면 전환

public void onFragmentChanged(int index){
    if(index==0)
        getSupportFragmentManager().beginTransaction().replace(R.id.contianor, menuFragment).commit();
    else if(index==1){
        menuFragment = (MenuFragment) getSupportFragmentManager().findFragmentById(R.id.contianor);
        getSupportFragmentManager().beginTransaction().replace(R.id.contianor, mainFragment).commit();
    }
}

액티비티에 들어가는 프래그먼트에 사용되는 메서드.

인수가 0이면 메뉴 프래그먼트, 1이면 메인 프래그먼트로 전환한다.

 

6. <실행결과>

 

버튼을 누르면 화면전환이 된다.

 

<느낀 점>

프래그먼트를 띄우는 코드를 잘 기억해두자.

getSupportFragmentManager().beginTransaction().replace(R.id.contianor, Fragment).commit();

beginTransaction() : 트랜잭션 객체 시작

commit() : 트랜잭션 객체 실행

replace(R.id.c, F) : R.id.c 자리에 F를 띄운다.

 

시작과 실행.. 좀 헷갈리지만 그렇구나.

 

<참고한 글>

 

[Android] Fragment

위와 같이 frament 개수만큼 java 파일과 fragment 파일을 만들어줘야 된다. 1. 프래그먼트를 사용하면 재...

blog.naver.com