앱에서는 한 화면에 여러 부분 화면을 넣는 경우가 많다. ( 레이아웃 안에 레이아웃 안에 레이아웃안에... )
이때의 부분 화면을 레이아웃을 넣어서 만드는 것이 아닌 프래그먼트(Fragement) 를 넣어서 만들수 있다!
어떤 차이?
fragment로 만들면, 한번 만들고 나서 재사용이 가능하다.
fragment는 activity를 본떠서 만들었다. (재사용 하기 위해)
--> fragment는 activity의 특성과 layout의 특성을 둘 다 가지고 있다고 볼 수 있다.
만약 한 fragment가 activity 전체를 덮게 만들면 (activity는 바뀌지 않고) 화면 전환하는 것 같은 효과를 준다.
fragment는 activity 위에 올려야 동작한다. 이는 xml 또는 자바코드에서 설정 가능하다.
fragment에는 setContextView() 메서드가 없기 때문에, LayoutInflater을 사용해 인플레이션을 해야한다. 이는 onCreateView() 메서드에서 사용할 수 있다.
이제 fragement를 올리는 방법 2가지를 알아보자
MainFragment를 만든다.
fragment 자바 코드를 작성한다.
다음은 MainFragment.java 소스코드이다.
public class MainFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
// fragment_main.xml 파일을 메모리에 올려서 소스코드와 레이아웃을 연결하는 역할
}
}
위에서 말했듯이, Fragment에는 setContextView() 메서드가 없기 때문에 inflater를 이용한다. fragment_main.xml을 container에 올린다는 것이고 false는 지금 당장올리지 않는다는 뜻이다.
MenuFragment를 만든다. app에 바로 추가하지 않고, xml파일과 java파일을 만든다.
위와 같이 fragment 자바 코드를 작성한다.
다음은 MenuFragment.java 소스코드이다.
public class MenuFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_menu, container, false);
} //fragment_menu.xml 파일을 메모리에 올려서 소스코드와 레이아웃을 연결하는 역할
}
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);
// 프래그먼트에서 버튼 찾는거 같은거 하려면 ViewGroup 이용해야한다. 바로 못함!
Button button = rootView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//fragment 바꾸는 거는 activity에서 해야한다.
MainActivity activity = (MainActivity) getActivity();
activity.onFragmentChanged(1);
}
});
return rootView;
}
}
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.mainFragment);
menuFragment = new MenuFragment();
}
public void onFragmentChanged(int index) {
if (index == 0){
getSupportFragmentManager().beginTransaction().replace(R.id.container, mainFragment).commit();
} else if(index == 1){
getSupportFragmentManager().beginTransaction().replace(R.id.container, menuFragment).commit();
}
}
}