로또 번호 생성기 만들기
private val clearButton by lazy { findViewById<Button>(R.id.btn_clear) }
private val addButton by lazy { findViewById<Button>(R.id.btn_add) }
private val runButton by lazy { findViewById<Button>(R.id.btn_run) }
private val numPick by lazy { findViewById<NumberPicker>(R.id.np_num) }
clearButton by lazy{} : 초기화 버튼(btn_clear) 지정
addButton by lazy{} : 번호 추가하기 버튼(btn_add) 지정
runButton by lazy{} : 자동 생성 시작 버튼(btn_run) 지정
numPick by lazy{} : 번호 생성기(np_num)
private val numTextViewList : List<TextView> by lazy {
listOf<TextView>(
findViewById(R.id.tv_num1)
,findViewById(R.id.tv_num2)
,findViewById(R.id.tv_num3)
,findViewById(R.id.tv_num4)
,findViewById(R.id.tv_num5)
,findViewById(R.id.tv_num6))
}
: xml로 작성해둔 6가지 원 모양의 도형들을 차례대로 작성한 것
private var didRun = false
private val pickNumSet = hashSetOf<Int>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
numPick.minValue = 1
numPick.maxValue = 45
initRunButton()
initAddButton()
initClearButton()
}
didRun = false : Run 버튼을 아직 누르지 않았으니 초기값은 false로 지정
hashSetOf<Int>()를 이용하여 정수형 자료를 정렬
번호 생성기에 최소값(minValue) 1과 최대값(maxValue) 45 사이의 숫자만 나오도록 지정
<AddButton> 코드 내용
private fun initAddButton() {
addButton.setOnClickListener {
when {
didRun -> showToast("초기화 후에 시도해주세요.")
pickNumSet.size >= 5 -> showToast("숫자는 최대 5개까지 선택할 수 있습니다.")
pickNumSet.contains(numPick.value) -> showToast("이미 선택한 숫자입니다.")
else -> {
val textView = numTextViewList[pickNumSet.size]
textView.isVisible = true
textView.text = numPick.value.toString()
setNumBack(numPick.value, textView)
pickNumSet.add(numPick.value)
}
}
}
}
didRun -> showToast("초기화 후에 시도해주세요.")
: 자동 생성 버튼을 누르고 난 후 AddButton을 누르면 "초기화 후에 시도해주세요"라는 문구가 나오도록 한다.
pickNumSet.size >= 5 -> showToast("숫자는 최대 5개까지 선택할 수 있습니다.")
: 5개 이상의 숫자를 추가하고 또 추가하려는 경우 "숫자는 최대 5개까지 선택할 수 있습니다." 라는 문구가 나오도록 한다.
pickNumSet.contains(numPick.value) -> showToast("이미 선택한 숫자입니다.")
: 이미 추가한 숫자를 또 추가하려고 할 경우 "이미 선택한 숫자입니다."라는 문구가 나오도록 한다.
else -> {
val textView = numTextViewList[pickNumSet.size]
textView.isVisible = true
textView.text = numPick.value.toString()
setNumBack(numPick.value, textView)
pickNumSet.add(numPick.value)
}
: 위 3가지 경우가 모두 아니라면 선택한 숫자가 textView(원형)과 같이 보여지도록 한다.
private fun setNumBack(number: Int, textView: TextView) {
val background = when (number) {
in 1..10 -> R.drawable.circle_yellow
in 11..20 -> R.drawable.circle_blue
in 21..30 -> R.drawable.circle_red
in 31..40 -> R.drawable.circle_gray
else -> R.drawable.circle_green
}
textView.background = ContextCompat.getDrawable(this, background)
}
: 숫자가 1~10 사이면 노란색, 11~20은 파란색, 21~30은 빨간색, 31~40 초록색, 그 외는 초록색 원이 숫자 뒷 배경으로 보이도록 한다.
<ClearButton> 코드 내용
private fun initClearButton() {
clearButton.setOnClickListener {
pickNumSet.clear()
numTextViewList.forEach { it.isVisible = false }
didRun = false
numPick.value = 1
}
}
: 초기화 버튼을 눌렀을 때 숫자들이 전부 지워지고 didRun도 초기화 되어 초기값인 false로 돌아간다.
<RunButton> 코드 내용
private fun initRunButton() {
runButton.setOnClickListener {
val list = getRandom()
didRun = true
list.forEachIndexed { index, number ->
val textView = numTextViewList[index]
textView.text = number.toString()
textView.isVisible = true
setNumBack(number, textView)
}
}
}
: getRandom()에서 list를 가지고 오고, 가져온 text는 자료형으로 전환되며 바로 숫자들이 보여지도록 한다.
<getRandom> 코드 내용
private fun getRandom(): List<Int> {
val numbers = (1..45).filter { it !in pickNumSet }
return (pickNumSet + numbers.shuffled().take(6 - pickNumSet.size)).sorted()
}
: I1~45의 숫자 중 6가지의 숫자를 랜덤으로 뽑고 그 이후 sorted()를 통해 6가지의 숫자를 차례대로 정렬하여 보여준다.
'Android 앱개발 공부 > TIL(Today I Learned)' 카테고리의 다른 글
[Android] TIL 8일차 (0) | 2024.05.30 |
---|---|
[Android] TIL 7일차 (0) | 2024.05.29 |
[Android] TIL 5일차 (0) | 2024.05.27 |
[Android] TIL 4일차 (2) | 2024.04.18 |
[Android] TIL 3일차 (0) | 2024.04.17 |