상세 컨텐츠

본문 제목

Fragment

Android(강의정리)

by 낙지지 2020. 11. 18. 15:16

본문

Fragment

- Activity -> 앱에 보이는 한 화면의 단위

- 엑비티가 가지고 있는 문제
- ex) 엑티비티가 길어지게 되면 (파트1,2,3,4,5,6) -> 관리 포인트가 많아진다 -> 관리가 어려워진다

- 다양한 디바이스에서 오는 문제
- ex) 안드로이드 디바이스가 너무 다양하다, 안드로이드에는 핸드폰만 있는게 아니다! -> 테블릿이 있다!

사용처
- 엑티비티의 파트를 나누어서 책임진다

Fragment
- 라이프 사이클이 존재한다
- 엑티비티 종속적이다

사용방법
- XMLViewComponent로 추가한다
- 코드로(동적)으로 추가한다

데이터 전달 방법
- 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할 수 있다

 

 

- 이는 엑비티비의 활동 수명 주기와 유사하다.

 

 

- 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로 보낸 값을 받을 때 사용

  • Fragment클래스
override fun onActivityCreated(savedInstanceState: Bundle?) {
        Log.d("life_cycle", "F onActivityCreated")

        val data = arguments?.getString("hello")
        Log.d("data", ""+data)

        super.onActivityCreated(savedInstanceState)
    }

 

  • avtivity
// 프라그먼트에 data를 넣어주는 방법
        val bundle:Bundle = Bundle()
        bundle.putString("hello", "hellovalue")
        fragmentOne.arguments = bundle

 

- Fragment -> Activity 값을 넘기기 위해 생성해준 Interface

  • Fragment 클래스
// 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")
        }
    }
  • Activity
// 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()
        }

'Android(강의정리)' 카테고리의 다른 글

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

관련글 더보기

댓글 영역