안드로이드 (16) 썸네일형 리스트형 Sealed Class를 이용한 Retrofit 결과 처리 sealed class Result { data class Success(val data: T) : Result() data class Check(val message: String) : Result() data class Error(val message: String) : Result() override fun toString(): String { return when (this) { is Success -> "Success[data=$data]" is Check -> "Type Check[message=$message]" is Error -> "Error[exception=$message]" } } } sealed class를 사용할 경우 enum과는 달리 여러가지 형태의 데이터 유형을 선택할 수 있.. 안드로이드 테스팅 개발을 하다 보면 Repositrory 혹은 UseCase(domain 레이어를 사용할 경우)에서 로직이 정상적으로 작동하는지 시험해 보고 싶을 때 가 있을 것이다. 이와 관련하여 hilt와 TestDispatcher, mockk등을 이용하여 쉽게 테스팅 코드를 설정하는 법에 대해 알아보자 먼저 app단 gradle에 라이브러리를 추가해준다. testImplementation ("com.google.dagger:hilt-android-testing:2.41") // ...with Kotlin. kaptTest ("com.google.dagger:hilt-android-compiler:2.41") // ...with Java. testAnnotationProcessor ("com.google.dagger.. 광고 정책 위반으로 앱 삭제 대응 위와 같은 내용의 메일을 받아서 앱이 게시 삭제 되었었다. 광고가 포함된 activity 내에 startActivityForResult를 사용하는 코드를 정책위반으로 간주하여 해당부분을 수정하여 배포하니 해결되었다. 안드로이드 postValue protected void postValue(T value) { boolean postTask; synchronized (mDataLock) { postTask = mPendingData == NOT_SET; mPendingData = value; } if (!postTask) { return; } ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable); } postValue는 위와 같은 식으로 구성되어 있다. 네트워크 통신후 livedata와 databinding을 통해 UI를 수정하려는 경우 Main Thread 사용을 위해 setValue 대신 postValue를 사용해주어야 한다. viewmodel에서 R.string 처리하기 viewmodel에서 livedata(Int)를 통해 R.string값을 데이터 바인딩 하여 xml에서 context.getString(해당하는 값) 이런식으로 사용하면 된다. ex) viewmodel) val textResource = MutableLivdata(R.string.hello) layout) android:text="@{context.getString(viewModel.textResource)}" 안드로이드에서 이미지 파일 저장 후 갤러리 앱이 인식 못하는 경우 MediaStore를 이용하여 해당 파일을 이미지 라고 인식 시켜줘야 된다. ex) val values = ContentValues().apply { this.put(MediaStore.Images.Media.TITLE, "my picture") this.put(MediaStore.Images.Media.DESCRIPTION, "camera picture") this.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") this.put(MediaStore.Images.Media.DATA, file.absolutePath) ... .... 리사이클러뷰 아이템 하나씩 넘기기 (viewpager같이) val snapHelper = PagerSnapHelper() snapHelper.attachToRecyclerView(binding.testRecylcerView); //리사이클러뷰 PagerSnapHelper 이용하면 가능하다. 여기에 다른 아이템의 일부분을 확인 하기 위해서는 xml에서 리사이클러 뷰에 android:clipToPadding="false" android:paddingStart="30dp" android:paddingEnd="30dp" 값을 입력하고 아이템 xml에는 android:layout_marginEnd="6dp" android:layout_marginStart="6dp" app:cardElevation="3dp" 같은 값들을 입력하면 된다 단 여기서 주의할 점은 마진값이 pa.. retroift @query , @path 주소(url) example 예를들어 http://leesmemo.tistory.com/admin/entry/post/?id=2 식의 url이 있다고 치면 url = "http://leesmemo.tistory.com/" (kotlin으로 작성)@GET("{admin}/{entry}/{post}")Call getInfo(@Path("admin") String andmin, @Path("entry") String entryee, @Path("post") String post, @Query("id") String id); 사실 admin이나 entry, post는 바뀔 필요가 없지만.. 예제 이므로 위와 같이 path를 사용해 주었다.path의 admin에 "a"를 주고 entry에 "b", post에 "c", "id"에 6을 준다면h.. 이전 1 2 다음