반응형

전체 글 129

[Android] Compose Dialog Animation

개요Compose를 활용할 때, Dialog를 활용하기 위해서 Dialog 함수를 많이 사용합니다. 또한, Animation을 적용하기 위해서 AnimatedVisibility 함수를 사용하면 아마 코드가 이런 식으로 작성될 것이라고 생각됩니다.val openDialog = remember { mutableStateOf(false) }AnimatedVisibility( visible = openDialog.value, ...) { Dialog(onDismissRequest = {}) { Text("Test") } }출처 : https://stackoverflow.com/questions/72527630/animatedvisibility-not-working-with-dialog 다만, D..

[Android] Compose TextField

개요 TextField는 유저가 텍스트를 입력할 수 있도록 하는 Composable 함수이다. Composable TextField View에서 EditText를 정의했을 땐, 정의한 후 텍스트 입력이 자유로웠지만, TextField에서 텍스트 입력을 사용하기 위해서는 remember API를 함께 사용해야 한다. 아래 코드 블록과 같이 text에 대한 선언이 없다면 TextField에 Text 입력이 제대로 이루어지지 않는다. var text by remember { mutableStateOf("") } TextField( value = text, onValueChange = { text = it }, ) remember API는 간단하게 이야기하면 포함되어 있는 Composable 함수에 저장되는 변..

[Android] Compose Button

개요 Composable 함수를 사용하여 다양한 Button을 쉽게 만들 수 있다. 버튼은 사용자가 정의된 작업을 트리거할 수 있도록 도와주는 기본 구성요소이다. Composable Button 일반적으로 Button은 onClick 속성과 content 속성을 정의한다. onClick 속성은 모든 버튼이 공통적으로 갖고 있는 속성이며, 여기에 트리거를 정의한다. content 속성은 Composable 함수를 정의하는 람다식으로 Composable Button 안에 contents를 custom 하기 위해 자유롭게 정의할 수 있다. Button(onClick = { /*TODO*/ }) { } Text Button 구현하기 일반적으로 Button 안에 Text를 입력한 형태를 가장 많이 사용한다. Co..

[Android] Compose Text

