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

안드로이드 스튜디오 자리 예약 데이터 가져와서 버튼 색 바꾸기

0 추천

 버튼 이름은 숫자로만으로 구성할 수 없어 b50처럼 하고 해당 버튼을 누르면 b50.setSelected(true)이면 검정색으로 바뀝니다. 그리고 파이어베이스에 seatcheck: true/ seatnum: 50이 저장됩니다. 

이렇게 눌린 버튼들이 저장-> 다시 들어왔을 때 파이어베이스에 seatCheck가 true이면 해당 seatnum을 가져와서 버튼에 적용해 검정색으로 바뀌게 하고 싶습니다. 

하지만 가져온 seatnum을 어떻게 버튼이랑 연결시켜서 색을 바꾸게 하는지 모르겠습니다.

b50.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        b50.setSelected(true);
        b51.setSelected(false);
        b52.setSelected(false);
k0kol (160 포인트) 님이 2022년 6월 7일 질문

1개의 답변

0 추천

먼저, 혹시 파이이베이스 사용에 대한 질문이시라면 아래 링크들을 참조하시구요.

https://firebase.google.com/docs/firestore/query-data/get-dat

https://github.com/firebase/firebase-android-sdk

https://github.com/firebase/quickstart-android

위의 링크들 정도면 파이어베이스 사용에는 큰 문제는 없으시리라 보구요.

파이이베이스에서 데이터를 읽어와서 어떻게 앱에 있는 버튼의 상태와 매핑을 하는데 어려움이 있으신 거면, 여기에는 수많은 방법이 존재할 수 있습니다. 저의 입장에서 당장 생각나는 옵션을 말씀드릴게요. 이건 공식적인 방법이 있는게 아니므로, 저의 개인적인 아이디어입니다.

먼저, 화면에 있는 좌석들을 디자인시에 만들 수도 있고, 런타임시에 생성해 줄 수도 있을 겁니다.

1. XML에 좌석이 이미 디자인 되어 있는 경우.

2. XML에 좌석을 동적으로 만드는 경우.

질문으로는 봐서는 XML에 이미 디자인이 되어 있으므로, 이걸 기준으로 말씀드리죠.

Collection을 사용하는 방법과 버튼의  tag를 사용하는 방법, Custom View 를 만들어 데이터를 매핑시키는 방법들을 사용해 볼 수 있을 것 같네요.

1. Collection

아래처럼 HashMap에 관련 정보를 매핑하거나

Map<String, View> seatMap = new HashMap<>();
seatMap.put("b50", b50);
seatMap.put("b51", b51);
seatMap.put("b52", b52);

2. List를 사용해서 할 수도 있습니다.

public class UiSeat {
    private final String id;
    private final Button view;
    // Constructor, Getter추가
}

List<UiSeat> seatList = Arrays.asList(
    new UiSeat("b50", b50),
    new UiSeat("b51", b51),
    new UiSeat("b52", b52),
);

그리고 버튼이 특정 레이아웃 아래에 있고 같은 뷰타입이라면, XML에 button의 tag에 id값을 지정한 후, 아래처럼 읽어올 수도 있을 것 같구요.

ViewGroup parentLayout = ...
for (int i = 0; i < parentLayout.getChildCount(); i++) {
    View child = parentLayout.getChildAt(i);
    if (view instanceof Button) {
       Button button = (Button) child;
        seatList.add(new UiSeat(button.getTag().toString(), button);
    }
}

 

3. 만약 커스텀뷰를 사용할 수 있다면 현재 사용하시는 버튼을 확장한 다음, 거기에 좌석에 대한 속성을 추가해서 사용하면 더 좋을 것 같습니다. 이게 가능하다면 저 같으면 이 옵션으로 사용할 것 같네요. 안드로이드 스튜디오에 커스텀뷰를 만드는 메뉴가 있습니다.
이렇게 한다면 위의 루프를 이용해 단순히 뷰를 리스트에 집어넣어 주면 될 것 같네요.

이렇게 매핑데이터를 완성했으면 나머지는 리스트를 통해 좌석 id 를 찾고 데이터를 바인드해주면 됩니다.

public UiSeat findSeatById(String id) {
    for (UiSeat seat : seatList) {
        if (seat.getId().equals(id) {
            return seat;
        }
    }
    return null;
}


// SeatData를 파이어베이스에서 가져온 좌석 하나에 대한 정보로 가정
private void bindSeats(List<SeatData> seatDataList) {
    for (SeatData data : seatDataList) {
        if (!bindSeat(data)) {
          // 에러처리
        }
    }
}

private boolean bindSeat(SeatData data) {
     UiSeat seat = findSeatById(seatData.getId());
     if (seat == null) {
        return false;
     }

     seat.getView().setSelected(data.getSelected());
     return true;
}

 

spark (224,800 포인트) 님이 2022년 6월 8일 답변
...