👩🏻‍💻 Develop 108

[Android] OS 점유율 & minSdkVersion

오늘은 OS 점유율에 대해 확인해보겠습니다 OS 점유율은 프로젝트 생성 시 하단의 링크를 클릭하면 됩니다. ❔Your app will run on approximately 100% of devices. Help me choose 저 링크를 클릭하면 아래와 같은 사진이 뜹니다. 각 API별로 cumulative distribution을 확인할 수 있는데, 해당 API 를 제공하면 몇 %의 사용자가 사용할 수 있는지라고 생각하시면 될 것 같습니다 점유율 확인은 minSDKVersion을 정할 때 확인하면 됩니다. minSdkversion이란? 애플리케이션이 실행하는 데 필요한 최소 API 레벨을 지정하는 정수입니다. Android 시스템은 시스템의 API 레벨이 이 특성에 지정된 값보다 낮은 경우 사용자가 ..

📱 Android 2021.01.27

[Android] SharedPreferences 사용하기

SharedPreferences란? ✔ 데이터가 파일로 저장되고, 저장하려는 키-값 컬렉션이 비교적 작은 경우에 주로 사용됩니다. ✔ DB를 사용하지 않고, 간단한 데이터들을 저장할 때 주로 쓰이며, 앱을 껐다 켜도 사라지지 않아서 자주 사용하는 인터페이스입니다. ✔ 앱을 삭제하거나, 따로 삭제를 설정해야 값들이 사라집니다. ✔ Key, Value형태로 저장됩니다. SharedPreferences 사용법 1. KEY 정하기 위에서 언급했듯이 Key, Value의 형태로 저장되기 때문에, 우선 Key값을 정해줍니다. 2. Value 타입 정하기 SharedPreferences에는 String, Int, Boolean, Long 등 다양한 자료형이 저장될 수 있으므로 어떤 타입을 사용할지 지정해야 합니다. ..

📱 Android 2021.01.19

[Java/Android] 현재 날짜, 시간 출력 SimpleDateFormat

SimpleDateFormat 날짜 또는 시간을 원하는 포맷으로 출력하고 싶을 때 사용하는 클래스입니다. 우선 포맷을 생성하는데 쓰이는 문자에 따라서 출력이 다르게 나옵니다. Date or Time Component를 참고해서 원하는 Letter를 사용하시면 됩니다. Letter Date or Time Component Presentation Examples e Era designator Text AD y Year Year 1996, 96 Y Week year Year 2009, 09 M Month in year Month July, Jul, 07 w Week in year Number 27 W Week in month Number 2 d Day in month Number 189 D Day in yea..

☕️ Java 2021.01.18

[Android] Notification

안드로이드 개발자라면 한번씩은 해봤을 Notification에 대해 정리해보겠습니다. 간략히 말하자면 Notification은 사용자에게 앱의 이벤트에 대한 정보를 제공하고, Builder를 통해서 생성해야합니다. NotificationChannel은 각 Notification들을 관리하는 것이라 생각하면 되는데, API 26 이상부턴 반드시 추가를 해줘야 Notification을 발생시킬 수 있습니다. 예제를 통해 더 자세히 알아보겠습니다 1. NotificationChannel 생성 val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >..

📱 Android 2021.01.04

[Android] Timber 사용해보기

로그를 찍을 때마다 Log를 사용했었는데 Using 'Log' instead of 'Timber' Log를 사용하는 부분에서 위와 같은 메시지가 떴습니다 줄곧 Log만 사용하다가 Timber에 대해 궁금증이 생겨서 이에 대해 정리해보려고 합니다. 1. Timber ? 마찬가지로 로깅 클래스인데 , 기존에 사용하던 Log보다 더 간편하고 릴리즈할 때 로그가 노출될 걱정을 하지 않아도 됩니다. 다른 로깅 클래스와 마찬가지로 사용법은 어렵지 않습니다. 2. Timber 사용법 우선, 다른 라이브러리를 implementation 해줍니다. (build.gradle(:app)) implementation 'com.jakewharton.timber:timber:4.7.1' 그리고 Log.d를 사용할 때와는 달리 초..

