마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

스도쿠 앱, 클릭한 셀의 텍스트 변경

0 추천
안녕하세요. 스도쿠처럼 숫자가 들어가는 퍼즐 앱을 만들어보고 있습니다.

N x N 격자로 된 레이아웃 안에 여러 텍스트뷰를 넣고

아래 숫자키패드를 넣어 셀을 누르고 키패드의 숫자를 누르면 빈 텍스트뷰에 숫자가 입력되는 방식을 구현하고 싶습니다.

키패드까지는 그럭저럭 만들었으나, 선택한 텍스트뷰에 한정하여 입력할 수 있게 하려면 어떻게 해야하나요?

도움 부탁드립니다. 감사합니다.
고래가그랬어 (190 포인트) 님이 2021년 4월 15일 질문

1개의 답변

+1 추천

Activity에서 getCurrentFocus를 호출해 보세요. 이게 안된다면 현재 선택된 View를 클래스 멤버 변수 같은 걸로 저장하셔야 겠죠.  SudokuView를 CustomView형태로 만들어서 CustomView가 필요한 정보를 리턴할 수 있도록 할 수도 있구요.

가능하시다면 뷰에 로직을 넣지 마시고 게임로직을 처리하는 클래스를 별도로 두고 거기서 게임에 필요한 데이터를 처리하시고 뷰는 단지 변경된 데이터를 반영해 주는 역할만 하도록 구성하는 것이 코드를 관리하기에 훨씬 좋습니다.

기본 아이디어는 아래처럼 시작할 수 있을 것 같네요.

class SudokuGame {

     private lateint var grid: SudokuGrid

    
     init {
         createGame()
     }

     fun createGame() {
         puzzle = SudokuGrid(
            //SudokuCell 초기화
         )
     }

    fun selectCell(col: Int, row: int) {
        grid.selectCell(col, row)
    }
}

data class CellsPos(val col: Int, val row: int)

data class SudokuCell(
   val number: Int,
   val isSelected: Boolean = false
)

class SudokuGrid(
    private val cells: HashMap<CellsPos, SudokuCell>
) {
    fun selectCell(col: int, row: int) {
         val selectedCell = cells[CellPos(col, row)] ?: return
         cells[CellPos(col, row)]  = selectedCell.copy(isSelected = true)
    }
}

//Activity

private val game  = SudokuGame()

val gamboard: SudokuGameBoard = ...
gamboard.setOnClickListener { view: SudokuCellView, col: Int, row: Int ->
       game.selectSell(col,row)
}

 

spark (227,530 포인트) 님이 2021년 4월 15일 답변
spark님이 2021년 4월 15일 수정
정말정말정말 감사합니다!
...