[안드로이드] 안드로이드스튜디오(Android Studio)프래그먼트(Fragment)를 액티비티에 추가하는 두가지 방법, 프래그먼트트랜잭션(FragmentTransaction) 이란?, 안드로이드 예제, 안드로이드 강좌
파푸맘 블로그(http://blog.naver.com/bobe6294)
안녕하세요 정보처리마법사 입니다.
이번 포스팅의 주제는 프래그먼트(Fragment)를 액티비티에 추가하는 두 가지 방법에 관한 내용입니다.
프래그먼트는 액티비티 내에서 동작하는 화면 구성 요소이기 때문에 프래그먼트를 사용하기 위해서는 가장 먼저 액티비티에 추가해야 합니다. 추가하는 방법에는 두 가지가 있습니다.
1. 액티비티의 레이아웃 파일에 프래그먼트를 선언하는 방법.
2. 자바 코드에서 프래그먼트를 추가하는 방법.
먼저 레이아웃 파일에 프래그먼트를 선언하는 방법에 대해서 살펴보겠습니다.
메인액티비티를 작성합니다.
public static class ArrayListFragment extends ListFragment {
여러 개의 프래그먼트 중에서 숫자 배열을 표시하기에 가장 적당한 프래그먼트는 ListFragment입니다. 그러므로 이 프래그먼트를 확장해서 작성하면 됩니다.
onActivityCreated() 메소드를 재정의하고, 숫자를 클릭했을 때 원하는 처리를 할 수 있는 onListItemClick() 메소드도 재정의 해야합니다.
public void onActivityCreated(Bundle savedInstanceState) {
이 메소드는 액티비티의 onCreate() 메소드처럼 프래그먼트가 생성될 때 호출되는 생명주기 메소드입니다. 이러한 생명주기 메소드는 여러 개가 준비되어 있습니다.
setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_activated_1, NUMBERS));
안드로이드에서 제공하는 기본 레이아웃과 숫자 배열 NUMBERS를 지정한 ArrayAdapter를 생성하고 이 객체를 setListAdapter() 메소드에 지정합니다. simpla_list_item_activated_1 은 리스트에서 아이템을 선택했을 때 선택한 아이템이 표시가 되는 레이아웃입니다. 이러한 활성화 기능이 필요하지 않다면 android.R.layout.simple_list_item_1 을 사용하면 됩니다.
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
리스트뷰의 아이템 선택을 한 개만 할 수 있게 설정합니다.
public void onListItemClick(ListView l, View v, int position, long id)
리스트의 아이템을 선택했을 때 호출되는 메소드 입니다. 매개변수 l은 아이템을 선택한 리스트뷰, v 리스트뷰 내에서 선택된 뷰, position 리스트에서 뷰의 위치, id 선택한 아이템의 id 입니다.
getListView().setItemChecked(position, true);
지정된 위치의 아이템을 선택한 상태로 표시합니다. 안드로이드 4.0에서 이 코드를 적용하면 선택한 아이템의 배경이 파란색으로 설정됩니다.
activity_main.xml 파일입니다. <fragment>가 선언되어 있으며, 이 태그의 속성에 class가 있습니다. 바로 이 속성에 보여주고 싶은 프래그먼트의 클래스 이름을 패키지 이름까지 포함하여 지정하면 됩니다. ArrayListFragment 클래스는 MainActivity 클래스의 정적 내부 클래스로 선언했기 때문에 실제로 생성되는 클래스 파일 이름은 MainActivity$ArrayListFragment.class 입니다. 그러므로 MainActivity$ArrayListFragment에 패키지 이름을 붙여서 class 속성에 지정하면 됩니다. 만약에 ArrayListFragment를 별도의 자바 파일로 작성했다면 class에 지정할 이름은 com.papoocompany.papoo.addfragmenttest1.ArrayListFragment가 될 것입니다.
프래그먼트는 액티비티 내에서 실행되며 액티비티와 매우 밀접한 관계를 가집니다. 그래서 종종 프래그먼트에서 액티비티에 선언한 뷰에 접근해야 하는 경우가 있습니다.
프래그먼트에서 액티비티에 접근하기 위해서는 액티비티 인스턴스를 얻을 수 있어야 합니다. 이를 위해 안드로이드는 getActivity()메소드를 제공하고 있습니다. 이 메소드를 통해 액티비티 인스턴스를 얻은 후에 우리가 원하는 작업을 수행하면 됩니다. 예를 들어 이런식입니다.
TextView textView = (TextView)getActivity().findViewById(R.id.name);
위 이미지는 애플리케이션을 디바이스에서 실행한 첫 화면이고
아래 이미지는 버튼 3 을 클릭했을 때의 모습입니다.
이어서 두번째 방법인 자바 코드에서 프래그먼트를 추가하는 방법을 살펴보겠습니다.
레이아웃 xml을 수정할 필요가 전혀 없으므로 default 프로젝트를 생성하고
메인 액티비티의 소스코드만 수정하면 됩니다.
첫 번째 방식을 사용할 때에는 onCreate()메소드에서 setContentView()메소드에 레이아웃 XML을 지정하였지만, 두 번째 방식을 사용할 때에는 setContentView()메소드를 호출하지 않습니다.
ArrayListFragment list = new ArrayListFragment();
ArrayListFragment 객체를 생한하고 이 객체는 프래그먼트에 직접 지정해야 합니다.
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(android.R.id.content, list);
ft.commit();
액티비티에서 프래그먼트를 다루기 위해서는 가장 먼저 FragmentManager 객체를 얻어야 합니다. 그리고 이 객체에서 프래그먼트 트랜잭션, 즉 프래그먼트를 추가하거나 교체하고 삭제하는 등의 작업을 처리하기 위한 FragmantTransaction 객체를 얻어야 합니다. 그 다음에 add()메소드나 replace()메소드 등을 호출해서 ArrayListFragment 객체를 원하는 뷰에 추가하면 됩니다. 이 코드에서는 add()메소드를 호출해서 안드로이드가 기본으로 제공하는 android.R.id.content 뷰에 프래그먼트를 추가 했습니다. android.R.id.content는 액티비티 화면 전체를 사용합니다. 그리고 가장중요한 commit()메소드를 호출해서 add()메소드로 작업한 내용을 반영해야 합니다. 이 메소드를 호출하지 않을 경우 작업된 내용이 보이지 않으므로 호출하는 것을 잊지 말아야합니다.
그리고 위 코드는 이런식으로 한 줄로 작성할 수 있습니다.
getFragmentManager().beginTransaction().add(android.R.id.content, list).commit();
참고 , 프래그먼트 트랙잭션(FragmentTransaction)의 트랜잭션의 의미
트랜잭션이라는 용어는 일반적으로 데이터베이스 사용 시 많이 들을 수 있는 용어입니다. 데이터베이스에서 말하는 트랜잭션은 하나의 작업 단위 이며, 이 작업 단위에 포함된 추가, 삭제 등의 여러 작업은 한 번에 모두 실행되거나 실행되지 않아야 합니다. 그래서 프래그먼트에서 말하는 트랜잭션이라는 용어가 낯설더라도 데이터베이스의 트랜잭션을 이해하고 있는 분이라면 비슷한 용어로 이해해도 무방합니다. 또한 데이터베이스의 트랜잭션을 처리할 때 호출하는 commit 명령어도 프래그먼트에서 그대로 사용할 수 있으며(commit()메소드)
,의미 또한 크게 다르지 않지만, 데이터베이스에서 처리하고 있던 작업을 모두 롤백하는 명령어인 rollback은 프래그먼트에 준비되어 있지 않습니다.
실행해보니 아래와 같이 첫 번째 방식의 결과랑 똑같은 화면이 뜹니다.
숫자 2를 클릭하니 이런식으로 잘 작동합니다.
이상으로 포스팅을 마칩니다. 감사합니다.
참고서적 : 200개의 단계별 예제로 배우는 안드로이드 4.0 [제이펍]
Fin.
잘 못 된 정보가 있으면 말씀해주세요~
공감버튼 클릭은 작성자에게 큰 힘이 됩니다. 행복한 하루 되세요.