addView는 지정한 Layout에 동적으로 View를 추가할 수 있는 메서드이다.
addView를 사용하여 화면 순서 편집과 같은 기능을 구현할 수 있다.
코드상으로 View를 만들고 addView를 통해 Layout에 추가할 수 있지만,
이번에는 xml에서 View를 등록하고 Layout에 추가하려 한다.
다만 xml에서 View를 먼저 등록하게 되면 Parent View에 종속되기 때문에
addView를 사용하기 전에 해당 View의 부모 ViewGroup에서 removeView를 사용해야 한다.
예제로 버튼을 클릭하면 각 버튼에 해당하는 TextView를 LinearLayout에 추가하려고 한다.
예제 코드
class MainActivity : AppCompatActivity() {
private lateinit var mBinding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mBinding.root)
mBinding.btn1.setOnClickListener {
setAddView(mBinding.tv1)
}
mBinding.btn2.setOnClickListener {
setAddView(mBinding.tv2)
}
mBinding.btn3.setOnClickListener {
setAddView(mBinding.tv3)
}
}
private fun setAddView(tv: TextView) {
(tv.parent as ViewGroup).removeView(tv) // textView의 부모 뷰 그룹에서 textView 제거
mBinding.llMain.addView(tv) // LinearLayout에 textView 추가
tv.visibility = View.VISIBLE
}
}
LinearLayout에 추가하려는 TextView는 xml에 visibility를 gone으로 하여 생성한 상태이다.
버튼을 클릭했을 때 setAddView 메서드에 TextView를 전달한다.
부모 ViewGroup으로부터 removeView를 통해 전달받은 TextView와의 관계를 없애준다.
해당 동작을 하지 않으면 addView가 실행될 때 TextView가 이미 부모 View가 있다고 앱이 종료된다.
추가하려는 LinearLayout에 addView를 통해 전달받은 TextView를 추가하고,
TextView의 visibility를 visible로 변경한다.
View를 추가할 때 마지막에 쌓이는 것이 싫다면 addView의 인자 값으로 position을 추가할 수 있다.
→ addView(View child, int index)
댓글