[TIL] Android 앱 개발 숙련 : 개인 과제 1

지혜·2024년 1월 8일

Android_TIL

목록 보기
33/70

✏240108 월요일 TIL(Today I learned) 오늘 배운 것

📖메인페이지 만들기 트러블 슈팅

  • 🚩디자인 및 화면 구성을 최대한 동일하게 해주세요. (사이즈 및 여백도 최대한 맞춰주세요.) ✨

    • 리사이클러 뷰에서 활용될 layout_item.xml 을 만드는 중, 채팅 개수와 좋아요 개수를 표시할 TextVeiw의 위치를 맞추는 데에 자꾸 문제가 생겼다. xml 디자인 창에서는 원하는 위치에 표시가 되었는데, 막상 에뮬레이터를 실행 시켜보면 채팅과 좋아요 사이의 간격도 너무 넓고, 무엇보다 좋아요가 벽면에서 너무 멀리 떨어져 있었다. packed으로 묶어도 보고, constratint도 다르게 연결해보고 이리저리 만져봤지만, 나아지지 않았다. 그러다가 혹시 하고 확인한 것이 hint이다. hint에 text값을 숫자가 아니고 '채팅' '좋아요' 이렇게 한글을 적어놨었는데, 이 만큼을 wrap_content로 인식했는지, 숫자들이 한글이 차지하는 넓이 보다 좁아서 여백이 남아돌았나 보다.
      => hint랑 text로 글씨를 작성한 부분을 다 지워줬다. 어짜피 하드코딩 되어있어서 그대로 둘지, strings.xml에 등록할지 고민 중이 었는데, 그냥 채팅, 좋아요 부분을 숫자로 두고 strings.xml에 등록해도 되었겠지만, 지금은 복잡한 레이아웃도 아니니까 그냥 다 지워버리기로 했다. 내용물을 등록하지 않아도, 데이터는 제대로 set되니까 상관 없다고 생각했다. 나중에 레이아웃이 복잡해지면 헷갈림 방지를 위해 등록해주는게 좋을까? 싶다가도 개발할 때나 필요하지 않을까? 라는 생각도 들고, hint는 보통 placeholder 용도로 쓰니까. 이럴땐 비워두는게 좋을까? 잘 모르겠지만. 확실한건 지금은 필요없는 것 같으니까 그냥 쓰지 않기로 했다.

  • 🚩상품 이름은 최대 두 줄이고, 그래도 넘어가면 뒷 부분에 …으로 처리해주세요.

    • TextView의 줄 수 제한을 두는 방법은 금방 찾았다. maxLines를 사용하면 된다. 뒤에 ... 이 오도록 하는 것은 ellipsize="end"로 설정하면 되었다. 다만, 문제는 TextView의 width가 wrap_content로 되어있었는데, CardView 옆에 붙여놔서 그런가 글씨가 화면에 보여지는 곳보다 뒤로 넘어가서 2줄에 모든 글이 보이는 대신 중간 부분이 짤려보였다. 즉, maxLines과 ellipsize가 잘 먹혔는지 확인을 못한다는 것.ㅎ 제일 큰 전체 레이아웃 하나에 이미지뷰와 텍스트뷰의 위치를 바로 놓은 것이기 때문에, 따로 감싼 레이아웃이 없어서 match_parent를 하면 전체 가로길이에 꽉차버리고, layout_constraintEnd_toEndOf="parent"를 줘도 이미지를 가려버리고.. 그렇다고 고정 너비를 주면, 다른 비율의 화면에서는 그 크기로 정해져버리니까 비율이 안맞을게 뻔해서 곤란했는데, width를 wrap_content가 아니고 0dp를 주는게 포인트였다.
      => 0dp : 해당 요소의 너비나 높이를 0으로 설정한다. 보통 match_constraint 또는 match_parent와 같은 의미로 사용되며, 요소가 레이아웃의 제약 조건에 맞게 확장되거나 축소 된다.
      => wrap_content : 해당 요소의 너비나 높이를 포함하는 내용물에 맞게 자동으로 조정하고, 요소가 내용물의 크기에 따라 유동적으로 변한다.

  • 🚩뒤로가기(BACK)버튼 클릭시 종료하시겠습니까? [확인][취소] 다이얼로그를 띄워주세요.

    • 뒤로가기 버튼을 누르면 이벤트가 활성화 되도록 하는 함수를 찾았는데, onBackPressed()는 이미 deprecated 되어 있었다. 사실. 그냥.. 쓸까도 생각했는데, deprecated되었다고 아예 안쓰는건 또 아닌 것 같아서.. 근데 override 경고문이 계속 뜨는데, 쓰지도 않는 함수였어서.. 경고 무시 어노테이션 걸기는 또 싫어가지고, 또 AI챗봇의 힘을 빌려..
      =>OnBackPressedCallback의 handleOnBackPressed( )를 찾아냈다.

       private val callback = object : OnBackPressedCallback(true){
            override fun handleOnBackPressed() {
            
            			//제대로 MainActivity를 참조할 수 있도록 @MainActivity를 해줘야 한다.
                val builder = AlertDialog.Builder(this@MainActivity)
                builder.setTitle("종료")
                builder.setIcon(R.drawable.item_chat)
                builder.setMessage("정말 종료하시겠습니까?")
      
                val listener = DialogInterface.OnClickListener { _, p1 ->
                
                	     //확인 버튼을 눌렀을 때만 작업하도록 작성.
                    if (p1 == DialogInterface.BUTTON_POSITIVE) {
                        finish()
                    }
                }
                
                builder.setPositiveButton("확인", listener)
                builder.setNegativeButton("취소", null)
                
                builder.show()
            }
      
        }
      
      override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            ...
            //onBackPressedDispatcher를 사용하여 생성한 callback을 붙여주기
            this.onBackPressedDispatcher.addCallback(this,callback)

