반응형
Android 를 Java 로만 개발했었는데, Kotlin 으로 갈아타기 위해
이것저것 테스트 해보며 필요한것만 남기려고 포스팅합니다.
따라하기가 아닌, 한번 쓱~ 훑어보듯이 보면 좋을듯 합니다.
요약
Java | TextView textView = findViewById(R.id.main_test_button); |
Kotrlin | 1) val textView: TextView = findViewById(R.id.main_test_button) 2) val textView = findViewById<TextView>(R.id.main_test_button) 3) ViewBinding 사용 ★ |
컴포넌트 가져오기
<TextView
android:id="@+id/main_test_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
이렇게 있다면,
val testTv = findViewById<TextView>(R.id.main_test_textview);
이렇게 하거나 또는,
val testTv: TextView = findViewById(R.id.main_test_textview);
둘다 가능합니다.
java 와 많이 차이나지 않네요.
TextView textView = 으로 하는것 말고는..
그런데! extension 이라는게 있네요!
build.gradle 에 plugins 에 추가해야할 것이 있습니다.
그리고 아까 activity_main.xml 에서 textview 의 id 를 그대로 소스에서 씁니다.
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
main_test_textview.setText("Hello~ Bryan!");
}
전역으로 쓸수 있습니다.
앗, 이건 deprecated 될 예정이라고 하는데요,
관련 내용 링크
ViewBinding 을 사용해야 겠네요.
build.gradle (module) 에 viewBinding true 있는지 확인. (기본으로 들어가있네요,)
android {
compileSdk 31
// 생략..
buildFeatures {
viewBinding true
}
}
Activity ViewBinding
ActivityMain.kt 에서 class 변수로
private lateinit var binding: ActivityMainBinding
그리고 onCreate 에서
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
// activity_main.xml 에서 TextView 의 id 가 android:id="@+id/main_title_textview"
// snake case 를 camel case 로 바꾸면 됩니다.
// main_title_textview -> mainTitleTextView
binding.mainTitleTextView.text = "Hello~ Bryan~";
// 생략..
}
Fragment ViewBinding
private var _binding: FragmentLightBinding? = null
private val binding get() = _binding!!
layout file name 이 fragment_light.xml 이면 _binding에 FragmentLight + Binding 으로 쓰면 됩니다.
fragment_light -> FragmentLightBinding
// 주입
_binding = FragmentLightBinding.inflate(inflater, container, false)
destroy
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
전체 소스
import com.bryan.selfdentlight.databinding.FragmentLightBinding
class LightFragment : Fragment() {
private var _binding: FragmentLightBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentLightBinding.inflate(inflater, container, false)
val view = binding.root
binding.lightFragFinishButton.setOnClickListener{
activity?.supportFragmentManager?.beginTransaction()?.remove(this)?.commit()
}
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
[참고] kotlin 코드로 이것저것 테스트 해볼 수 있는, 플레이그라운드 링크
728x90
반응형
'Android' 카테고리의 다른 글
[Android] Java 에서 Kotlin 으로 넘어가기 3. Intent (Splash, Activity 이동) (0) | 2022.02.23 |
---|---|
[Android] Java 에서 Kotlin 으로 넘어가기 2. OnClick (0) | 2022.02.23 |
[Android] api29 이상. MediaStore DATE_MODIFIED 을 날짜 형식으로 가져오기 (0) | 2020.09.12 |
[Android] (androidx) Vertical SeekBar (세로 Seekbar) (0) | 2020.07.22 |
[Android] List 를 String Join 할때 사용 팁 (0) | 2020.05.29 |
댓글