오늘 배운 것 및 한 것들, 문제 생긴 것들 정리

Fade In, Fade Out 효과 주기

예제 코드1

val floatingButton = binding.floatingButton
val inAnimation = AlphaAnimation(0f, 1f).apply { duration = 500 }
val outAnimation = AlphaAnimation(1f, 0f).apply { duration = 500 }

AlphaAnimation이라는 친구가 있는데 이걸 주면 애니메이션을 줄 수 있는 것 같다.
0f, 1f 순으로 가면 투명에서 불투명으로 바뀌며,
반대로 하면 불투명에서 투명으로 바뀐다.

뒤에 duration은 지속 시간?으로 알고 있다.

startAnimation(outAnimation)

하면 fade out 애니메이션이 실행된다.

메인 페이지에서 (첫 실행 페이지) 뒤로 가기 버튼 눌렀을 때 다이얼로그

onBackPressed()를 오버라이드 하고 그 안에 다이얼로그 넣으면 된다.

알림 할 때 여러 설정

// 채널 생성
val channelId = "channel"
val channelName = "My Channel"
val channel = NotificationChannel(
    channelId,
    channelName,
    NotificationManager.IMPORTANCE_DEFAULT   // 여기는 중요도 설정
    ).apply {
        setShowBadge(true)
        // 배지 설정 (알림 하나씩 쌓일 때마다 아이콘 위에 숫자 뜨게)

        val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        // 알림 소리를 기본 소리로 설정
    }

첫 페이지에서 뒤로 가기 버튼 눌렀을 때 다이얼로그 안 뜨고 강제 종료되는 문제 발생

setOnCancelListener 쓰고 중괄호 안에 아무것도 안 넣으니 잘 되었다..?

플로팅 버튼 눌렀을 때 맨 위로 이동시키기

floatingButton.setOnClickListener {                                             
    binding.recyclerView.smoothScrollToPosition(0)   // 0번 인덱스는 가장 위에 있는 아이템아다!
}

RecyclerView Grid 설정

binding.recyclerView.layoutManager = LinearLayoutManager(this)
// this 뒤에 숫자를 넣어서 Grid 설정이 가능하다.
// 2를 넣으면 한 아이템만 나오고 그게 수직으로 쭈욱 나오던 것이 한 줄에 두 개의 아이템이 들어가는 것으로 바뀐다.

RecyclerView에 구분선 넣기

binding.recyclerView.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
// 당연히 가로 방향 RecyclerView라면 horizontal 속성 써야 한다.

데이터 보내고 다시 결과값 받아오기

RegisterForActivityResult 쓰면 된다.

RecyclerView 아이템 인덱스 위치 순서 꼬일 때는

변수를 선언하여 그 아이템의 위치를 getOrNull로 갖고 와서 써야 한다.
당연히 위치를 position 값을 가지고 찾아야 한다.

RecyclerView 스크롤 관련 설정

// if문 안에 들어가는 RecyclerView 스크롤 상태 확인하는 코드
!binding.recyclerView.canScrollVertically(-1) && newState == RecyclerView.SCROLL_STATE_IDL
// 스크롤이 멈춰 있고, 위치가 최상단인 경우를 나타냄

좋아요 표시

if (!item!!.dHeartCheck) {
    binding.ivBottomHeart.setImageResource(R.drawable.heart)
} else {
    binding.ivBottomHeart.setImageResource(R.drawable.heart_full)
}

// 좋아요 버튼을 눌렀을 때 좋아요 버튼 이미지, 좋아요 수를 결정 하는 부분
binding.ivBottomHeart.setOnClickListener { view ->
    if (!item.dHeartCheck) {
        binding.ivBottomHeart.setImageResource(R.drawable.heart_full)
        count++
        item.dHeart = count     // 디테일 페이지에서만 쓸 것이라면 이 코드는 안 써도 된다.
        item.dHeartCheck = true
        
        // 이 친구는 Snack Bar
        Snackbar.make(view, "관심 목록에 추가\n좋아요 개수 : $count", Snackbar.LENGTH_SHORT).show()
    } else {
        binding.ivBottomHeart.setImageResource(R.drawable.heart)
        count--
        item.dHeart = count     // 디테일 페이지에서만 쓸 것이라면 이 코드는 안 써도 된다.
        item.dHeartCheck = false
        Snackbar.make(view, "관심 목록에서 제거\n좋아요 개수 : $count", Snackbar.LENGTH_SHORT).show()
    }
}

이미지 곡률 설정

이미지 뷰를 넣고 이미지 곡률 설정했는데 적용이 안 된다면?
CircleImageView나 RoundImageView를 쓰면 된다.

Fragment (plus)

Fragment를 만드는 다양한 방법

<fragment
    android:id="@+id/my_static_fragment"
    android:name="com.example.MyFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

// 이 방법이 가장 추천되는 방법이다.
<androidx.fragment.app.FragmentContainerView
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

replace

기존 Fragment를 지우고 새 Fragment를 삽입한다.

// 더 편한 방식
val myPageFragment = MyPageFragment()
parentFragmentManager.commit {
    setReorderingAllowed(true)
    replace(R.id.fragment_container, myPageFragment)
    addToBackStack(null)
}

// 기본 방식
val myPageFragment = MyPageFragment()
val transaction = parentFragmentManager.beginTransaction()
transaction.setReorderingAllowed(true)
transaction.replace(R.id.fragment_container, myPageFragment )
transaction.addToBackStack(null)
transaction.commit()

add

기존 Fragment 위에 새 Fragment를 겹치는 방식

val myPageFragment = MyPageFragment()
parentFragmentManager.commit {
    setReorderingAllowed(true)
    add(R.id.fragment_container, myPageFragment)
    addToBackStack(null) // 백 스택에 추가하여 뒤로 가기 버튼을 사용할 수 있게 함
}

remove

당연히 지울 수도 있는데 특정 Fragment만 지우는 방식

val myPageFragment = MyPageFragment()
parentFragmentManager.commit {
    setReorderingAllowed(true)
    remove(R.id.fragment_container, myPageFragment)
    addToBackStack(null)
}

show

Fragment를 잠시 숨겨놨다가 다시 보여줌

val myPageFragment = MyPageFragment()
parentFragmentManager.commit {
    setReorderingAllowed(true)
    show(R.id.fragment_container, myPageFragment)
}

hide

이건 반대로 Fragment를 숨기는 과정

val myPageFragment = MyPageFragment()
parentFragmentManager.commit {
    setReorderingAllowed(true)
    show(R.id.fragment_container, myPageFragment)
}

Fragment의 종류

  • BottomNavigationView = 하단에 메뉴 버튼을 누르면 해당하는 페이지로 이동할 수 있게 하는 것

  • Drawer = 상단 바의 메뉴 버튼을 누르면 옆에서 마치 서랍처럼 열리는 메뉴들. 거기서 메뉴를 선택하면 해당하는 페이지가 보여지는 것

  • TabLayout + ViewPager2 (1도 있지만 지금은 잘 쓰지 않는다.) = 위에 메뉴들을 고를 수 있고, 페이지를 스크롤 하거나 TabLayout에서 선택하면 원하는 페이지가 나온다.

이 중 위의 두 가지는 New Project를 만들 때 따로 선택할 수 있다.

profile
김성진의 개발 관련 내용 정리 블로그

0개의 댓글