본문 바로가기

Mobile App64

[안드로이드] by viewModels, LiveData Observing 이 안되는 이유 ViewModel 초기화 하는 방법 우리는 데이터 보존을 위해 ViewModel 를 초기화하여 View(Fragmet, Activity) 에서 사용한다. ViewModel 를 초기화 하는 방법은 대표적으로 두 가지로 나눌 수 있다. 1. ViewModelProvider. private val viewModel: MyViewModel by lazy { ViewModelProvider(getViewModelOwner())[MyViewModel::class.java] } 2. by viewModels private val viewModel by viewModels() 겪은 이슈 as-is > to-be 로 코드 리팩토링할 때 as-is 에서 작업했던 ViewModel 초기화 방식과 to-be 방식이 위 두 가.. 2024. 2. 4.
[안드로이드] 키보드 자판이 보이고 안 보이고 감지하는 콜백함수 (Keyboard show hide) 문제 정의 현재 회사 코드 정책 상, 싱글 액티비티를 유지해야 했고, Fragment 에 원하는 softInputMode 를 적용하고 싶었다. 그리고 AndroidManifest.xml 내에 windowSoftInputMode 가 세팅이 되어있지 않았다. 즉, default 모드 상태인 stateUnspectified 값이며 이 속성은 시스템에서 적절한 상태를 선택하거나 테마의 설정을 사용하게 한다. 그러다보니 Fragment UI 작업 시, 하단 버튼이 editText 에 focusing 이 될 때마다 올라오게 되며 원치않게 버튼이 뷰를 가리게 됐다. 매니페스트에 내가 원하는 속성을 적용하게 될 경우, 앱 내 여러 서비스들 중에 EditText 를 사용하는 부분에 영향이 가서 고민하게 됐다. 일단, A.. 2024. 1. 28.
[안드로이드] 이전에 설치한 앱 이미지 파일이 재설치 후 왜 삭제가 안될까? (다른 앱 이미지 삭제 불가) *갤러리 폴더 삭제 아니 왜!!!!! 이전 빌드한 앱에서 외부저장소(공용저장소)에 이미지파일을 저장한 게, 삭제 후 재설치한 앱에서 모든 이미지 삭제로직에서 삭제가 안돼.... 왜 삭제가 안돼? 왜!!!!! 권한이 필요했다........ 다른 앱 이미지 업데이트 불가 모든 이미지가 삭제가 안되는 경우, // 이슈 상황 private fun removeImageFiles(context: Context) { val contentResolver: ContentResolver = context.contentResolver val externalStorageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) val folderPath .. 2023. 11. 15.
[안드로이드] Fragment replace 이전 Fragment 버튼 리스너 동작 이슈 Fragment 간 이동 할 때 add, replace, remove, addToBackStack 등 다양한 방법으로 Fragment 를 다룰 수 있다. 내가 겪은 이슈는 A -> B 로 Fragment 를 이동할 시 replace 를 이용하면 기존 stack 에 쌓인 Fragment(A) 는 사라지고, replace 로 대체되는 Fragment(B) 만 남아 있어야 한다. 하지만, 그렇지 않았다. 그래서 Fragment(A) 에 있는 버튼 리스너 들이 Fragment(B) View 에서 눌리게 된다... 일단 나는 아래와 같이 코드를 작성해서, 범용적으로 Fragment 를 사용하려고 했다. replace, add, remove, popBackStack fun Activity?.moveFragment(.. 2023. 9. 25.
[안드로이드] 이 앱은 이전 버전의 Android 를 위해 만들어진 것이기 때문에 현 기기에서 사용할 수 없습니다. (sdk 33 대응) 기간이 지나 Google store 에 앱이 보이지 않고, OS 13 대응하고 내부테스트로 앱을 말아도 "이 앱은 이전 버전의 Android를 위해 만들어진 것이기 때문에 현 기기에서 사용할 수 없습니다." 또는 "이 기기 버전과 호환되지 않습니다" 설치 버튼은 안보이고 왜? 저 두 문구가 보일까? 회사에서 이번에 Android OS 13 대응 건 때문에 서브 앱 하나를 버전 업데이트를 하게됐다. https://developer.android.com/google/play/requirements/target-sdk?hl=ko Google Play의 대상 API 수준 요구사항 충족하기 | Android Developers Google Play의 대상 API 수준 요구사항 충족하기 컬렉션을 사용해 정리하기 내.. 2023. 9. 18.
[APP 결제 방법] MPM? CPM? PC to Mobile? MCT? NFC? 입사 후 페이북/ISP 앱을 개발하다가 App 결제 방법이 다양하다는 것을 알게됐다. 늦었지만, 어떤 결제방법이 있는지 알아보자. 요새는 XX페이(ex. 당근페이, 애플페이. 네이버페이, 삼성페이 등) 이러한 게 많이 나왔다. 알아두면 좋을 것 같다. 보통 국내에선 휴대폰 단말기로 결제를 할 때, MST(마그네틱 보안 전송 방식)과 IC 칩 방식의 단말기를 사용한다. MST 방식은 신용카드를 긁어서 결제하고, IC 칩은 카드를 꽂아서 사용하는 방법이다. 1. MPM (Merchant Presented Mode) 방식 (QR 방식) "가맹점 제시 방법" 이라고 불린다. 가맹점주의 QR 코드를 소비자가 휴대폰으로 읽어내는 방식이다. 즉, 매장에서 제공하는 QR 코드를 소비자가 스마트폰으로 찍은 후, 결제 금.. 2023. 9. 16.
[안드로이드] java. lang. NullPointerException: Attempt to invoke interface method 'int java.lang. CharSequence.Length()' on a null object reference (SwitchCompat Error) 오늘 만난 Error 이다. API 호환성을 위하여 AppComapat 위주로 뷰를 짜다가 겪은 Error 엿다. 왜 이러지? 하면서 Switch 로 바꿔보니, 역시나 상위 뷰가 AppCompat 이다보니, Switch 뷰를 사용할 수 없었다.. 사실 해결방법은 쉬웠다. SwitchCompat 뷰에서 속성을 넣어줘야 했던 부분을 내가 넣어주지 않아서 발생한 거였다. 계속 의아하긴 했었다.. 아니 무슨 CharSequence.length() 가 null 이지? 뷰를 만드는데, 왜 문자 시퀀스 길이를 체크하고 그게 널이라고 뜨는 걸까? Text 를 넣어줘야하는 게 아닌가? 라는 생각이 이어졌다. 결과적으로, andorid:textOff 와 android:textOn 속성을 넣어주면 된다. 그러면 정상적으로 .. 2023. 9. 4.
[안드로이드] Circle ImageView 원형 이미지 (Custom ImageView, ShapeableImageView, CircleImageView) 원형 이미지를 만드는 방법은 여러가지가 존재한다. 평소에 나는 ImageView 를 커스텀해서 원형 이미지로 만들어 사용했다. 하지만, 이번에 개발 과제하다가 ShapeableImageView 가 있다는 걸 알게 되면서(🙄너무 늦게 알았다 하하..) Circle ImageView 를 만드는 여러가지 방법을 정리해도 좋다 생각하여 글을 적게 됐다. 1. Custom ImageView res/drawable 파일 내에 shape(Circle) 태그를 만든 Resource file 을 만들기. 만들고 난 뒤, ImageView 에 연결시켜주면 된다. 아래 링크가 자세히 나와있으니, 보고 하면 될 것 같다. https://www.geeksforgeeks.org/how-to-create-a-circular-ima.. 2023. 8. 31.