본문 바로가기

Android

(39)
[Android] Gson 과 android.location.Location val location = Location("") location.latitude = 37.5666805 location.longitude = 126.9784147 val gson = GsonBuilder().create() Log.d(TAG, gson.toJson(location)) // Logcat 출력 {"mElapsedRealtimeNanos":841385802305} Gson 을 이용해 android.location.Location 클래스를 Json으로 바꿀 경우 mElapsedRealtimeNanos 필드만 된다. 주의하자. Hawk 라이브러리로 Location 객체를 저장하던 중 발견했다. 별도의 클래스로 저장을 해야한다. 주의해야겠다.
[Android] Material Indeterminate Progress Drawable 커스텀 얇고 사이즈가 큰 Progress를 만들어야 하는 일이 있어서 Material Style 리소스들을 뜯어보며 만들어 보았습니다. animated vector, vector, animator 를 조합하여 만들 수 있습니다. vector_drawable_progress_bar_large.xml strokeWidth 를 통해 두께 설정 가능 trim_start_interpolator.xml trim_end_interpolator.xml progress_indeterminate_material.xml progress_indeterminate_rotation_material.xml progress_indeterminate_anim_large_material.xml
[Android] 지난 주 날짜 가지고 오기 fun firstDayOfLastWeek(c: Calendar): Calendar { var c = c c = c.clone() as Calendar c.firstDayOfWeek = Calendar.MONDAY // 일주일의 시작으로 잡을 요일 // last week c.add(Calendar.WEEK_OF_YEAR, -1) // first day c[Calendar.DAY_OF_WEEK] = c.firstDayOfWeek return c } fun lastDayOfLastWeek(c: Calendar): Calendar { var c = c c = c.clone() as Calendar c.firstDayOfWeek = Calendar.MONDAY // 일주일의 시작으로 잡을 요일 // first d..
[Android] 앱이 죽은 경우 스플래쉬부터 시작하기 앱이 크래쉬가 안 나면 좋겠지만, 그게 맘대로 되지 않는다. 앱이 죽은 경우 안드로이드 자체에서 앱을 자동으로 올려주기도 하지만, 스플래쉬를 거쳐 초기화하는 작업이 되지 않으면 동작에 문제가 생겨버려 작업하게 되었다. RuntimeException을 받아 처리해 버린다. UncaughtExceptionHandler class UncaughtExceptionHandler(val context: Context) : Thread.UncaughtExceptionHandler { override fun uncaughtException(t: Thread, e: Throwable) { // 에러 원인을 남기기 위해 FirebaseCrashlytics.getInstance().recordException(e) try ..
[Android] isEnabled 로 ScrollView 스크롤 On / Off 시키기 ScrollView의 스크롤 기능을 On / Off 시켜야할 상황이 있어 개발하게 되었습니다. 저 같은 경우엔 MotionLayout의 애니메이션이 끝난 후 Scroll이 가능하도록 개발이 필요했습니다. 추가적인 변수 없이 View의 기본적으로 있는 setEnabled를 사용하고 싶었기 때문에 다음과 같이 개발했습니다. LockableScrollView.kt class LockableScrollView : ScrollView { constructor(context: Context?) : super(context) constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context?, ..
[Android] Collapse와 Expand 상태에서 힌트 문자가 다른 TextInputLayout Collapsed 상태일 때와 Expanded 상태일 때 HInt가 다르게 표시되는 디자인 요청이 들어와서 커스텀 뷰로 제작해봤습니다. 동작에 문제가 생기면 업데이트 하겠습니다. build.gradle dependencies { ... implemntation "com.google.android.material:material:$material_version" ... } SwitchTextInputLayout.java import android.content.Context; import android.content.res.TypedArray; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatche..
[Android] OPEN_DOCUMENT로 가져온 Uri를 Multipart.Part로 만들기(Retrofit2 파일 업로드) SDK 29부터 적용딘 Scoped Stroage에 대응하여 제작 1. Retrofit2를 사용한 파일 업로드 Retrofit에서 파일 업로드를 구현하는 경우 Multipart를 사용합니다. 기존 인터넷에 있는 소스의 경우 File Picker에서 가져온 Uri를 가지고 파일의 경로를 직접 알아내어 구현하는 방식을 사용합니다. ... File file = FileUtils.getFile(this, fileUri); // create RequestBody instance from file RequestBody requestFile = RequestBody.create( MediaType.parse(getContentResolver().getType(fileUri)), file ); // MultipartB..
[Android] SQLiteDatabase 트랜잭션 사용법 데이터베이스에서 트랜잭션이란? mommoo.tistory.com/62 트랜잭션(Transaction)이란? 트랜잭션이란? 트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일 mommoo.tistory.com 코드 순수 SQLite private SQLiteDatabase db; ... try { db.beginTransaction(); [SELECT, INSERT, UPDATE, DELETE 등 다양한 query 활동] // 중요!! 호출해주지 않으면 데이터베이스에 반영이 되지 않음 db.setTransactionSuccessful(); } catch (Exception e) ..