Kotlin
[안드로이드 스튜디오] tablayout의 tabitem 사용시 java.lang.NullPointerException: Missing required view with ID
java.lang.NullPointerException: Missing required view with ID tablayout의 tabitem ID를 지정하는 경우 위와 같은 오류가 뜬다. 마테리얼 라이브러리를 사용하는 경우 발생하는 버그로 tabitem의 ID를 삭제해주면 해결된다. 참조: https://github.com/material-components/material-components-android/issues/1162 [Tab Items] Tab Items does not work with View Binding, throws NPE · Issue #1162 · material-components/material-components-andr Description: Filing this in..
[안드로이드 스튜디오] Missing contentDescription attribute on image
Missing contentDescription attribute on image 대강 이미지의 contentDescription 특성이 없으니까 추가해달라는 얘기다. 참조: https://support.google.com/accessibility/android/answer/7158690?hl=en When using an ImageView, ImageButton, CheckBox, or other View that conveys information graphically, use an [android:contentDescription]() attribute to provide a content label for that View. A content label sometimes depends on inf..
[Android Studio] Hardcoded string "muyaho", should use '@string' resource
코틀린에서 자주 보는 경고 메세지다. Hardcoded string "muyaho", should use '@string' resource 하드코딩된 문자열은 @string 리소스를 써야한다는 말인데, 하드코딩이란 하드코드로 코드를 작성하는 것을 말한다. 쉽게 말해 변수나 참조를 사용하지 않고 데이터를 코드에 냅다 박아버리는 걸 하드코딩이라고 한다. 후에 유지보수할 생각이 있다면 하드코딩은 지양하자. Alt+Shift+Enter를 눌러서 string.xml에 추가하면 된다. 다른 건 건드릴 필요 없이 OK 클릭 짜잔. values 폴더의 strings.xml을 열어보면 이렇게 추가된 걸 볼 수 있다.
[Kotlin] findViewById & kotlin-android-extensions & viewBinding
findViewById & kotlin-android-extensions 자바에서는 뷰를 불러올 때 아래와 같이 findViewById()를 써야했다. val myView = findViewById(R.id.myView) myView.setImageResource(R.mipmap.ic_launcher) 하지만 코틀린은 아래와 같이 간결하게 쓸 수 있었다. myView.setImageResource(R.mipmap.ic_launcher) 왜 과거형이냐면, 안드로이드 스튜디오 4.1 버전과 그 이후로는 kotlin-android-extensions 플러그인을 기본적으로 제공하지 않기 때문이다. 만약 굳이 사용하고 싶다면 build.gradle 파일에 아래와 같이 직접 추가해주면 된다. plugins { id..
[Kotlin] ConstraintLayout 동적으로 제어하기
constraintlayout을 코틀린에서 런타임에 동적으로 제어해보자. 이때 binding은 뷰 바인딩 인스턴스이다. 전체코드 val constraintLayout = binding.root val constraintSet = ConstraintSet() constraintSet.clone(constraintLayout) constraintSet.connect(binding.eyes.id, ConstraintSet.TOP, binding.face.id, ConstraintSet.TOP, 200) constraintSet.connect(binding.eyes.id, ConstraintSet.START, binding.face.id, ConstraintSet.START, 10) constraintSet.a..