이곳저곳 관심이 많아요
11. Fragment 본문
- 엑티비티에서 프래그먼트 불러오기
- 메인 레이아웃 파일에 프래그먼트 컨테이너를 생성한다.
- 메인 엑티비티에서 프래그먼트 컨테이너를 불러온다.
val fragmentContainer: View = findViewById(R.id.fragmentContainerView)
- 프래그먼트를 불러오기 전, 프래그먼트 컨테이너에 이미 프래그먼트가 있다면 불러오지 않는다.
if(savedInstanceState != null){ //이전에 저장된 프래그먼트 있으면 return //프래그먼트 추가 안해도됨 }
- 프래그먼트매니저를 이용해서 프래그먼트를 불러온다.
supportFragmentManager.beginTransaction() .add(R.id.fragmentContainerView,FragmentA()) .addToBackStack(null) .commit()
- 프래그먼트에서 호스팅 엑티비티랑 통신하는 법
- 프래그먼트에 인터페이스를 생성한다 : 상황에 따라 인터페이스와 메소드는 바뀜
interface ButtonListener{ fun onButtonClick() }
- 프래그먼트에 구현한 인터페이스를 호스팅 엑티비티가 상속받는다.
class MainActivity : AppCompatActivity(), FragmentA.ButtonListener { override fun onButtonClick() { }
- 엑티비티에서 인터페이스 메소드를 구현해준다.
override fun onButtonClick() { supportFragmentManager.beginTransaction() .add(R.id.fragmentContainerView,FragmentB()) .addToBackStack(null) .commit() }
- 프래그먼트에 엑티비티 콜백 메소드를 생성한다. 타입은 인터페이스
var activityCallBack:ButtonListener? = null
- 프래그먼트에서 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") } }
- 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 문자열 값과 폰트 사이즈 설정하기- ToolBarFragment에 인터페이스를 생성, 메소드 파라미터를 폰트사이즈, 텍스트 값으로 설정해줌
interface TollBarListener{ fun onButtonClick(textSize:Int,text:String) }
- 메인엑티비티에서 상속받음
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) }
- 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") } }
- 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 }
- 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() } }
- 메인엑티비티에서 TextFragment의 메소드를 이용하여 값을 전달한다.
-프래그먼트를 불러올 때 findFragmentById를 이용해 불러온다. 여기서 id는 프래그먼트 레이아웃 자체의 id값이 아닌 메인 엑티비티에서 프래그먼트를 담은 프래그먼트 컨테이너의 아이디를 말한다.
override fun onButtonClick(textSize: Int, text: String) { val textFragment = supportFragmentManager.findFragmentById(R.id.TextFragmentContainerView)as TextFragment textFragment.textSet(textSize,text) }
- ToolBarFragment에 인터페이스를 생성, 메소드 파라미터를 폰트사이즈, 텍스트 값으로 설정해줌
'Programming > Android' 카테고리의 다른 글
10. Intent : MainActivity <-> SubActivity 최종 (0) | 2021.12.05 |
---|---|
11. RecyclerView : 리사이클러뷰 전체정리, ViewModel 적용 (0) | 2021.12.03 |
10. Intent : Implicit intent (0) | 2021.11.05 |
10. Intent : MainActivity -> SubActivity 값 전달 (0) | 2021.11.05 |
Comments