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

좌석예약앱 코딩중 setBackgroundColor 오류문의

0 추천
package com.example.theater;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText row,col;
    Button btn1;
    TextView textResult;
    int[][] seat, board;
    int i,j,pax;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        row = findViewById(R.id.row);
        col = findViewById(R.id.col);
        btn1 = findViewById(R.id.btn1);
        textResult = findViewById(R.id.textResult);
        i = Integer.parseInt(row.getText().toString());
        j = Integer.parseInt(col.getText().toString());
        pax=25;

        board = new seat[5][5];

        int[][]boardId={{R.id.seat11, R.id.seat12, R.id.seat13, R.id.seat14, R.id.seat15},
                        {R.id.seat21, R.id.seat22, R.id.seat23, R.id.seat24, R.id.seat25},
                        {R.id.seat31, R.id.seat32, R.id.seat33, R.id.seat34, R.id.seat35},
                        {R.id.seat41, R.id.seat42, R.id.seat43, R.id.seat44, R.id.seat45},
                        {R.id.seat51, R.id.seat52, R.id.seat53, R.id.seat54, R.id.seat55}};

            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    this.board[i][j] = (seat) findViewById(boardId[i][j]);
                }
            }
            btn1.setOnClickListener(v -> {

                while (pax > 0) {
                    if ((j > 5 || j < 1) || (i > 5 || i < 1)) {
                        Toast.makeText(getApplicationContext(), "잘못된 입력입니다. 다시 입력하세요.", Toast.LENGTH_LONG).show();
                        continue;
                    }

                    if (seat[j - 1][i - 1] == 0) {
                        board[i][j].setBackgroundColor(Color.parseColor("#FF0000"));
                        seat[j - 1][i - 1] = 1;
                    } else {
                        Toast.makeText(getApplicationContext(), "예약이 완료된 자리입니다. 다시 예약하세요.", Toast.LENGTH_LONG).show();
                    }
                }
            }
            );
        }}

이제 막 배우기 시작한 초보라 많이 부족합니다 ㅠㅠ...

2차원배열로 행이랑 열을 입력받아 좌석예약되면 해당좌석 색을 바꾸고 싶은데...

31열에 cannot resolved symbol 'seat'

53열에 Cannot resolve method 'setBackgroundColor(int)'

이렇게 나옵니다...  뭐가 문젠지 감도안오네요...도와주세요 ㅠㅠ....

 

비니온 (210 포인트) 님이 2022년 8월 20일 질문

1개의 답변

+1 추천
 
채택된 답변

board는 int array 타입입니다. 따라서 board[i][j]는 int 타입만 할당할 수 있습니다. findViewById는 View타입을 리턴합니다. 따라서 아래 구문은 에러입니다.

this.board[i][j] = (seat) findViewById(boardId[i][j]);

 

board선언부를 아래처럼 맞는 타입으로 바꾸세요.

seat[][] board;

List<Seat>타입이 이중 배열 보다는 이해하시기가 편할거 같아요.

private List<Seat> board = new ArrayList<>();


private void initSeats() {
   board.clear();
   for (int boardId : boardIds) {
       board.add(findViewById(boardId);
   }

   btn1.setOnClickListener(v -> seatClicked(); );
 
                while (pax > 0) {
                    if ((j > 5 || j < 1) || (i > 5 || i < 1)) {
                        Toast.makeText(getApplicationContext(), "잘못된 입력입니다. 다시 입력하세요.", Toast.LENGTH_LONG).show();
                        continue;
                    }
 
                    if (seat[j - 1][i - 1] == 0) {
                        board[i][j].setBackgroundColor(Color.parseColor("#FF0000"));
                        seat[j - 1][i - 1] = 1;
                    } else {
                        Toast.makeText(getApplicationContext(), "예약이 완료된 자리입니다. 다시 예약하세요.", Toast.LENGTH_LONG).show();
                    }
                }
            }
            );
}

private void seatClicked() {
    Integer position = getSeatPosition();
    if (position == null || position >= board.size) {
        Toast.makeText(getApplicationContext(), "잘못된 입력입니다. 다시 입력하세요.", Toast.LENGTH_LONG).show();
        return;
    }

    updateBookingState(board.get(position));
}

private void updateBookingState(Seat seat) {
    if (seat.isBooked()) {
          Toast.makeText(getApplicationContext(), "예약이 완료된 자리입니다. 다시 예약하세요.", Toast.LENGTH_LONG).show();
          return;
    }

   seat.isBooked(true); // isBooked 메소드에서 자동으로 백그라운드를 바꾸도록 코드를 추가.
}

private Integer getSeatPosition() {
     int colNo;
    int rowNo;
    try {
          colNo = Integer.parseInt(col.getText().toString());
          rowNo = Integer.parseInt(row.getText().toString());
    } catch (NumberFormatException | NullPointerException e) {
         return null;
   }
     
  return (colNo-1)%5 + ((rowNo-1)%5) * 5;
}

Seat를 기존뷰를 확장해서 isBooked 메소드를 추가하시고 그 안에서 백그라운드색을 변경하도록 하시면 좋을 것 같습니다.
가능하다면, 더 나아가 Board라는 커스텀 컴포넌트를 만드셔도 될 것 같구요. Seat를 만들어주고 클릭이벤트를 받는 부분들을 집어넣으면 좋을 것 같습니다.

spark (225,780 포인트) 님이 2022년 8월 21일 답변
비니온님이 2022년 8월 23일 채택됨
이중배열대신 List<Seat> 타입을 사용하시는 것도 고려해 보세요.  List내에서의 아이템 위치만 구하면 처리가 훨씬 간단해 집니다. 아이템 위치는 아래처럼 구할 수 있을 것 같습니다.
int boardSize = 5
(colNo-1)%boardSize + ((rowNo-1)%boardSize) * boardSize

추가적으로, 데이터(상태)의 관리는 뷰가 아니라 별도의 모델이 가지도록 하는게 좋습니다. 이 데이터 모델을 가지고 뷰를 그리도록 하는게 UI 프로그래밍에서 중요합니다. 이렇게 해야 추가적인 변경사항이 생길 때 대응하기가 훨씬 유연합니다. 따라서 Seat, Board는 화면에 필요한 데이터나 필요한 메소드만 가진 클래스로 만들고 SedtView, BoardView는 이 데이터 모델을 단순히 업데이트하는 뷰로 만드는게 추후 필요할 것으로 보입니다.
참고로, 님이 만드신  layout은 RecyclerView + GridLayout이나 TableLayout을 쓰셔도 될 것  같아 보이네요.
상세한 답변 정말 감사합니다! board[i][j]의 findViewById 부분은 생각지도 못했는데 많이 배우고 가네요 ㅎㅎ...  spark님 말씀처럼 list로 작성하는게 저도 훨씬 좋을거같은데 해당 예제 조건자체가 2차원 배열이라서요ㅠㅠ.... 2차원 배열이 저한테 아직 확실하게 개념이 잘 잡혀있지 않아서 더 작성하기가 어려운듯하네요...
2차원배열로는 어떻게 진행해야될까요? 수정이 많이 필요하겠죠? ㅠㅠ
...