📱 Android 58

[Android] 앱 배포 실패, 그 원인은 SoLoader ? (ft.giphy)

배포를 하려다가 플레이 콘솔에서 배포 실패가 떴었어요 에러 메시지는 아래와 같았습니다 하나 이상의 앱에 결함이 있는 SoLoader SDK 버전이 포함되어 있으므로 앱이 다운되어 사용성이 저하됩니다 64비트 전용 기기에서 비정상 종료를 일으키는 SoLoader SDK 버전이 앱에 통합되어있습니다 공식문서에도 친절하게 나와있습니다 :) https://support.google.com/googleplay/android-developer/answer/12576726?hl=ko 잘못된 SoLoader 버전이 있는 앱 수정하기 - Play Console 고객센터도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요support.google.com 에러 수정방법 1️⃣ 앱이 SoLoader SDK에 직접 종속..

📱 Android 2024.10.11

[Android / Glide] Glide override / Glide 이미지 크기 조정

overrideoverride는 이미지의 크기를 강제로 지정하여 로드할 때 사용되는 메서드입니다우선 함수 원형을 보자면,paramater로 width, height을 받아서 크기를 조절해줍니다  @NonNull @CheckResult public T override(int width, int height) { if (isAutoCloneEnabled) { return clone().override(width, height); } this.overrideWidth = width; this.overrideHeight = height; fields |= OVERRIDE; return selfOrThrowIfLocked(); } 만약 width, height이 같..

📱 Android 2024.10.08

[Android] onBackPressedDispatcher 뒤로가기 제어하기 (ft. DialogFragment)

Android API 33에서 onBackPressed() 메서드가 deprecated 되면서 onBackPressedDispatcher가 생겼습니다 Activity의 생명주기와 함께 작동하고, 해당 callback을 선언해서 사용하면 됩니다   DialogFragment에서 back 버튼을 눌러도 다이얼로그가 사라지지 않게 하려면 어떻게 해야할까요?1. onBackPressedDispatcher 콜백 추가2. handleOnBackPressed를 override해서 아무 동작도 하지 않도록 설정  override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstance..

📱 Android 2024.09.19

[Android] Bitmap crop with Rect

자르려면 필요한 값 자르려는 원본 이미지(bitmap) , 자를 영역의 정보 (좌표 및 크기) Rect(x,y,width,height)자를 영역의 시작 좌표 = x, y자를 영역의 너비,높이 = width, heightval rect = Rect(x, y, width, height)val cropBitmap = Bitmap.createBitmap(자르려는 원본 이미지, rect.left, rect.top, rect.width(), rect.height()) Rect 클래스의 주요 구성 요소좌표 (Coordinates):left: 사각형의 왼쪽 경계top: 사각형의 위쪽 경계right: 사각형의 오른쪽 경계bottom: 사각형의 아래쪽 경계

📱 Android 2024.06.13

이미지 수난기

까먹기 않기 위해 우선 적어두고,, 나중에 다시 정리할 예정입니다 1. clipRect(Rect rect)현재 클립 영역을 지정된 사각형으로 설정합니다.지정된 사각형 내부의 영역만 그려집니다.사각형 외부의 영역은 그려지지 않습니다.2. clipOutRect(Rect rect)현재 클립 영역에서 지정된 사각형 영역을 제외합니다.지정된 사각형 외부의 영역만 그려집니다.사각형 내부의 영역은 그려지지 않습니다. public static Bitmap createBitmap(@NonNull Bitmap source, int x, int y, int width, int height) { throw new RuntimeException("Stub!");}  createScaledBitmap 메서드Android의 ..

📱 Android 2024.05.16

[Android] Glide vs Picasso

이미지 라이브러리 중 가장 유명한 Glide와 Picasso입니다 각각 장단점은 잘 모르고 있었던터라, 한번 조사해봤어요 Glide Glide.with(context) .load(imageUrl) .apply(RequestOptions() .centerCrop() .placeholder(R.drawable.loading_spinner) .diskCacheStrategy(DiskCacheStrategy.ALL)) .into(imageView) 장점 - GIF, webp 지원 - 이미지 로딩 성능이 좋다 - 생명주기와 연동된다 Glide.with(context) context가 Activity / Fragment 에 따라 해당 컴포넌트 생명주기와 연동해 동작합니다 ex) 이미지 로딩이 진행 중인데 컴포넌트들..

📱 Android 2024.03.17

[Android] @IgnoredOnParcel

통신을 위해 model을 설계했는데, 클라이언트에서만 사용하는 변수가 필요한 상황입니다 클라이언트에서만 사용될 값을 추가하는데, 만약 이게 서버 통신에서 쓰인다면.. 아찔한 상황입니다 T_T 이럴 경우엔, IgnoredOnParcel 을 사용합니다 @IgnoredOnParcel - Parcelize annotation이랑 함께 사용되는데 특정 필드가 Parcelable 구현에서 제외시킵니다 즉 Parcelable 인터페이스를 구현할 때 고려되지 않으므로, 인텐트에 데이터를 넘기거나 상태를 저장/복원하는 과정에서 이 변수는 무시되고, 클라이언트 상에서만 사용할 수 있습니다 :) @Parcelize data class User( val name: String, val age: Int, @IgnoredOnPa..

📱 Android 2024.02.25

[Android] SingleLiveEvent , EventWrapper

SingleLiveEvent : 화면 회전 등 구성요소 변경 시, 이벤트가 여러번 호출되는 걸 방지하기 위해 사용 -> 단일 이벤트 사용 import android.util.Log import androidx.annotation.MainThread import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import java.util.concurrent.atomic.AtomicBoolean class SingleLiveEvent : MutableLiveData() { private val pending = AtomicBoolean(false) @Main..

📱 Android 2023.09.03

[Android] viewModels vs activityViewModels

(Hilt 사용) ViewModel을 초기화할 때 viewModels()만 사용해봤었는데 activityViewModels의 존재를 알게됐어요 두 가지의 차이점에 대해 알아봅시다! 🔍 왜 이렇게 처음보는게 늘 많은지 T_T 멀고도 험한... viewModels() 해당 ViewModel을 초기화하는 Component의 LifeCycle을 따름 activityViewModels() @MainThread public inline fun Fragment.activityViewModels( noinline extrasProducer: (() -> CreationExtras)? = null, noinline factoryProducer: (() -> Factory)? = null ): Lazy = createVi..

📱 Android 2023.07.27

[Android] DataBinding BindingAdapter 사용하기

데이터 바인딩을 사용할 때 view의 attributes를 커스텀으로 추가해 사용할 때 즉, 쉽게 말하자면 xml에서 원하는 속성을 만들어서 사용하는 방식입니다 어떤 속성을 만드는지에 따라서 무궁무진하게 사용됩니다 :) 기본 형태 @BindingAdapter("xml에서 사용할 명칭") fun setAB(속성과 연결된 뷰 타입, T) { // ... } 실제 코드를 보자면 ImageView에 적용하는 예시니, 첫번째 param은 ImageView이고 함수 안에서 사용될 데이터는 String 값임을 알 수 있습니다 @BindingAdapter("setImgUrl") fun setImgUrl(view: ImageView, url: String) { Glide.with(view).load(url).into(v..

📱 Android 2023.07.27