📱 Android 2020.12.29

[Android/kotlin] LayoutInflater 사용 (PopupWindow)

오늘은 LayoutInflater를 사용해서 PopupWindow를 만들어보겠습니다 팝업창을 만들고 사용자가 만든 레이아웃을 설정할 수 있고, 현재 Activity 최상단에 띄워집니다 그럼 PopupWindow를 간단하게 사용해보고 특징들에 대해 정리해보도록 하겠습니다 1. PopupWindow에 띄울 Layout 설정 간단한 예제로 아래 그림과 같은 TextView 1개, Button 2개로 구성된 레이아웃을 만들어보겠습니다 [text_popup.xml] 2. xml을 view로 만들어줍니다 xml과 view를 만들어주기 위해선 LayoutInflate를 알아야합니다 여기서 LayoutInflate란 xml에 선언된 위젯들을 실제 View로 만들어주는 역할을 합니다. var linear = Linear..

📱 Android 2020.12.22

[Android] Cannot inherit from final class error

Realm을 간단하게 만들어 테스트 하는 중인데, 이런 에러가 발생했습니다. RealmObject()를 extends해서 데이터 모델을 만들었는데 여기서 문제가 있었습니다 class UserInfo : RealmObject() { var name : String = "" var age : String = "" var gender : Int = 0 } 이런 식으로 구성되어있는데 빌드시키니 💥 error : cannot inherit from UserInfo public class model_UserInfoRealmProxy extends model.UserInfo 위와 같은 에러가 발생했습니다 Solution ) 기존 클래스에서 open만 추가해주면 에러가 해결됩니다 자바의 경우엔 final을 선언하면 되..

🐛 버그 2020.12.21

WindowManager$BadTokenException

Fatal Exception : android.view.WindowManager$BadTokenException Unable to add window — token android.view.VoewRootImpl@ is not valid; is your activity running? 이 에러가 지속해서 발생했는데 Firebase Crashlytics 에서 🔔 창 추가 불가 - 토큰이 올바르지 않음, 활동 실행 여부 확인 필요 이 비정상 종료는 대개 앱에서 이전에 완료된 활동을 컨텍스트로 사용하여 대화상자를 표시하려고 시도하여 발생합니다. 예를 들어 활동이 종료되면 대화상자를 표시하려고 시도하는 AsyncTask를 트리거하지만 사용자가 작업이 완료되기 전에 활동에서 뒤로 이동하면 발생할 수 있습니다. 비정..

🐛 버그 2020.12.15

[Java/Kotlin] 깊은복사 Cloneable 이용하기

이전 포스팅에 이어서 Cloneable을 사용해서 깊은 복사를 하는 방법에 대해 적어보겠습니다. 깊은 복사에 대해 알고싶으시다면, 이전 포스팅을 참조해주세요 클래스에 Cloneable을 참조해서 구현하면 되는 방식이라 생각보다 간단합니다. 1. Cloneable implements 예제로 이름과 나이를 가지는 클래스를 구현해보겠습니다. 클래스에 Cloneable을 implements 해주고 Clone() Method를 생성해줍니다 ✔ Java public class User implements Cloneable { String name = ""; int age = 0; User(String name, int age){ this.name= name; this.age = age; } public Object..

☕️ Java 2020.12.06

[Java / Kotlin] 얕은 복사 , 깊은 복사

객체의 복사를 크게 두 가지 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy) 나눌 수가 있습니다. 혼동하여 사용할 경우 결과값이 달라지므로 차이를 알고 사용해야 합니다. 1. 얕은 복사 (Shallow Copy) 객체 복사 시 해당 객체의 주소값을 복사 얕은 복사의 경우, 주소값을 복사하기 때문에 객체 복사 후 변수를 변경하거나 삭제하면 기존 객체의 변수값에도 변화가 생긴다. 예시 배열에 들어간 값을 삭제하는지 테스트해보겠습니다 ✔ Java ArrayList origin = new ArrayList(); origin.add("AAA"); origin.add("BBB"); ArrayList swallowCopy = new ArrayList(); swallowCopy = origin; s..

☕️ Java 2020.12.02