✏느낀점과 내일 할 일

  • 사실 여태껏 과제들로 기본 틀이 있어서, 금방 할 줄 알았는데, 디자인 디테일 만지는게 뭐라고 시간이 훅 갔다. 그리고 의외로 구현할 때 어떤 방법을 쓰는게 좋을지 고민하는 시간도 꽤 걸렸다. 사실 잘 생각해보면 고민할 필요 없었던 경우도 있긴 하지만.. 정답이 없는..? 정답을 모르는 상황이니까 좀 헤매이게 된다.
  • 내일은 일단 오늘 살짝 외면한.. 알람을 꼭. 달아줘야곘다. 솔직히 채널 연결하라는 것 부터가 살짝 건들기 싫게 생겼다. 오늘 조금... 코드 분석을 해놨으니까 내일 뚝딱. 연결해야곘다. 뚝딱. 되겠지..? 오전 중에 코드카타 끝나고 알람까지 끝내는게 목표다.
  • 오후에는.. 상품 상세페이지 만드는건 레이아웃부터 만들어야 해서 한숨이 깊다. ..디자인 디테일이란. 무엇인걸까.?ㅎ 그리고 이번 과제에 프레그먼트를 사용하라고 명시된 부분이 없어서 배웠는데 왜 안쓰지? 하고 헷갈렸는데 이건 확실하게 액티비티로 만드는게 맞는 것 같다. 프레그먼트는 독립적으로 사용될 수 없으니까... ㅎ... 다만 Parcelize 사용하는 게 감이 안와서 무섭다. 여하튼 상세페이지까지 끝내는게 오후 목표.!
  • 수요일 오전에 도전과제 1,2를 하고(왠지 금방 끝낼수 있을 것 같다.) 오후에 도전과제 3을 한 후. 목요일 제출이 이번주 스케쥴이다. 제출 후에는 수준별 과제 추가 및 디벨롭하고, 개인과제 해설영상 보고 보완하고... 생객대로 스케쥴이 흘러갔으면 좋겠다.
profile
파이팅!

0개의 댓글