본문 바로가기
개발/kotlin

[kotlin] 로또번호 랜덤 생성기 - 3 (Activity 작업)

by 1인용 놀이터 2025. 5. 29.
728x90
반응형

https://dev-playground.tistory.com/11

 

[Kotlin] 로또번호 랜덤 생성기 - 1(프로젝트 생성)

kotlin 처음 해보는 필자가 구글링으로 알음알음 따라 만드는 과정임.된다는 보장 없음. 정확한 코딩이라는 보장 없음. 코틀린 1도 모르는 필자이지만, 그래도 내가 원하는 기능은 다 넣고 싶은

dev-playground.tistory.com

 

https://dev-playground.tistory.com/56

 

[Kotlin] 로또번호 랜덤 생성기 - 2 (Layout 파일 생성)

로또번호 랜덤 생성기 - 2 (Layout 파일 생성) # Layout 구성화면을 MainActivity와 랜덤 번호가 추출 된 화면으로 나눠서 개발 예정랜덤 번호 추출은 로또 번호 기준으로 번호 6개 묶음을 7개 정도 한번에

dev-playground.tistory.com

 

로또번호 랜덤 생성기 - 3 (Activity 작업)

 

MainActivity 내 로또와 연금복권 Activity로 이동 가능한 Button 생성

Activity 와 XML 연결은 view binding을 이용하여 설정.

 

MainActivity.kt

바인딩 클래스 이름 규칙에 따라 activity_main.xml 을 ActivityMainBinding으로 설정한다.

바인딩 클래스에 inflate는 xml에 있는 뷰를 객체화 해주는 셈이다.

private var mBinding: ActivityMainBinding? = null
private val binding get() = mBinding!! // null

    private lateinit var lottoMainBtn : Button
    private lateinit var pensionMainBtn : Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        setContentView(R.layout.activity_main)

		// 위의 R.layout.activity_main이 아닌 view binding을 이용하여 xml 설정
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        // view binding 이용하여 xml 설정하면 하위 view의 ID를 이용해서 접근 가능
        binding.idLottoMainBtn.setOnClickListener(randomLotto)

        initButton()
    }

 

바인딩 클래스 이름은 규칙이 정해져 있다.

Activity 이름 Binding 클래스 이름
MainActivity ActivityMainBinding
SubActivity ActivitySubBinding
XXXActivity ActivityXXXBinding

 

 fun initButton() {

    lottoMainBtn = binding.idLottoMainBtn
    pensionMainBtn = binding.idPensionMainBtn

    lottoMainBtn.setOnClickListener(randomLotto)
    pensionMainBtn.setOnClickListener(randomPension)

}
    
    val randomLotto = View.OnClickListener {
        val intent = Intent(this, RandomLottoActivity::class.java)
        //startService(intent)
        startActivity(intent)
}

 

onCreate()에서 선언한 initButton()으로 각 button에 view binding 및 클릭 시 이벤트 설정.

로또 번호는 service 없이 activity 내에서 랜덤 숫자를 돌릴 예정이라 intent 에 다음 activity를 설정해 준다.

 

 

RandomLottoActivity.kt

lotto_activity.xml -> LottoActivityBinding 으로 binding 설정.

1~45까지 번호 동적으로 생성 하여 담을 부모가 되는 View GridLayout 선언.

랜덤으로 추출해서 동적으로 생성 할 list 선언 및 선택한 번호를 담는 list 선언

최종적으로 번호 7개가 보여지는 부모 View인 LinearLayout 선언

 class RandomLottoActivity : AppCompatActivity() {
 	private lateinit var binding: LottoActivityBinding
    private lateinit var gridLayout: GridLayout // 1~45 까지 번호의 부모 layout
    private lateinit var linearLayout: LinearLayout // 최종 7개 번호의 부모 layout
    private val selectNumber = mutableListOf<Int>() // 선택 된 번호 리스트
    private val randomNumber = mutableListOf<Int>() // 랜덤으로 추출한 번호 리스트
    private val listNumber = mutableListOf<Int>() // 최종 7개 번호 리스트

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = LottoActivityBinding.inflate(layoutInflater)
        gridLayout = binding.selectNumber
        linearLayout = binding.linearLayout
        setContentView(binding.root)

        selectNumberView()

	// 랜덤 추출 버튼
        binding.randomBtn.setOnClickListener {
            lottoRandomNumber()
            binding.randomBtn.isEnabled = false

        }

	// 번호 초기화 버튼
        binding.resetBtn.setOnClickListener {
            listNumber.clear()
            selectNumber.clear()
            randomNumber.clear()
            linearLayout.removeAllViews()
            binding.randomBtn.isEnabled = true
        }
    }
}

 

랜덤으로 번호 추출이 완료되면 랜덤 추출버튼 비활성화 및 초기화 버튼 클릭시 랜덤버튼 비활성화 해제.

초기화 버튼 선택 시 각 list를 초기화 작업과, LinearLayout 초기화.

 

    // 1~45까지 그리기 및 번호 선택
    fun selectNumberView() {
        for(i in 1..45) {
            val textView = TextView(this).apply {
                text = i.toString()
                drawBackground(i, this)
                gravity = Gravity.CENTER

                setOnClickListener {
                    selectNumber(i)
                    listNumber.add(i)
                }
            }

            var layoutParams = GridLayout.LayoutParams().apply {
                width = 0
                height = GridLayout.LayoutParams.WRAP_CONTENT
                columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f)
                setMargins(5)
            }

            textView.layoutParams = layoutParams
            gridLayout.addView(textView)
        }
    }

    // 선택 또는 랜덤 번호 그리기
    fun selectNumber(selectNum: Int) {
        val textView = TextView(this).apply {
            text = selectNum.toString()
            drawBackground(selectNum, this)
            gravity = Gravity.CENTER

        }
        var params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT)

        params.setMargins(5)

        textView.layoutParams = params
        linearLayout.addView(textView)
    }

    // 번호별 background 그리기
    fun drawBackground(temp:Int, view: TextView) {
        when(temp) {
            in 1..10 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_yellow)
            in 11..20 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_green)
            in 21..30 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_red)
            in 31..40 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_blue)
            else  -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_gray)
        }
    }

    // 최종 7개 번호 그리기
    fun numberListView() {
        for(i in listNumber.indices) {
            selectNumber(listNumber[i])
        }
    }

    // 랜덤 번호
    fun lottoRandomNumber() {
        val randomNum = Random()

        for(i in 0..(6 - listNumber.size)) {
            val random = randomNum.nextInt(45) + 1
            if(!randomNumber.contains(random) && !listNumber.contains(random)) {
                randomNumber.add(random)
            }
        }
        numberResult()
    }

    // 랜덤 번호 리스트화
    fun numberResult() {
        listNumber.clear()
        if(randomNumber.isNotEmpty()) {
            for(i in randomNumber.indices) {
                listNumber.add(randomNumber[i])
            }
        }
        numberListView()
    }

 

번호 선택과 버튼 클릭 시 동작을 담은 함수들.

이상한 부분이나 궁금하신 부분 있으면 댓글로 부탁드립니다.

고수님들의 조언도 감사히 듣겠습니다.

728x90
반응형