본문 바로가기

안드로이드 앱 스쿨 2기/Android

[11주차 - 월] CodeView

View 객체 생성하기

  • 코드를 통해 View 객체를 생성하여 layout에 추가할 수 있다.
  • View 객체를 생성할 때는 생성자에 Context 객체를 설정해줘야 한다.
  • Context는 어떠한 작업을 하기 위한 정보를 가지고 있는 객체를 통칭한다.
  • 안드로이드에서는 Activity가 Context를 상속받고 있기 때문에 this를 넣어주면 되고 그 외에는 Context를 구하는 다양한 메서드를 통해 설정한다.

LayoutParam

  • LayoutParam은 View가 배치될 때 필요한 공통 속성을 설정할 수 있는 객체이다.
  • 이를 통해 가로 세로 길이를 설정해 줘야 한다.

즉, 코드를 통해 View 객체를 만들고 코드로 View를 배치할 수 있다.

 

 

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="추가" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="문자열 가져오기" />

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="마지막 뷰 제거" />

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="모든 뷰 제거" />

    <LinearLayout
        android:id="@+id/mainContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"></LinearLayout>
</LinearLayout>

 

2. MainActivity

 

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    // 생성된 뷰들을 담을 리스트
    val viewList = mutableListOf<EditText>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run {
            button.setOnClickListener {
                // View의 가로세로 길이
                val params = ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT
                )

                // EditText를 생성한다.
                val newEditText = EditText(this@MainActivity)

                // 설정
                newEditText.layoutParams = params
                newEditText.hint = "문자열을 입력해주세요"

                viewList.add(newEditText)

                // 생성한 뷰를 추가한다.
                activityMainBinding.mainContainer.addView(newEditText)
            }

            button2.setOnClickListener {
                textView.text = ""
                // 리스트에 들어 있는 뷰의 수 만큼 반복한다.
                for(v1 in viewList){
                    textView.append("${v1.text.toString()}\n")
                }
            }

            button3.setOnClickListener {
                // removeViewAt : 순서를 지정하여 제거 (여기서는 마지막을 제거) - 이렇게 하는게 더 좋다
                // activityMainBinding.mainContainer.removeViewAt(viewList.size - 1)
                // viewList.removeLast()

                // removeView : View를 지정하여 제거 (여기서는 마지막을 제거)
                val lastView = viewList.last()
                activityMainBinding.mainContainer.removeView(lastView)
                viewList.removeLast()
            }

            button4.setOnClickListener {
                // 모든 뷰를 제거한다.
                activityMainBinding.mainContainer.removeAllViews()
                viewList.clear()
            }

        }

    }

}

 


[결과]

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님

'안드로이드 앱 스쿨 2기 > Android' 카테고리의 다른 글

[11주차 - 화] FileStream  (0) 2023.07.04
[11주차 - 화] Application Class  (0) 2023.07.04
[11주차 - 월] XMLView  (0) 2023.07.03
[11주차 - 월] DrawerLayout  (0) 2023.07.03
[10주차 - 수] TabLayout  (0) 2023.07.02