개요 Android에서 UI를 개발할 때 Text는 꼭 필요한 중요 요소 중의 하나이며, Jetpack Compose를 사용하면 Text를 더 쉽게 표현할 수 있다. Text Text의 text 속성 값은 String 형식이다. 따라서 문자열 변수를 사용하거나 직접 입력이 가능하며, strings.xml에 정의한 속성 역시 사용 가능하다. Column { Text(text = "Hello World") Text(text = stringResource(id = R.string.hello_world)) } String 값과 strings.xml 속성을 사용하는 방법과 결과물이다. 둘 사이의 차이점은 없다. Text Style 색상 변경 Text( text = stringResource(id = R.strin..

[Android] LiveData setValue(), postValue() deep dive

개요 LiveData는 수명 주기를 인식하는 Observable data holder class 이다. LiveData는 몇 가지 특성을 갖고 있다. 데이터를 보유할 수 있다. 또한, 모든 유형의 데이터에 사용할 수 있는 Wrapper class이다. Observable 하다. LiveData 객체에서 보유한 데이터가 변경되면 관찰자에게 알림이 제공된다. 수명 주기를 인식한다. LiveData에 관찰자를 연결하면, 관찰자는 LifecycleOwner(일반적으로 Activity 또는 Fragment)와 연결된다. LiveData는 STARTED, RESUMED와 같은 활성 수명 주기 상태인 관찰자만 업데이트 한다. LiveData 객체의 setValue(), postValue() postValue() 작업..

Foundation/Android 2024.02.11

[Android] ViewModel이 Configuration Change에서도 유지되는 이유

주의 : 글이 깁니다. 티스토리는 코드 가독성이 매우 떨어집니다. 편집기에 복사해서 보시는 걸 추천합니다. 개요 안드로이드를 개발하는 방법이 다양해지면서 .xml로 앱을 만들어 봤고, Compose를 사용해서 앱을 만들고도 있습니다. View를 그리는 방법과 ViewModel에서 데이터를 홀드하는 방법이 다양해졌는데, 제 생각에 그 중에서 ViewModel이 유일하게 기존에 사용법과 동일한 사용법으로 안드로이드 개발에서 사용되고 있다고 생각됩니다. 물론 구글에서 동일하게 사용할 수 있도록 작업을 해주셨기에 가능한 일이겠지만, 이런 ViewModel을 조금 더 자세히 알고 싶어졌습니다. ViewModel의 Lifecycle과 흔히 Configuration Change가 발생하더라도 데이터를 유지할 수 있기..

Foundation/Android 2023.12.04

[Android] Compose Column (Make a Vertical Layout)

소개 Column Modifier VerticalAlignment Content: @Composable ColumnScope.() -> Unit LazyColumn 예제 소개 Compose로 수직 방향 레이아웃을 구성할 때 사용하는 Layout으로 Column이 있다. 수직 방향 레이아웃을 가진 List를 구현할 때도 Column을 사용하는데, XML View 기반으로 구성할 때 사용하는 RecyclerView와 비교했을 때 굉장히 적은 코드로 리스트를 구성할 수 있다는 장점이 있으며, RecyclerView 기능을 완전히 대체할 수도 있다. Column은 Compose의 기초가 되는 Layout답게 androidx.compose.foundation.layout 패키지에 있다. Column @Compos..

[RxJava] Observable, Single, Completable

Observable Single Completable Observable RxJava에서 Observer는 Observable을 구독한다. (예를 들어 ViewModel에서 어떤 API를 호출하면 ViewModel이 Observer 역할을 하고, API의 Response가 Observable이 된다.) 가장 기본적인 형태이며 연속적인 값을 emit 하면 그 값을 모두 구독해서 호출부에서 받을 수 있다. Emitter Event onNext : 정상적으로 emit한 값을 받을 때 호출되는 함수. onComplete : Observable 구독을 종료하면 호출되는 함수. onError : Observable 구독 중 에러가 발생하면 호출되는 함수. Single Observable과 달리 연속적인 값이 아닌 ..

Mobile/RxJava 2023.10.18

[Android] FileProvider 파일 다운로드 및 경로 이슈. (파일 다운로드, Read .PDF 파일)

예상 구현 준비 사항 Manifest.xml 추가 Provider 권한 관련 경로 XML 파일 추가 첫 번째 시도 두 번째 시도 결론 예상 구현 모바일 기기 저장소에 .pdf 파일을 저장한 후 앱에서 파일의 이름을 추적하여 해당 .pdf 파일을 불러올 수 있다. 해당 기능 구현을 테스트하기 위해서 Test Application이라는 새로운 프로젝트를 생성하였다. 준비 사항 오래 전 학생 때 저장소 URI를 통해서 파일에 직접 접근이 가능하던 것이 떠올랐으나, Android SDK 24 버전 이상부터는 File Provider를 사용해서 파일에 접근해야 접근이 가능하도록 설계되었다고 한다. 이 둘의 차이점은 URI 앞부분에서 쉽게 확인할 수 있었다. 변경된 이유 중 한 가지를 예상했을 때 보안에 중점을 둔..

Mobile/Issues 2023.10.18

[Android] Hilt @Binds와 @Provides 차이점. (abstract and object)

@Binds @Provides @Binds를 사용할 때 abstract으로 선언하는 이유 예상 @Provides를 사용할 때 object로 선언하는 이유 예상 @Binds constructor를 가질 수 없는 interface의 인스턴스를 제공해야 할 때 사용할 구현을 Hilt에 알려준다. 함수 반환 유형은 함수가 어떤 인터페이스의 인스턴스를 제공하는지 Hilt에 알려준다. 함수 매개변수는 제공할 구현을 Hilt에 알려준다. @Binds를 사용하기 위해서는 module을 abstract class로 bind 함수를 abstract function으로 만들어야 한다는 것에 주의하자. 또한, @Provides와 비교하여 @Binds로 생성된 Hilt 자동 생성 클래스 개수가 더 적다. 구현체에 반드시 @In..