Android/AddView

[Android] addView로 Layout에 View 추가하기

O_Gyong 2022. 11. 28.

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)

참고 자료

 

전체 코드

댓글