ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 뷰 바인딩(View Binding)
    Android 2024. 4. 11. 21:03

     

    우리는 기존에 액티비티에서 xml 로부터 뷰를 참조할때 findViewById 를 이용해왔다.

     

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 
        ...
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/myTextView"
            ...
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/myButton"
            ...
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/myTextView" />
    
    
    </androidx.constraintlayout.widget.ConstraintLayout>

     

    Button 을 누르면 해당 TextView 가 "버튼이 눌렸습니다!" 로 바꿔보는 기존 코틀린 코드는 아래와 같다.

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val btn = findViewById<Button>(R.id.myButton)
            val mytext = findViewById<TextView>(R.id.myTextView)
            
            btn.setOnClickListener { 
                mytext.text = "버튼이 눌렸습니다!"
            }
        }
    }

     

    매번 xml 파일로부터 뷰를 가져올때 findViewById 속성을 써야하고, 뷰 위젯의 타입도 같이 가져와야한다.

    이러한 귀찮음을 해결한 것이 바로 뷰 바인딩(View Binding) !!!

     

    뷰 바인딩의 기본 세팅은 다음과 같다.

    // 방법1
    class MainActivity : AppCompatActivity() {
        private lateinit var binding: ActivityMainBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
        }
    }

     

    만약에 레이아웃 파일이 activity_main.xml 이면 언더바 빼고, 각 단어의 앞글자를 대문자로 가져오고 뒤에 binding을 붙여 바인딩 이름을 만든다. (AcitivtyMainBinding)

     

    // 방법2
    class MainActivity : AppCompatActivity() {
    
        private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
        }
    }

     

    상수에 사용하는 by lazy로 지연초기화를 해주면 한줄안에 작성가능하다! (후자가 더 편한 것 같다)

     

    이후 생성한 바인딩으로 xml 파일의 뷰 위젯을 전보다 더 편하게 가져올 수 있다.

    ...
    setContentView(binding.root)
    binding.myButton.setOnClickListener { 
        binding.myTextView.text = "버튼이 눌렸습니다!"
    }

     

     

Designed by Tistory.