반응형

안녕하세요

 

사실 이런 기능 어케 만들어야 하노.. 

싶다가, 여러분의 gpt4o mini의 프롬프트 요청 한도는 소중하기에

 

적는 건데요

https://developer.android.com/develop/ui/views/notifications/badges?hl=ko

 

알림 배지 수정  |  Views  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 알림 배지 수정 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 8.0(API 수준 26)부터 알림 배지(또

developer.android.com

여기서는 

1. 앱 설치 후 해당 화면(Fragment)의 최초 실행을 감지하는 함수

이구요

당연히 Activity를 앞에 붙이면 Activity에서도 가능하겠구요

fun Fragment.isFirstRun(key: String): Boolean {
    val sharedPref = requireActivity().getSharedPreferences("appFragmentPref", Context.MODE_PRIVATE)
    val isFirstRun = sharedPref.getBoolean(key, true)
    if (isFirstRun) {
        sharedPref.edit().putBoolean(key, false).apply()
    }
    return isFirstRun
}

고 Dialog도 가능하지.. 않을까요? 해서 적어봤더니 정상적으로 작동합니다.

혹시나 앱에서 최초 결제. 최초~ 어떤 AlertDialog창에서 도움말을 처음에 보여줘야 한다?

 

-> 유용한 기능 ㅋㅋ

class Util(private val activity: FragmentActivity) {
    companion object {
        const val key = "your_key"
    }
    private fun AlertDialog.isFirstRun() : Boolean {
        val sharedPref = activity.getSharedPreferences("appAlertDialogPref", Context.MODE_PRIVATE)
        val isFirstRun = sharedPref.getBoolean(key, true)
        if (isFirstRun) {
            sharedPref.edit().putBoolean(key, false).apply()
        }
        return isFirstRun
    }
}

 

2. 뱃지로 알림이나 뭐 여러가지 클릭 확인하기. 

 

뱃지는 그냥 뱃지를 붙여놓을 View에다가 쓰면되는데요. 

@OptIn(ExperimentalBadgeUtils::class)
fun Fragment.hideBadgeOnClick(badgeView: View,
                              containerView: ConstraintLayout,
                              badgeKey: String,
                              backgroundColor: Int,
                              horizontalOffset: Int = 16,
                              verticalOffset: Int = 12
) : (() -> Unit)? {
    val sharedPref = requireActivity().getSharedPreferences("badgePref", Context.MODE_PRIVATE)
    val isBadgeVisible = sharedPref.getBoolean(badgeKey, true)

    if (isBadgeVisible) {
        val badgeDrawable = BadgeDrawable.create(requireContext()).apply {
            badgeGravity = BadgeDrawable.TOP_START
            this.backgroundColor = backgroundColor
            this.horizontalOffset = horizontalOffset  // 원하는 가로 간격 (픽셀 단위)
            this.verticalOffset =verticalOffset  // 원하는 세로 간격 (픽셀 단위)
        }
        containerView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
            BadgeUtils.attachBadgeDrawable(badgeDrawable, badgeView)
        }
        return {
            BadgeUtils.detachBadgeDrawable(badgeDrawable, badgeView)
            sharedPref.edit().putBoolean(badgeKey, false).apply()
            Log.v("clickBadge", "badgekey : $badgeKey, clickBadge: ${sharedPref.getBoolean(badgeKey, false)}")
        }
    }
    return null
}

 

 

이렇게 뱃지의 최초 클릭을 감지해서 SharedPreferences에 저장하는 함수를 만들어놓구요. class든 object든 상관없구요

 

위 함수를 보시면 알겠지만

매개변수로 
1. view이름
2. view를 감싸고 있는 부모 Layout?
3. SharedPreferences에 쓸 key값

 

val hideBadgeFunction = hideBadgeOnClick(binding.tvBadge, binding.cl, "${binding.tvBadge.text}", color.Red)
                        
binding.cl.setOnClickListener{
    hideBadgeFunction?.invoke()
    // ( 클릭리스너에 넣을 로직 ~~ )
    }

로 넣었구요

 

아무튼 이렇게 하면 뱃지가 사라진다는점~

 

반응형