
앱에서는 한 화면에 여러 부분 화면을 넣는 경우가 많다. ( 레이아웃 안에 레이아웃 안에 레이아웃안에... )
이때의 부분 화면을 레이아웃을 넣어서 만드는 것이 아닌 프래그먼트(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는 지금 당장올리지 않는다는 뜻이다.
fragment 태그를 추가한 것을 볼 수 있다.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();
}
}
}