프래그먼트
조각(fragment)
액티비티보다 더 작은 화면 단위를 정의하고 프래그먼트를 조합하여 완성된 화면표현
액티비티에 비해 동적이고 유연한 화면 구현 가능
자신만의 레이아웃, 동작, 생명주기를 가진 독립적인 모듈
Fragment는 Activity가 아니기 때문에 context를 가지지 않는다.
생명주기
1. onAttach(Activity activity)
Fragment가 Activity에 붙을때 호출 된다.
Fragment는 혼자 사용될수 없고 항상 액티비디의 한부분으로 사용된다.
* activity – Host Activity
2. onCreate(Bundle savedInstanceState)
Fragment가 생성될 때 호출된다.
초기화할 것이 있으면 사용(없으면 생략가능)
Activity의 onCreate()와 비슷하나, UI 관련 작업은 할 수 없다.
이 단계에서는 호스트 액티비티도 초기화중이라서 액티비티 컨트롤을 안정하게 참조할 수 없다.
만약 참조하고싶으면, onActivityCreated 콜백을 사용한다.
* savedInstanceState – 프래그먼트가 재생성될때의 이전상태이며, 이 값을 참조하여 이전상태로 복구한다.
3. onCreateView
(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
Fragment 와 관련 되는 View 계층을 inflater을하여 View작업을 하여 리턴합니다.
*** UI관련 작업을 하는 부분
View root = inflater.inflate(R.layout.conterfragment, container, false)
Button btn = (Button)root.findViewById(R.id.btn)
View view = inflater.inflate(R.layout.fragment, container, false);
return view;
* inflater – xml파일을 전달함,
ex) 같은 xml이라도 setContentview를 사용하면 액티비티에, inflater를 사용하면 프래그먼트.
* cotainer – 프래그먼트가 배치될 액티비티의 부모 뷰, 액티비티의 이 위치에 프래그먼트가 생성, 배치된다.
4. onActivityCreated()
Activity에서 Fragment를 모두 생성하고 난다음 호출 된다.
초기화 완료된 상태
- UI변경작업이 가능
5. onStart()
Fragment가 화면에 표시될때 호출된다. 사용자의 Action과 상호 작용 할 수 없다.
6. onResume()
Fragment가 화면에 완전히 그렸으며, 사용자의 Action과 상호 작용이 가능하다.
– 다른 Fragment가 추가 되었을때
1. onPause()
Fragment가 사용자의 Action과 상호 작용을 중지한다.
2. onStop()
Fragment가 화면에서 더이상 보여지지 않게 되며, Fragment기능이 중지 되었을때 호출 된다.
3. onDestoryView()
View 리소스를 해제 할수 있도록 호출된다.
backstack을 사용 했다면 Fragment를 다시 돌아 갈때 onCreateView()가 호출 된다.
– Fragment가 replace or backward로 제거되는 경우
4. onDestory()
Fragment상태를 완전히 종료 할 수 있도록 호출 한다.
5. onDetach()
Fragment가 Activity와 연결이 완전히 끊기기 직전에 호출 된다.
6. onSaveInstanceState(Bundle outState)
생명주기 메서드는 아니지만, onPause()와 함꼐 호출되며 임시정보를 저장한다.
상태저장
스마트폰 회전시 데이테 손실됨 이유: 화명 방향이 바뀌면 액티비티가 새로 생성되고, 그에따라 소속된 프래그먼트도 새로 생성된다. 정보를 저장해 놓지 않았기 때문에, 초기값으로 리셋된다.
onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
TextView TextCounter = (TextView)getview().findViewById(R.id.txtconter);
int a = Integer.parseInt(TextCounter.getText().toString());
outState.putInt("Counter", a);
}
장비의 설정상태변경, 화면방향변경 등의 변화에 의해 프래그먼트가 정지할 때, 변경된 값을 Bundle에 저장해 놓은 onSaveInstanceState 메서드가 호출된다.
저장된 번들은 onCreate, onCreateView, onActivityCreated콜백의 savedInstanceState 인수로 전달되므로 언제든지 복구에 사용 할 수 있다.
if(onSaveInstanceState == null) // 변경된 값이 없을 때,
프래그먼트 관리자
레이아웃과 마찬가지로 프래그먼트도 실행중에 편집이 가능하다. 필요할 때 추가하거나 다 사용한후 제거 할 수 있으며, 다른 프래그먼트로 교체 할 수도 있다.
또한 교체하기위해서는 액티비티내에 Layout을 지정해주고 거기다가 replace, add 등을 해야한다.
Activity.getFragmentManager()
Fragment.getFragmentManager()
findFragmentByid(int id), findFragmentByTag(String tag) : 프래그먼트 검색
/*
When you are using android.support.v4.app.FragmentManager then you should use getSupportFragmentManager() and if you are using android.app.FragmentManager then use getFragmentManager()
*/
switch(fragmentId){
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | case FRAGMENT_ADD: getSupportFragmentManager() .beginTransaction() .add(R.id.fl_activity_main, dashboardFragment).commit(); break; case FRAGMENT_REPLACE: getSupportFragmentManager() .beginTransaction() .replace(R.id.fl_activity_main, patientListFragment).commit(); break; case FRAGMENT_REMOVE: getSupportFragmentManager() .beginTransaction() .remove(locationFragement).commit(); break; case FRAGMENT_SHOW: getSupportFragmentManager() .beginTransaction() .show(scheduleFragement).commit(); break; case FRAGMENT_HIDE: getSupportFragmentManager() .beginTransaction() .hide(R.id.fl_activity_main, boundaryFragement).commit(); break; | cs |
인수전달
프래그먼트는 액티비티의 작업 일부를 전담하는 서브 모듈이다. 메서드가 작업 거리를 인수로 전달받는 것과 마찬가지로 프래그먼트로 액티비디의 요구에 따라 조금씩 다르게 동작하기 위해 인수를 받아 들인다. 이때 프래그먼트는 인수 저장을 위해 argument를 사용한다.
void setArguments(Bundle args);
Bundle args = new Bundle();
args.putInt(“start”, start);
fragment.setArguments(args);
Bundle getArguments();
Bundle args = getArguments();
백스택
여러개의 프래그 먼트로 구성된 액티비티는 실행중인 프래그먼트를 스택으로 저장한다. 또한 자동으로 관리해주는 액티비티와 달리 명시적인 요구가 있을때만 저장한다. 현재 상태를 스택에 저장하려면, 트랜잭션의 다음 메서드를 호출한다.
addToBackStack(String name);
스택에 프래그먼트를 저장한 상태에서 사용자가 Back버튼을 누르면 액티비티가 종료되는 것이 아니라 스택의 최상위에 있는 프래그먼트를 꺼내 원래 상태로 복귀한다.
Fragment 종류
- DialogFragment : 떠다니는 다이얼로그를 보여주는 Fragment. Fragment는 백스택에 넣어둘 수 있기 때문에 사용자가 다시 Fragment로 복귀하고자 할 때에 Activity에 기본적으로 들어있는 다이얼로그 대신에 사용 할 수 있는 좋은 대체제이다.
- ListFragment : Adapter를 통해서 List를 보여주는 Fragment로 ListActivity와 비슷하고, list view에서 다룰 수 있는 onListItemClick()과 같은 콜백 함수들도 제공한다.
- PreferenceFragment: Preference 객체들을 목록으로 보여주는 PreferenceActivity와 비슷하며, 앱의 Settings를 만들 때에 유용하게 사용할 수 있다.
'Programming > Android' 카테고리의 다른 글
SharedPreferences (0) | 2016.08.24 |
---|---|
Context (0) | 2016.08.24 |
Activity 생명주기 (0) | 2016.08.24 |
permission (0) | 2016.08.24 |
Httppost 전송하기 (0) | 2016.08.24 |