이전 글(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();
처음엔 책에 나온대로 주석처럼 작성했는데, 나는 바꿔서 작성했다.
왜냐하면 책에서 작성한 방법대로 하면 메인 프래그먼트 -> 메뉴 프래그먼트로 이동은 되는데, 그 다음에 메뉴 프래그먼트의 버튼을 눌러서 다시 메인 프래그먼트로 이동이 되지 않았다.
왜 책대로 하면 이동이 거기서 끝나버리냐면...
액티비티에 추가한 프래그먼트를 아예 MainFragment의 자리로 설정해놔서 그런 것 같다. (아마도?)
그래서 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를 띄운다.
시작과 실행.. 좀 헷갈리지만 그렇구나.
<참고한 글>
'TIL > 안드로이드 스튜디오' 카테고리의 다른 글
5장 - 액션바 사용하기 (0) | 2024.12.19 |
---|---|
5장 - 프래그먼트 수명주기 & 분할화면 만들기 (0) | 2024.12.16 |
5장 - Fragment : 액티비티에 프래그먼트 추가하기 (0) | 2024.12.16 |
패키지명 변경하기 (0) | 2024.12.16 |
도전!8 - 세 개 이상의 화면 만들어 전환하기 (0) | 2024.12.13 |