전체 글 103

[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

[Android] getColor, getDrawable Deprecated 대응

Android 버전이 업데이트되면, 기존의 함수가 Deprecated가 되기도 합니다. Deprecated 된 함수들은 버전별로 처리를 해주어야 합니다. 이번에 살펴볼 함수는 getColor와 getDrawable 함수입니다. getColor public int getColor (int id) getColor는 마시멜로우버전(API 23)에서 부터 Deprecated(getColor)되었다고 나와있습니다. 공식 문서에 보면, getColor(int, android.content.res.Resources.Theme)를 대신해서 쓰라고 나와있습니다만, ContextCompat에 있는 아래의 함수를 사용해서 변경해보도록 하겠습니다. 설명처럼 Build.VERSION_CODES.M (API 23) 에서부터 사용..

📱 Android 2020.11.18

[Android] Firebase setCurrentScreen 지원중단

앞선 포스팅에 이어, Firebase SDK가 업데이트되면서 수동화면추적을 위한 setCurrentScreen도 곧 지원중단 되므로, 함수를 변경해주도록 합니다. 수동화면추적이란? 자동 추적 사용 설정 여부와 관계없이 screen_view 이벤트를 수동으로 로깅할 수 있습니다. 이러한 이벤트는 iOS의 경우 viewDidAppear상태, Android의 경우 onResume 상태에서 로깅할 수 있습니다. screen_class 를 설정하지 않으면 애널리틱스는 호출할 때 포커스가 지정된 UIViewController 또는 Activity를 기반으로 기본값을 설정합니다 앱을 사용하면서 화면전환율, 현재 화면에 관한 정보를 이벤트에 추적하면서 쓰입니다. 아래의 예시는 사용자가 어떤 화면에 들어왔는지를 남기기 ..

📱 Android 2020.11.09

[Android] 최신 Firebase Crashlytics Sdk 업데이트

공식문서 Firebase Crashlytics SDK로 업그레이드 iOS Android Unity 이제 새로운 공식 Firebase Crashlytics SDK를 사용하여 앱에서 Crashlytics를 설정할 수 있습니다. 이 SDK는 다른 Firebase 제품과의 일관성이 향상되었고 보다 직관적으로 사용할 수 있는 개선 firebase.google.com 위의 공식문서를 참고해서 정리해보겠습니다. (Android를 탭해도 IOS의 방법이 보이는 것 같습니다..) 1. Firebase 구성 파일 추가 프로젝트 설정에서 구성 파일이 필요한 ID를 선택합니다. google-services.json을 다운로드해서 프로젝트 app폴더에 넣어줍니다. 2. build.gradle (app) 수정 io.fabric이..

📱 Android 2020.11.05

[Java/Kotlin] HashMap을 사용해보자

HashMap - Map 인터페이스로, Key와 Value값으로 데이터를 저장 HashMap을 사용할 일이 많은데, 제대로 정리를 해두면 좀 더 편하게 쓸 수 있을 것 같아 간략하게 정리해보았습니다. 기본 사용법 🔹 HashMap 생성 용량, 초기 값을 지정할 수 있지만, 가장 많이 쓰는 사용법만 작성하겠습니다 Java HashMap map = new HashMap(); HashMap map1 = new HashMap(map); // map의 값을 모두 가지는 HashMap생성 Kotlin val map : HashMap = HashMap() val map1 : HashMap = HashMap(map) // map의 값을 모두 가지는 HashMap생성 🔹 HashMap 삭제 Java, Kotlin의 사용..

☕️ Java 2020.10.18

[Android] Proguard 적용하기

proguard란? - 코드를 축소, 최적화, 난독화를 해주는 도구 Proguard가 중요한 이유 1. 디컴파일시 코드의 노출을 방지 Proguard 설정을 하지 않는다면, 디컴파일러로 소스를 볼 수 있는 상황이 발생합니다 2. 앱을 최대한 작게 만들기 위해 클래스와 멤버 이름을 줄여 DEX 파일 크기를 줄입니다 Proguard 설정 방법 build.gradle 파일 buildTypes { release { minifyEnabled true // Proguard를 활성화 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 난독화를 시킬 경우, 예외적으로 난독화에서 제거해야할 부분이 발생할 수 있습니다...

📱 Android 2020.08.30