개인과제 필수기능 마무리
- 상품 상세페이지 이동시 intent로 객체를 전달합니다. (Parcelize 사용)
- 상품 가격은 1000단위로 콤마(,) 처리해주세요.
- 뒤로가기(BACK)버튼 클릭시 종료하시겠습니까? [확인][취소] 다이얼로그를 띄워주세요. (예시 비디오 참고)
뒤로가기 버튼 클릭시 다이얼로그 띄우고 종료하기
//뒤로가기 눌렀을 때 다이얼로그 띄우고, 확인 누르면 종료
override fun onBackPressed() {
val builder = AlertDialog.Builder(this)
builder.setIcon(R.drawable.speech_bubble)
builder.setTitle("종료")
builder.setMessage("정말 종료하시겠습니까?")
builder.setPositiveButton("확인",
DialogInterface.OnClickListener{dialog, which ->
super.onBackPressed()
finishAffinity()
})
builder.setNegativeButton("취소",
DialogInterface.OnClickListener{dialog, which ->
null
})
builder.show()
}
강의에서 배운 기본 다이얼로그를 사용하여 xml을 따로 만들지 않고 그냥 실행시켜 보려고 했다.
처음 만들었을 때 super.onBackPressed()를 안 넣으면 오류가 나서 일단 최초 생성되는 맨위에 그대로 뒀는데 다이얼로그가 뜨기도 전에 종료가 되었다. 왜 종료가 되는지 찾는게 조금 오래 걸렸다. 그래서 listener를 만들고 그 안에 super를 넣어보았지만 들어가지 않아서 주석처리하고 다시 만들어 본 코드이다. 다이얼로그인터페이스.온클릭리스너를 누르니 dialog,which -> 가 자동으로 따라와서 일단 냅두고 그 밑에 취소 일 땐 null을 줘서 다이얼로그만 사라지게 하고, 확인을 눌렀을 때는 앱 종료하는 코드를 집어넣었다.
마지막으로...builder.show()를 마지막에 꼭 집어넣어야 다이얼로그가 뜬다.이것도 첨에 헤매서 왜 안뜨는지 좀 찾았다.
intent로 상세페이지에 데이터 넘기기(parcelize)
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize")
}
플러그인에 맨마지막 kotlin-parcelize를 입력하고 sync now를 눌러줘야 할 수 있다. 그리고 만약 이 기능을 쓰지 않을 때는 이걸 삭제해야 돌아간다.
@Parcelize
data class MyItem(val aImg:Int, val aTitle:String,val aUserlocation : String,
val aSubtitle : String, val aUserid:String, val aPrice:Int,
val aChat:Int, val aHeart:Int ) : Parcelable
이렇게 맨위에 @Parcelize 그리고 맨 마지막에 :Parcelable을 입력하면 되었다.
이렇게 만드는건 쉬운데 넘기고 받는게 오래걸렸다.
intent.putExtra(Contants.Item_NUMBER, position)
startActivity(intent)
원래는 이렇게 해서 아이템의 각자 번호를 넘겨서 그 번호 값으로 0~9까지 만든 데이터를 모두 집어 넣었었다.
intent.putExtra(Contants.Item_OBJECT,dataList[position])
startActivity(intent)
바뀐점은 datalist의 순서?로 바뀌었다. 넘기는건 어차피 비슷해서 디테일로 넘어가서 받아보았다.
//데이터 받아오기
var data = intent?.getParcelableExtra<MyItem>(Contants.Item_OBJECT)
이렇게 선언하고 데이터를 받아왔다.
binding.userId.text = data?.aUserid
binding.userLocation.text = data?.aUserlocation
binding.userSubtitle.text = data?.aSubtitle
binding.userTitle.text = data?.aTitle
텍스트들은 위와같이 해서 들어갔는데 이미지를 못 받았다...
//이건 drawable이 아니었음
binding.imgTitle.drawable = data?.aImg
//필수값이 int인데 int? 로 떠서 오류
binding.imgTitle.setImageResource(data.aImg)
//위와 같이 똑같은 오류
binding.imgTitle.setImageResource(data?.aImg)
원래 맨 처음처럼 해서 어떻게 찾으려고 하다가 포기하고 저녁에 튜터님을 찾아갔더니 setImageResource를 써야 하고 (어댑터에서 썼던거 처럼) 근데 밑에처럼 오류가 뜨는건 한번 찾아보라고 하셨다. 그리고 해결 해보라고..
해결
우선 두번째 칸에서 액션더보기로 보니 let을 써서 변환 하는게 나왔다. let을 써서 변환하라는거 같은데 일단 눌러보니
data?.aImg?.let { binding.imgTitle.setImageResource(it) }
이렇게 변하고 일단 잘 돌아갔다. 이렇게 하고 팀 결산 시간 때 다른 학우분이 데이터를 받아 올 때 이건 완전히 null이 아닌걸 나타내는 !!나 ?: 로 null일 때 나타낼걸 넣으면 된다고 하고 결과까지 보여줬다.
//데이터 받아오기
var data = intent?.getParcelableExtra<MyItem>(Contants.Item_OBJECT)?:
//?: 로 null일 경우 앱이 꺼지지 않게 넣는 데이터
MyItem(R.drawable.sample1,"제목","위치","내용","아이디",1000,1,1)
//받은 데이터 집어넣기
binding.imgTitle.setImageResource(data.aImg)
binding.userId.text = data.aUserid
binding.userLocation.text = data.aUserlocation
binding.userSubtitle.text = data.aSubtitle
binding.userTitle.text = data.aTitle
이렇게 하고 밑에 null을 검사하던 ?를 모두 빼니 이제 이렇게도 정상 작동한다.
이렇게 두 가지 방법을 찾을 수 있었다.
1000단위로 (,) 찍고 "원" 까지 붙이기
이건 지금까지에서 제일 간단했다.
DecimalFormat를 치고 ("") 이 안에 표시 형식을 넣으면 되었다. 그리고나서 .format()으로 괄호안에 숫자를 넣어주면 된다.
받아온 숫자는 data.aPrice이므로 이걸 괄호 안에 넣고 "원" 도 붙여야 하니 +로 같이 붙여줬다.
binding.userPrice.text = DecimalFormat("#,###").format(data.aPrice) + "원"
이렇게 필수과제 구현은 얼추 다 한거 같다. 선택은 시간이 부족하다...
'내일배움캠프' 카테고리의 다른 글
본 캠프 38일 차 (1) | 2024.01.12 |
---|---|
본 캠프 37일 차 (0) | 2024.01.11 |
본 캠프 35일 차 (0) | 2024.01.09 |
본 캠프 34일 차 (1) | 2024.01.08 |
본 캠프 33일 차(Fragment,액티비티와 프래그먼트 데이터 전달) (1) | 2024.01.05 |