Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

이곳저곳 관심이 많아요

11. Fragment 본문

Programming/Android

11. Fragment

킹수맨 2021. 12. 7. 15:02
  • 엑티비티에서 프래그먼트 불러오기
    1. 메인 레이아웃 파일에 프래그먼트 컨테이너를 생성한다.
    2. 메인 엑티비티에서 프래그먼트 컨테이너를 불러온다.
      val fragmentContainer: View = findViewById(R.id.fragmentContainerView)​
    3. 프래그먼트를 불러오기 전, 프래그먼트 컨테이너에 이미 프래그먼트가 있다면 불러오지 않는다.
      if(savedInstanceState != null){ //이전에 저장된 프래그먼트 있으면
          return      //프래그먼트 추가 안해도됨
      }​
    4. 프래그먼트매니저를 이용해서 프래그먼트를 불러온다.
      supportFragmentManager.beginTransaction()
          .add(R.id.fragmentContainerView,FragmentA())
          .addToBackStack(null)
          .commit()​
  • 프래그먼트에서 호스팅 엑티비티랑 통신하는 법
    1. 프래그먼트에 인터페이스를 생성한다 : 상황에 따라 인터페이스와 메소드는 바뀜
      interface ButtonListener{
          fun onButtonClick()
      }​
    2. 프래그먼트에 구현한 인터페이스를 호스팅 엑티비티가 상속받는다.
      class MainActivity : AppCompatActivity(), FragmentA.ButtonListener {
          override fun onButtonClick() {
              
          }​
    3. 엑티비티에서 인터페이스 메소드를 구현해준다.
      override fun onButtonClick() {
          supportFragmentManager.beginTransaction()
              .add(R.id.fragmentContainerView,FragmentB())
              .addToBackStack(null)
              .commit()
      }​
    4. 프래그먼트에 엑티비티 콜백 메소드를 생성한다. 타입은 인터페이스
      var activityCallBack:ButtonListener? = null​
    5. 프래그먼트에서 onAttach를 오버라이드 한 후, 예외처리를 해준다.
      override fun onAttach(context: Context) {
          super.onAttach(context)
          try{
              if(context is ButtonListener){
                  activityCallBack = context
              }
          }catch (e:ClassCastException){
              throw ClassCastException(context.toString()+"must be implement buttonListener")
          }
      }​​
    6. onCreateView 에서 엑티비티 콜백 메소드를 이용해서 인터페이스를 통해 구현된 함수를 불러온다.
      override fun onCreateView(
          inflater: LayoutInflater, container: ViewGroup?,
          savedInstanceState: Bundle?
      ): View? {
          val rootView = inflater.inflate(R.layout.fragment_a, container, false)
          val btn: Button = rootView.findViewById(R.id.button)
          btn.setOnClickListener {
              activityCallBack?.onButtonClick()
          }
          return rootView
      }​
  • 호스팅 엑티비티를 이용하여 프래그먼트 간의 값 주고받기
    - ToolBarFragment-> 메인엑티비티 -> TextFragment
    - seekBar로 정한 textSize, editText에 입력된 문자열 -> 메인을 거쳐서 -> Text 문자열 값과 폰트 사이즈 설정하기
    1. ToolBarFragment에 인터페이스를 생성, 메소드 파라미터를 폰트사이즈, 텍스트 값으로 설정해줌
      interface TollBarListener{
              fun onButtonClick(textSize:Int,text:String)
      }
    2. 메인엑티비티에서 상속받음
      class MainActivity : AppCompatActivity(),ToolbarFragment.TollBarListener{
      
          override fun onButtonClick(textSize: Int, text: String) {
              val textFragment = supportFragmentManager.findFragmentById(R.id.text_fragment)as TextFragment
              textFragment.textSet(textSize,text)
          }
    3. ToolBarFragment에서 엑티비티 콜백 메소드를 구현해준다.
      -프래그먼트 -> 엑티비티 인 경우 프래그먼트에 엑티비티 콜백 메소드 구현
      -엑티비티 -> 프래그먼트 인 경우에는 안해도됨
      var activityCallBack: TollBarListener? = null
      
          override fun onAttach(context: Context) {
              super.onAttach(context)
              try{
                  if(context is TollBarListener){
                      activityCallBack = context
                  }
              }catch (e:ClassCastException){
                  throw ClassCastException(context.toString()+"must be implement TollBarListener")
              }
          }
    4. ToolBarFragment의 엑티비티 콜백 메소드를 이용해서 인터페이스를 통해 구현된 함수를 불러온다.
      override fun onCreateView(
              inflater: LayoutInflater, container: ViewGroup?,
              savedInstanceState: Bundle?
          ): View? {
              val rootView = inflater.inflate(R.layout.fragment_toolbar, container, false)
              var seekBarValue = 20
              val seekBar: SeekBar = rootView.findViewById(R.id.seekBar)
              val editText:EditText = rootView.findViewById(R.id.editText)
              val button: Button = rootView.findViewById(R.id.button)
      
              seekBar.setOnSeekBarChangeListener(object:SeekBar.OnSeekBarChangeListener{
                  override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                      seekBarValue = progress
                  }
                  override fun onStartTrackingTouch(seekBar: SeekBar?) { }
                  override fun onStopTrackingTouch(seekBar: SeekBar?) { }
              })
              button.setOnClickListener {
                  activityCallBack?.onButtonClick(seekBarValue,editText.text.toString())
              }
              return rootView
          }
       
    5. TextFragment에 메인엑티비티로부터 값을 전달받기 위한 메소드를 생성한다.
      class TextFragment : Fragment() {
          lateinit var textView: TextView
          override fun onCreateView(
              inflater: LayoutInflater, container: ViewGroup?,
              savedInstanceState: Bundle?
          ): View? {
              val rootView = inflater.inflate(R.layout.fragment_text, container, false)
              textView = rootView.findViewById(R.id.textView)
              return rootView
          }
          fun TextSet(fontSize:Int,text:String){
              textView.text = text
              textView.textSize = fontSize.toFloat()
          }
      }​
    6. 메인엑티비티에서 TextFragment의 메소드를 이용하여 값을 전달한다. 
      -프래그먼트를 불러올 때 findFragmentById를 이용해 불러온다. 여기서 id는 프래그먼트 레이아웃 자체의 id값이 아닌 메인 엑티비티에서 프래그먼트를 담은 프래그먼트 컨테이너의 아이디를 말한다.
      override fun onButtonClick(textSize: Int, text: String) {
          val textFragment = supportFragmentManager.findFragmentById(R.id.TextFragmentContainerView)as TextFragment
          textFragment.textSet(textSize,text)
      }​
Comments