Fragment
- Activity -> 앱에 보이는 한 화면의 단위
- 엑비티가 가지고 있는 문제
- ex) 엑티비티가 길어지게 되면 (파트1,2,3,4,5,6) -> 관리 포인트가 많아진다 -> 관리가 어려워진다
- 다양한 디바이스에서 오는 문제
- ex) 안드로이드 디바이스가 너무 다양하다, 안드로이드에는 핸드폰만 있는게 아니다! -> 테블릿이 있다!
사용처
- 엑티비티의 파트를 나누어서 책임진다
Fragment
- 라이프 사이클이 존재한다
- 엑티비티 종속적이다
사용방법
- XML에 ViewComponent로 추가한다
- 코드로(동적)으로 추가한다
데이터 전달 방법
- Activity -> Fragment : argument 와 bundle
- Fragment -> Activity : 자체 구현(리스너 구현)
- XML에 ViewComponent로 추가하는 방법
<fragment
android:id="@+id/fragment_one"
android:name="com.example.myapplication.FragmentOne"
android:layout_width="match_parent"
android:layout_height="300dp"></fragment>
- 클래스를 생성하고, Fragment()를 상속받으면, onAttach ~ onDetach 수많은 메소드를 override할 수 있다
developer.android.com/guide/components/fragments?hl=ko
프래그먼트 | Android 개발자 | Android Developers
A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section
developer.android.com
- 이는 엑비티비의 활동 수명 주기와 유사하다.
- Fragment()를 상속받은 클래스의 override된 여러 메소드 중 onCreateView()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.d("life_cycle", "F onCreateView")
// 프라그먼트가 인터페이스를 처음으로 그릴 때 호출된다.
// inflater -> 뷰를 그려주는 역할
// container -> 부모 뷰
return inflater.inflate(R.layout.fragment_one, container, false)
// inflate의 return type이 View이다.
//return super.onCreateView(inflater, container, savedInstanceState)
}
- Fragment()를 상속받은 클래스의 override된 여러 메소드 중 onViewCreated()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Log.d("life_cycle", "F onViewCreated")
super.onViewCreated(view, savedInstanceState)
// Activity의 onCreate에서 했던 작업을 여기에서 한다.
pass.setOnClickListener {
dataPassListener.onDataPass("Good Bye")
}
}
- Fragment()를 상속받은 클래스의 override된 여러 메소드 중 onActivityCreated()
- Activity -> Fragment로 보낸 값을 받을 때 사용
override fun onActivityCreated(savedInstanceState: Bundle?) {
Log.d("life_cycle", "F onActivityCreated")
val data = arguments?.getString("hello")
Log.d("data", ""+data)
super.onActivityCreated(savedInstanceState)
}
// 프라그먼트에 data를 넣어주는 방법
val bundle:Bundle = Bundle()
bundle.putString("hello", "hellovalue")
fragmentOne.arguments = bundle
- Fragment -> Activity 값을 넘기기 위해 생성해준 Interface
// fragment -> activity (값넘길 interface자체 구현)
interface OnDataPassListener{
fun onDataPass(data: String?)
}
override fun onAttach(context: Context) {
Log.d("life_cycle", "F onAttach")
super.onAttach(context)
// as ~ -> 형변환
dataPassListener = context as OnDataPassListener
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Log.d("life_cycle", "F onViewCreated")
super.onViewCreated(view, savedInstanceState)
// Activity의 onCreate에서 했던 작업을 여기에서 한다.
pass.setOnClickListener {
dataPassListener.onDataPass("Good Bye")
}
}
// Fragment에게 값을 받기 위한 작업?
override fun onDataPass(data: String?) {
Log.d("pass", ""+data)
}
- Activity
- avtivity -> fragment (데이터 넘기는 방법)
// 프라그먼트에 data를 넣어주는 방법
val bundle:Bundle = Bundle()
bundle.putString("hello", "hellovalue")
fragmentOne.arguments = bundle
- fragment를 동적으로 작동하는 방법
- replace와 add로 붙이는 건 별 차이가 없다.
- remove와 detach는 약간 다르다. 까먹었는데 둘 중 하나는 제거되면 다시 붙지 않는데, 하나는 다시 붙는다.
button.setOnClickListener {
// 프라그먼트를 동적으로 작동하는 방법
// 프라그먼트 붙이는 방법 replace / add
val fragmentManager:FragmentManager = supportFragmentManager
// Transaction
// 작업의 단위 -> 시작과 끝이 있다.
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, fragmentOne);
fragmentTransaction.commit()
// 끝을 내는 방법 ( 둘이 유사함, 요새는 핸드폰이 좋아서)
// commit() -> 시간 될 때 해 (좀 더 안정적)
// commitnow() -> 지금 당장 해
}
button2.setOnClickListener {
// 프라그먼트 remove / detach 방법
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.remove(fragmentOne)
fragmentTransaction.commit()
}
Context (0) | 2020.11.18 |
---|---|
NullSafety, lateinit (0) | 2020.11.18 |
Intent (0) | 2020.11.17 |
수명주기, view -> activity, 익명함수 (0) | 2020.11.16 |
layout (0) | 2020.11.13 |
댓글 영역