
내가 만든 프로젝트의 경우 동물을 담을 리스트를 MainActivity에서 생성했는데
강사님은 따로 Util클래스를 만들어 컴패니언 오브젝트에다가 리스트를 생성해서 사용을 했다.
체크할 개별 버튼에 이벤트를 주는 대신
버튼 그룹의 check()메서드를 이용
체크할 버튼의 id를 넣어준다.
ex) buttonGroupInputGender.check(R.id.buttonInputGender1)
fun setEvent(){
activityInputBinding.apply {
// 동물 타입 버튼 그룹
buttonGroupInputType.addOnButtonCheckedListener { group, checkedId, isChecked ->
// 전부 다 안보이는 상태로 변경한다.
containerInputType1.isVisible = false
containerInputType2.isVisible = false
containerInputType3.isVisible = false
// 현재 체크되어 있는 버튼에 따라 보여지는 부분을 달리한다.
when(buttonGroupInputType.checkedButtonId){
// 사자
R.id.buttonInputType1 -> {
containerInputType1.isVisible = true
}
// 호랑이
R.id.buttonInputType2 -> {
containerInputType2.isVisible = true
}
// 기린
R.id.buttonInputType3 -> {
containerInputType3.isVisible = true
}
}
}
}
}
ios에서는 포커스여부에 따라 키보드가 자동으로 올라오고 내려간다
하지만 안드로이드에서는 포커스 여부와 별개로 키보드를 올리고 내리는걸 직접 해줘야 한다.
버튼 선택에따라 보여졌다 가려지는 input요소의 경우, 포커스가 되었다가 사라진다음 다시 나타났을때 포커스도 사라진다. 이때 올라와있던 키보드는 내려가지 않고 그대로 올라와 있는 상태라 키보드를 눌러도 아무런 입력이 일어나지 않는다.
따라서 포커스가 사라졌을 때 키보드를 내려주는 코드를 직접 작성해주면 된다.
반대로 사용자의 터치가 아니라 프로그래머가 포커스를 주고 키보드를 올려주는 작업도 코드로 직접 작성이 필요하다.
Util.kt 클래스파일로 작성하여 companion object로 작성한다.
class Util {
companion object{
// 포커스를 주고 키보드를 올려주는 메서드
fun showSoftInput(view: View, context:Context){
// 포커스를 준다.
view.requestFocus()
thread {
SystemClock.sleep(1000)
val inputMethodManager = context.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(view, 0)
}
}
// 키보드를 내려주는 메서드
fun hideSoftInput(activity:AppCompatActivity){
// 현재 포커스를 가지고 있는 view가 있다면 키보드를 내린다.
if(activity.window.currentFocus != null){
val inputMethodManager = activity.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(activity.window.currentFocus?.windowToken, 0)
}
}
}
}
등록 화면으로 이동 시 이름 입력칸에 자동으로 포커스를 주고 키보드를 올리도록 설정
// View들의 초기 상태를 설정한다.
fun initView() {
activityInputBinding.apply {
// 이름 입력칸에 포커스를 준다.
Util.showSoftInput(activityInputBinding.textFieldInputName,this@InputActivity)
}
}

어떠한 정보를 전달하기 위해 필요한 정보를 담아놓은 것
기본적으로 액티비티는 context를 상속받음
따라서 context를 전달할 때 this@MainActivity를 전달하는 식으로 사용함

입력요소 초기화 시 slider의 최소값을 설정한 경우 숫자값을 직접 입력하기보다는 valueFrom 값으로 설정할 수 있다.
sliderInputWeight.value = sliderInputWeight.valueFrom
// View들의 이벤트 설정
fun setEvent(){
activityInputBinding.apply {
// 호랑이 몸무게 슬라이더
// 두 번째 : 현재 설정된 값
// 세 번째 : 코드가 아닌 사용자에 의해서 값이 변경될 경우 true를 전달해줌
sliderInputWeight.addOnChangeListener { slider, value, fromUser ->
// 텍스트 뷰에 출력한다.
textViewInputWeight.text = "몸무게 : ${value.toInt()}kg"
}
}
}

class Util {
companion object{
// 동물 객체들을 담을 리스트
val animalList = mutableListOf<Animal>()
}
}
class Util {
}
// 동물 종류
enum class AnimalType(num:Int, str:String){
ANIMAL_TYPE_LION(0,"사자"),
ANIMAL_TYPE_TIGER(1,"호랑이"),
ANIMAL_TYPE_GIRAFFE(2,"기린")
}
// 호랑이 성별
enum class TIGER_GENDER(num:Int, str:String){
TIGER_GENDER1(0,"암컷"),
TEGER_GENDER2(1,"수컷")
}
※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스