Android

- 기존에 아래와 같은 Vertical Grid Composable을 사용하고 있었다.LazyVerticalGrid( columns = GridCells.Fixed(2), contentPadding = PaddingValues(8.dp), modifier = Modifier.fillMaxSize()) { items(filteredList) { item -> MemoItemView(item, onClick = { selectedMemo = item coroutineScope.launch { sheetState.show() } }, onEdit = { onEdit.invoke(it) }, o..
- Hilt를 기반으로 Network Module을 만들고, Retrofit provide 함수를 생성했을 때, 다음과 같이 baseUrl을 고정해 놓았었다.@Singleton@Providesfun provideRetrofit( okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .client(okHttpClient) .baseUrl(ServerStatus.API_URL_PRFIX) .addConverterFactory(GsonConverterFactory.create()) .build()} - 하지만 가끔 다른 Base URL을 요구하는 api를 사용해야 하는 경우도 있다. -..
- 이전에 Image 컴포저블을 활용하여 중첩된 원형 프로필 이미지를 구현했었다. - 하지만 프로필 이미지가 기본 drawable이 아니고, File이나 네트워크로부터 수신받아야 하는 경우가 있다. - 이 경우에 Coil의 AsyncImage를 활용하여 보여주도록 처리했다.//A composable that executes an ImageRequest asynchronously and renders the result.@Composablefun AsyncImage( model: Any?, contentDescription: String?, modifier: Modifier = Modifier, transform: (State) -> State = DefaultTransform, ..
- 이미지를 중첩시키고 싶다면 Box 컴포저블을 사용하면 된다. Z 축으로 쌓이는 컨테이너 구조이다. - Image 말고 다른 컴포저블들도 중첩된다.@Composablefun Avatar(~~) { Box( modifier = Modifier.wrapContentSize() ) { Image(~~~) Image( painter = painterResource(id = R.drawable.abc), contentDescription = "Profile", modifier = Modifier .size(size.dp) .padding(3.5.dp) ..
- 기존 내 서비스에서 구성되어 있던 API 호출 구조는 매번 Api Task Class를 만들어 Base를 통해 Retrofit 객체를 생성하고 호출하는 과정이었다.- 각종 초기화 및 고정 Header 값 추가 등의 코드가 난잡하게 구성되어 있어 가독성 및 관리에 좋지 않았다. - 의존성 자동 주입을 위해 Hilt와 이참에 MVVM 패턴까지 적용해 봤다.Network Module- 일단 기존에는 Api Task Class 내부에 매번 API 인터페이스를 다르게 생성했는데, 전반적인 모든 API func을 담을 ApiService를 구성했다.interface ApiService { @GET("api/test") suspend fun getTest( @Query("zoneId") z..
- Hilt 기반으로 Network Module을 구성했는데, 갑자기 제목과 같은 오류가 발생했다. - 다음 함수가 문제였다.@Provides@Singletonfun provideApiService(retrofit: Retrofit, service: Class): T = retrofit.create(service)- Hilt는 DI 그래프를 컴파일 타임에 생성하기 때문에, 어떤 타입을 주입할지 명확히알아야 한다.그런데 위처럼 로 제네릭을 쓰면 어떤 타입인지 컴파일 시점에 알 수 없기 때문에 에러가 발생한 것. - 아래처럼 Api 호출 관련 함수가 하나로 정리된 Interface를 지정해 주면 된다.@Provides@Singletonfun provideApiService(retrofit: Retro..
- 위와 같은 형태의 동적 가이드를 Compose 기반으로 구현했다. - 애니메이션을 제공하는 JSON 파일의 경우, 디자이너분으로부터 제공받은 점 참고. - JSON 파일의 경우 res - raw 폴더를 생성하여 넣어주면 된다. (압축하지 않고, 변형 없이 앱에 들어가야 하는 파일들) - 영상을 보면, JSON 애니메이션이 바로 나타나는게 아니라 서서히 페이드인 되면서 나타난다. - 이를 위해 Compose의 AnimatedVisibility를 활용한다.AnimatedVisibility( visible = showGuide, enter = fadeIn(animationSpec = tween(1500)), exit = ExitTransition.None) { ...- 뷰의 가시성을 조정할..
- Ripple은 Android 5.0 (21) 머터리얼 디자인에 소개되었으며, 버튼을 클릭하였을 때, 물결이 퍼지듯이 효과가 나오는 기능이다.- Compose에서도 지원하고 있다. Modifier를 기반으로 적용 가능하다.@Composablepublic fun rememberRipple( bounded: Boolean = true, radius: Dp = Dp.Unspecified, color: Color = Color.Unspecified): Indication { val colorState = rememberUpdatedState(color) return remember(bounded, radius) { PlatformRipple(bounded, radius,..
- FAB란 앱의 주요 인터페이스 위에 둥둥 떠있다 하여 붙여진 이름으로서 앱의 기본 대표 동작들을 수행할 수 있도록 하는 버튼이다. - 보통 화면 오른쪽 하단에 둥근 사각형, 타원, 원으로 많이 표시된다.- 디자인 시스템 및 커스터마이징에 적합하도록 Compose 기반 직접 해당 버튼을 구현했다. - 먼저 상위 컴포저블로 Surface를 사용해준다.Surface( modifier = Modifier .size(52.dp) .clip(CircleShape) .clickable( interactionSource = interactionSource, indication = rememberRipple( ..
- 둥근 모양 테두리 이미지를 사용하는 간단한 방법이 있다. - material에서 제공하는 ShapeableImageView를 사용하는 것이다. 스타일만 지정해 주면 원하는 모양의 이미지뷰를 구성할 수 있다. - 먼저 values - styles.xml에 RoundedCornerImage에 대한 style을 선언한다. - 그리고 XML에서 ShapeableImageView를 선언하고, AppearanceOverlay 요소로 생성한 style을 적용한다.- strokeColor, storkeWidth 또한 설정 가능하다.
SeungYong.Lee
'Android' 태그의 글 목록 (4 Page)