12 프래그먼트로 화면 만들기
저번 글에서는 하나의 액티비티에 하나의 프래그먼트가 들어가도록 만들었다면, 이번 글에서는 하나의 액티비티에 두 개의 프래그먼트가 들어가도록 만들어볼 것이다. 화면의 위쪽과 아래쪽을 나눈 후 위쪽에는 이미지 선택이 가능한 리스트가 보이는 프래그먼트를 만들어 넣고 아래쪽에는 선택된 이미지가 보이는 프래그먼트를 만들어 넣는다.
우선, 순서를 간단하게 요약해보겠다. 자세한 설명은 소스 코드와 그 밑의 설명을 참고하길 바란다.
[XML 레이아웃]
① 첫 번째 프래그먼트를 위한 XML 레이아웃 fragment_list.xml을 만들고 세 개의 버튼을 추가한다.
② 두 번째 프래그먼트를 위한 XML 레이아웃 fragment_viewer.xml을 만들고 이미지뷰를 추가한다.
③ 메인 액티비티의 XML 레이아웃에 두 개의 프래그먼트를 추가한다.
[소스 코드]
① ListFragment.java에 ImageSelectionCallback 인터페이스를 추가하고, 각각의 버튼에 클릭 이벤트를 설정한다.
② ViewerFragment.java에 setImage 메서드를 정의해 이미지뷰에 이미지를 설정한다.
③ MainActivity.java에서 ImageSelectionCallback 인터페이스를 구현하고, 메서드를 오버라이딩할 때 setImage 메서드를 호출한다.
▼ ImageSelectionCallback 인터페이스 추가하고 버튼에 클릭 이벤트 설정하기
public class ListFragment extends Fragment {
public interface ImageSelectionCallback {
void onImageSelected(int position);
}
public ImageSelectionCallback callback;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if(context instanceof ImageSelectionCallback){
callback = (ImageSelectionCallback) context;
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list, container, false);
Button button = rootView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(callback != null){
callback.onImageSelected(0);
}
}
});
Button button2 = rootView.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(callback != null){
callback.onImageSelected(1);
}
}
});
Button button3 = rootView.findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(callback != null){
callback.onImageSelected(2);
}
}
});
return rootView;
}
}
ImageSelectionCallback 인터페이스를 ListFragment.java에 추가할 수도 있고, MainActivity.java에 추가할 수도 있는데, 여기서는 ListFragment.java에 추가한다.
프래그먼트에서 액티비티를 참조하고 싶다면 onAttach 메서드로 전달되는 파라미터를 참조하거나 getActivity 메서드를 호출하여 반환되는 객체를 참조할 수 있다. 여기서는 onAttach 메서드가 호출될 때 callback 변수에 ImageSelectionCallback 자료형 객체를 할당한다.
*Context: 거의 최상위 클래스
fragment_list.xml 파일을 인플레이션하면 findViewById 메서드로 프래그먼트 안에 있는 버튼을 참조할 수 있게 된다.
각각의 버튼에 callback 객체의 onImageSelected 메서드를 호출하도록 하는 클릭 메서드를 설정한다.
▼ setImange 메서드 정의하고 이미지뷰에 이미지 설정하기
public class ViewerFragment extends Fragment {
ImageView imageView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_viewer, container, false);
imageView = rootView.findViewById(R.id.imageView);
return rootView;
}
public void setImage(int resId){
imageView.setImageResource(resId);
}
}
fragment_viewer.xml 파일을 인플레이션하고 findViewById 메서드로 프래그먼트 안에 있는 이미지뷰를 참조한다.
setImage 메서드를 만들어 액티비티에서 이 프래그먼트에 있는 이미지뷰에 이미지를 설정할 수 있도록 한다.
▼ ImageSelectionCallback 인터페이스 구현하고, 메서드 오버라이딩할 때 setImage 메서드를 호출하기
public class MainActivity extends AppCompatActivity implements ListFragment.ImageSelectionCallback {
ListFragment listFragment;
ViewerFragment viewerFragment;
int[] images = {R.drawable.kuma1, R.drawable.kuma2, R.drawable.kuma3}; // 리소스 수정 후 사용
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
listFragment = (ListFragment) manager.findFragmentById(R.id.listFragment);
viewerFragment = (ViewerFragment) manager.findFragmentById(R.id.viewerFragment);
}
@Override
public void onImageSelected(int position) {
viewerFragment.setImage(images[position]);
}
}
ImageSelectionCallback 인터페이스를 구현한다.
FragmentManager 객체의 findFragmentById 메서드를 사용해 두 개의 프래그먼트를 찾아 변수에 할당한다.
ListFragment.java에서 호출한 onImageSelected 메서드를 정의한다. ViewerFragment의 setImage 메서드를 호출해 이미지가 바뀌도록 한다.
'Android' 카테고리의 다른 글
[Do it! 안드로이드 앱 프로그래밍 #14] 상단 탭과 하단 탭 만들기 (0) | 2021.12.13 |
---|---|
[Do it! 안드로이드 앱 프로그래밍 #13] 액션바 사용하기 (0) | 2021.12.05 |
[Do it! 안드로이드 앱 프로그래밍 #11] 프래그먼트란? (0) | 2021.11.28 |
[Do it! 안드로이드 앱 프로그래밍 #10] 태스크 관리, 액티비티 수명주기 이해하기 (0) | 2021.11.24 |
[Do it! 안드로이드 앱 프로그래밍 #9] 인텐트, 플래그 그리고 부가 데이터 사용하기 (0) | 2021.11.21 |