내용 정리하고 뭐 하다가 하루가 다 갔네요..
예시는 언제 다시 복습할 수 있을런지 ㅎ.ㅎ...안드로이드 앱은 내용이 정말 기네요.
[프래그먼트]
1. 하나의 화면을 여러 부분으로 나눠서 보여주거나 각각의 부분 화면 단위로 바꿔서
....보여주고 싶을 때 사용하는 것이 프래그먼트(Fragment)입니다.
2. 하나의 화면 안에 들어가는 부분 화면과 같아서 하나의 레이아웃처럼 보입니다.
.....하지만 액티비티처럼 독립적으로 동작하는 부분 화면을 만들 때 사용됩니다.
3. 프래그먼트의 사용목적
.1) 분활된 화면들을 독립적으로 구성하기 위해 사용합니다.
.2) 분활된 화면들의 상태를 관리하기 위해 사용하빈다.
4. 프래그먼트는 항상 액티비티 위에 올라가 있어야 합니다.
.1) 액티비티는 안드로이드 시스템의 액티비티 매니저가 관리합니다.
.2) 프래그먼트는 액티비티의 프래그먼트 매니저가 관리합니다.
5. 인텐트는 시스템에서 이해하는 객체이므로 프래그먼트와 액티비티 사이에서 전달할 수가
...없습니다. 이 때문에 액티비티와 프래그먼트 간에 데이터를 전달할 때는 단순히 메서드를
...만들고 메서드를 호출하는 방식을 사용합니다.
6. 탭 모양으로 화면을 구성할 때 각각의 [탭] 버튼을 클릭할 때마다 다른 화면이 보이는
....효과를 내고 싶다면 액티비티가 아닌 프래그먼트를 사용하는 것이 좋습니다.
[프래그먼트를 화면에 추가하는 방법 이해하기]
1. 프래그먼트도 하나의 XML 레이아웃과 하나의 자바소스 파일로 동작하게 만듭니다.
2. 프래그먼트에는 setContentView() 메서드가 없으므로 인플레이션 객체인 LayoutInflater
....를 사용해 인플레이션을 진행해야 합니다. XML 레이아웃 파일의 내용을 인플레이션한 후
....클래스에서 사용하도록 하는 코드는 onCreateView() 메서드 안에 들어갑니다.
....onCreateView() 메서드는 콜백 메서드로 인플레이션이 필요한 시점에 자동으로
....호출됩니다. 따라서 이 메서드 안에서 인플레이션을 위한 inflate() 메서드를 호출하면 되고
...,인플레이션 과정이 끝나면 프래그먼트가 하나의 뷰처럼 동작할 수 있는 상태가 됩니다.
3. 메인화면을 위해 만든 activity_main.xml 파일에 직접 <fragment> 태그를 사용해
,,,,프래그먼트를 추가할 수도 있고, 새로 정의한 프래그먼트 클래스의 인스턴스 객체를 new
....연산자로 만든 후 FragmentManager 객체의 add() 메서드를 사용해 액티비티에 추가할
....수 있습니다
4. 프래그 먼트의 특성
특성 |
설명 |
뷰 특성 |
뷰 그룹에 추가되거나 레이아웃의 일부가 될 수 있음 (뷰에서 상속받은 것은 아니며 뷰를 담고 있는 일종의 틀임) |
액티비티 특성 |
액티비티처럼 수명주기(LifeCycle) 가지고 있음 (컨텍스트 객체는 아니며 라이프사이클은 액티비티에 종속됨) |
※ 프래그먼트 만들어 화면에 추가하기 예시
☞ onCreateView() 메서드의 파라미터로 LayoutInflater 객체가 전달되므로 이 객체의
.....inflate() 메서드를 바로 호출할 수 있습니다.
☞ inflate() 메서드로 전달되는 첫 번째 파라미터는 XML 레이아웃 파일이 되므로
....R.layout.fragment_main 이 입력되어 있습니다.
☞ 두 번째 파라미터는 이 XML 레이아웃이 설정될 뷰그룹 객체가 되는데 onCreateView()
....메서드로 전달되는 두 번째 파라미터가 이 프래그먼트의 가장 상위 레이아웃입니다.
....따라서 container(최상위 레이아웃 id) 객체를 전달하면 됩니다.
☞ inflate() 메서드를 호출하면 인플레이션이 진행되고 그 결과로 ViewGroup 객체가
....반한됩니다. 이 객체를 return 키워드를 사용하여 반환합니다.
[버튼 클릭했을 때 코드에서 프래그먼트 추가하기]
☞ 메인 프래그먼트 안에 표시되는 최상위 레이아웃은 인플레이션을 통해 참조한 rootView
...객체입니다. 이 관계를 조금 쉽게 설명하면 최상위 레이아웃(rootView)은 메인 프래그먼트
...안에 들어 있는 것이고 메인 프래그먼트는 이 레이아웃을 화면에 보여주기 위한 틀이라고
...생각할 수 있습니다.
☞ 그래서 rootView의 findViewById() 메서드를 사용하여 레이아웃에 들어 있는 버튼 객체를
...찾아낼 수 있습니다. 그리고 이 객체의 setOnClickListener() 메서드를 호출하여 리스너를
...등록하면 버튼이 클릭되었을 때 이벤트를 처리할 수 있습니다.
☞ onClick() 메서드 안에서는 MainActivity 객체를 참조한 후 onFragmentChanged()
...메서드를 호출하도록 합니다. 이 메서드는 메인 액티비티에 새로 추가할 메서드로
...프래그먼트 매니저를 이용해 프래그먼트를 전환하는 메서드입니다.
☞ 이렇게 코드를 입력한 이유는 프래그먼트 관리를 액티비티가 하기 때문에 액티비티에서
...프래그먼트를 전환하도록 만들어야 하기 때문입니다. 다시 말해, 하나의 프래그먼트에서
...다른 프래그먼트를 직접 띄우는 것이 아니라 액티비티를 통해 띄워야 합니다.
☞ 프래그먼트는 뷰가 아니라서 Activiy 클래스에 있는 findViewById() 메서드로 찾을 수
...없습니다. 대신 프래그먼트를 관리하는 FragmentManager 객체의 findFragmentById()
...메서드를 사용해 찾을 수 있습니다. 메인 프래그먼트는 findFragmentById() 메서드를
...사용해 찾은 후 변수에 할당하고 메뉴 프래그먼트는 new 연사자를 사용해 새로운
...객체로 만들어 변수에 할당합니다.
☞ replace() 메서드를 사용해 프래그먼트를 바꾸도록 입력합니다.
★ 메인 액티비티에서 프래그먼트를 다루기 위해서는 먼저 getFragmentManager() 메서드를
...호출하여 매니저 객체를 참조합니다. 프래그먼트 매니저는 프래그먼트를 다루는 작업을
...해주는 객체로 프래그먼트 추가, 삭제, 또는 교체 등의 작업을 할 수 있게 합니다. 그런데
...이런 작업들은 프래그먼트를 변경할 때 오류가 생기면 다시 원래 상태로 돌릴 수 있어야
...하므로 트랜잭션 객체를 만들어 실행합니다. 트랜잭션 객체는 beginTransaction()
...메서드를 호출하면 시작되고 commit() 메서드를 호출하면 실행됩니다.
[프래그먼트의 수명주기]
1. 프래그먼트를 사용하는 목적 중의 하나가 분활된 화면들의 상태를 관리하는 것인데 이것을
...가능하게 하는 것이 수명주기 메서드들입니다. 즉, 액티비티 안에 들어 있는 프래그먼트도
...필요할 때 화면에 보이거나 보이지 않게 되므로 액티비티처럼 각각의 상태가 관리되는 것이
...필요합니다.
메서드 |
설명 |
onAttach(Activity) |
프래그먼트가 액티비티와 연결될 때 호출됨 |
onCreate(Bundle) |
프래그먼트가 초기화될 때 호출됨. (new 연산자를 이용해 새로운 프래그먼트 객체므를 만드는 시점이 아니라는 점에 주의해야 함) |
onCreateView(LayoutInflator, ViewGroup, Bundle) |
프래그먼트와 관련되는 뷰 계층을 만들어서 리턴함 |
onActivityCreated(Bundle) |
프래그먼트와 연결된 액티비티가 onCreate() 메서드의 작업을 완료했을 때 호출됨. |
onStart() |
프래그먼트와 연결된 액티비티가 onStart() 되어 사용자에게 프래그먼트가 보일 때 호출됨. |
onResume() |
프래그먼트와 연결된 액티비티가 onResume()되어 사용자와 상호작용 할 수 있을 때 호출됨. |
2. 프래그먼트는 액티비티 위에 올라가야 제대로 동작하므로 먼저 onAttach() 메서드가
...호출되며 액티비티에 프래그먼트가 추가되고 그 다음에 onCreate() 메서드가 호출됩니다.
...다시 말해 onAttach() 메서드가 호출될 때 파라미터로 전달되는 액티비티 객체 위해
...프래그먼트가 올라가 있게 됩니다. 그러므로 액티비티를 위해 설정해야 하는 정보들은 이
...onAttach() 메서드에서 처리해야 합니다.
3. 프래그먼트가 화면에서 보이지 않게 되면서 호출되는 상태 메서드들
메서드 |
설 명 |
onPause() |
프래그먼트와 연결된 액티비티가 onPause() 되어 사용자와 상호작용을 중지할 때 호출됨 |
onStop() |
프래그먼트와 연결된 액티비티가 onStop() 되어 화면에서 더 이상 보이지 않을 때나 프래그먼트의 기능이 중지되었을 때 호출됨 |
onDestroyView() |
프래그먼트와 관련된 뷰 리소스를 해제할 수 있도록 호출됨 |
onDestroy() |
프래그먼트의 상태를 마지막으로 정리할 수 있도록 호출됨 |
onDetach() |
프래그먼트가 액티비티와 연결을 끊기 전에 바로 호출됨 |
[프래그먼트로 화면 만들기]
※ 프래그먼트로 화면 만들기 예시
☞ onAttach() 메서드는 프래그먼트가 액티비티 위에 올라오는 시점에 호출됩니다. 그래서
....프래그먼트에서 해당 액티비티를 참조하고 싶다면 onAttach() 메서드로 전달되는
....파라미터를 참조하거나 getActivity() 메서드를 호출하여 반환되는 객체를 참조할 수
...있습니다. 그리고 그 객체를 변수에 할당하면 프래그먼트 클래스 안에서 자유롭게 액티비티
...객체를 참조할 수 있게 됩니다.
☞ 화면에서 선택된 버튼에 따라 다른 프래그먼트의 이미지를 바꿔주려면 액티비티 쪽으로 데이터를 전달해야 하므로 액티비티에 onImageSelected() 메서드를 정의한 후 그 메서드를 호출하도록 합니다. 그런데 매번 액티비티마다 다른 이름의 메서드를 만들면 프래그먼트가 올라간 액티비티가 다른 액티비티로 변경되었을 때 해당 액티비티가 무엇인지 매번 확인해야 하는 번거로움이 있습니다. 이 때문에 인터페이스를 하나 정의한 후 액티비티가 이 인터페이스를 구현하도록 하는 것이 좋습니다.
[액션바 사용하기]
[화면에 메뉴 기능 넣기]
1. 시스템 [메뉴]버튼을 눌렀을 때 숨어있던 메뉴가 보이도록 할 수도 있고 앱의 상단 타이틀 부분에 [메뉴] 부분을 배치하고 그것을 눌렀을 때 메뉴가 보이도록 할 수도 있습니다. 이런 메뉴를 옵션 메뉴(Option Menu)라고 부릅니다.
2. 옵션메뉴와 다르게 입력상자를 길게 눌러 나타나는 ‘복사하기’, ‘붙여넣기’ 등의 팝업 형태의 메뉴는 컨택스트 메뉴(Context Menu)라고 합니다.
3. 옵션 메뉴는 각각의 화면마다 설정할 수 있으며 컨텍스트 메뉴는 각각의 뷰마다 설정할 수 있습니다.
★ public boolean onCreateOptionsMenu(Menu menu)
★ public void onCreateContextMenu
(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)