
findViewById 를 사용한다. ex) val textView:TextView = findViewById(R.id…)…..kotlin-android-extenstions를 사용하면 findViewById를 생략하고 간편하게 요소를 불러올 수 있다.kotlin-android-extenstions를 deprecated하고 ViewBinding을 사용하도록 안내하고 있다.ViewBinding을 활성화하면 각 xml 파일에 대해 ViewBinding 클래스를 상속받는 개별 뷰 바인딩 클래스가 자동으로 생성된다.
뷰 바인딩은 서로 다른 layout의 같은 ID를 가진 뷰를 정확히 구분할 수 있다. 만약 그럴 수 없을 경우 @Nullable로 만들어 사용할 수 없
게 한다.
findViewById를 사용할 경우 뷰에 잘못된 타입을 지정할우려가 있는데 뷰 바인딩에서는 그런 문제가 발생하지 않는다.차
참고 url
뷰 결합 | Android 개발자 | Android Developers
package com.getupmina.android.practice01
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import android.view.Menu
import android.view.MenuItem
import com.getupmina.android.practice01.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
val navController = findNavController(R.id.nav_host_fragment_content_main)
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
binding.fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment_content_main)
return navController.navigateUp(appBarConfiguration)
|| super.onSupportNavigateUp()
}
}
package com.getupmina.android.practice01
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.getupmina.android.practice01.databinding.FragmentFirstBinding
/**
* A simple [Fragment] subclass as the default destination in the navigation.
*/
class FirstFragment : Fragment() {
private var _binding: FragmentFirstBinding? = null
// viewBinding을 사용할 때 만들어지는 자원을 fragment를 사용하지 않을 때 자원을 반환할 수 있도록 nullable로 만들어준다.
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!! //실제로 사용하는 바인딩 변수를 만들어준다.
//2. 인스턴스가 만들어지면 바인딩이 생성됨
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentFirstBinding.inflate(inflater, container, false)
//1. 인스턴스가 만들어짐
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.buttonFirst.setOnClickListener {
findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
//null을 통해자원을 반환할 수 있도록 한다.
}
}
냉동코더의 알기 쉬운 Modern Android Development 입문 강의 - 인프런
출처 : 냉동코더의 알기 쉬운 Modern Android Development 입문
https://github.com/cliearl/book-search-app
Designed and developed by 2022 FrozenCoder
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.