기리's Android 이야기63 [Android/Kotlin] 안드로이드 Expandable RecyclerView 만들기 안녕하세요. 오늘은 Expandable이라고 불리는 확장가능한 RecyclerView에 대해서 알아보겠습니다. RecyclerView를 사용해서 목록을 보여줍니다. 목록안에 세부적인 정보를 숨기고 사용자가 특정 목록의 내용을 보고 싶을때만 열리고 닫히는게 하는것이 UI적으로도 보기 좋을때가 있습니다. 이러한 기능을 구현하는 방법에 대해서 알아보겠습니다. 크게 생각하면 아래 두가지를 구현한다고 생각하시면 됩니다. 1. RecyclerView 아이템 레이아웃에 상세 레이아웃 추가(클릭시 gone -> visible) 2. 화살표 버튼 Toggle 구현 완성된 모습은 아래와 같습니다. STEP01. build.gradle/app 추가 circleImageView 라이브러리를 추가합니다. 프로필 사진을 Circ.. 기리's Android 이야기 2021. 2. 8. 더보기 ›› [Android/Kotlin] 안드로이드 ConstraintLayout(3) Guideline 안녕하세요. 지난번 Barrier에서 이어서 Guideline 기능에 대해서 알아보겠습니다. 2021/02/07 - [Android/Material Design] - [Android/Kotlin] 안드로이드 ConstraintLayout(1) Chain 2021/02/07 - [Android/Material Design] - [Android/Kotlin] 안드로이드 ConstraintLayout(2) Barrier 가이드라인은 디자인 작업을 하시는 분들에게 익숙한 개념입니다. 보통 안드로이드 디자인을 하는 툴인 Adobe XD 에서도 많이 사용하고 있습니다. 가이드라인을 생성하는 방법은 아래와 같습니다. 이러한 가이드 라인을 언제 사용하면 좋을까요? 안드로이드를 개발할 때 android:layout_ma.. 기리's Android 이야기 2021. 2. 7. 더보기 ›› [Android/Kotlin] 안드로이드 ConstraintLayout(2) Barrier 안녕하세요. 지난번 ConstraintLayout Chain에 이어서 Barrier 기능에 대해서 알아보겠습니다. 2021/02/07 - [Android/Material Design] - [Android/Kotlin] 안드로이드 ConstraintLayout(1) Chain [Android/Kotlin] 안드로이드 ConstraintLayout(1) Chain 안녕하세요. 오늘은 ConstraintLayout의 기능중에 Chain에 대해서 알아보겠습니다. Chain은 사용 가능한 공간 내 뷰들간의 분할되는 방식을 제어할 수 있는 제약조건입니다 그리고 기존 레이아웃 중에 L android-dev.tistory.com Barrier 라는 영어단어는 '장벽'을 뜻하는 말로 뭔가 레이아웃에 벽을 만들어준다 라고.. 기리's Android 이야기 2021. 2. 7. 더보기 ›› [Android/Kotlin] 안드로이드 ConstraintLayout(1) Chain 안녕하세요. 오늘은 ConstraintLayout의 기능중에 Chain에 대해서 알아보겠습니다. Chain은 사용 가능한 공간 내 뷰들간의 분할되는 방식을 제어할 수 있는 제약조건입니다 그리고 기존 레이아웃 중에 LinearLayout에서 사용하였던 weight 속성을 ConstrainrLayout에서도 사용할 수 있습니다. 그럼 만드는 방법에 대해서 설명드리겠습니다. STEP01. 체인 만들기 Chain은 여러 뷰들로 구성되어 있기때문에 Chain을 만들기 위해서 연결할 뷰들을 모두 선택해야 합니다. 아래와 같이 모든 TextView를 선택하고, 우클릭 Chain > Create Horizontal Chain을 선택하여 체인을 만들 수 있습니다. 체인을 생성하면 아래와 같이 뷰들의 관계 및 위치가 변화.. 기리's Android 이야기 2021. 2. 7. 더보기 ›› [Android/Kotlin] 안드로이드 Gradient TextView 안녕하세요. 오늘은 TextView에 Gradient 효과를 주는 방법에 대해서 알아보겠습니다. 아래와 같이 글씨에 Gradient 효과가 들어갑니다. [LinearGradientSpan.kt] class LinearGradientSpan( private val containingText: String, private val textToStyle: String, @ColorInt private val startColorInt: Int, @ColorInt private val endColorInt: Int ) : CharacterStyle(), UpdateAppearance { override fun updateDrawState(tp: TextPaint?) { tp ?: return var leadingW.. 기리's Android 이야기 2021. 2. 7. 더보기 ›› [Android/Kotlin] 안드로이드 ViewBinding with BaseActivity, BaseFragment 안녕하세요. 오늘은 BaseActivity 클래스와 BaseFragment 클래스를 사용하여 좀 더 편안하게 ViewBinding을 사용하는 방법에 대해서 알아보겠습니다. 액티비티와 프레그먼트가 많아질수록 ViewBinding을 초기 세팅하는 일도 만만치 않습니다. 초기 세팅을 Base 추상 클래스에서 구현하도록 하겠습니다. BaseActivity에서 구현하는 방법입니다. [BaseActivity.kt] abstract class BaseActivity( val bindingFactory: (LayoutInflater) -> B ): AppCompatActivity() { private var _binding: B? = null val binding get() = _binding!! override fu.. 기리's Android 이야기 2021. 2. 6. 더보기 ›› [Android/Kotlin] 안드로이드 ViewPager2 인트로 화면 with Navigation Component 안녕하세요. 오늘은 ViewPager2를 사용하여 Intro 화면을 만드는 방법에 대해서 알아보겠습니다. 인트로 화면은 앱을 처음 실행할때 앱의 간단한 사용에 대해서 설명해주는 페이지입니다. 최초 실행시만 보여지고, 그 이후에는 사용자가 볼 수 없도록 구현해 보도록 하겠습니다. 완성된 모습은 아래와 같습니다. 인트로 화면을 구현하기 위해서 Navigation Component를 사용했습니다. 프로젝트의 전반적인 구조는 아래와 같습니다. 액티비티는 MainActivity 하나만 존재합니다. 메인 액티비티 안에서 Fragment 간의 상호작용이 발생하고, 이는 Navigation Component를 사용하여 구현할 예정입니다. SplashFragment 에서 Splash화면을 로딩해주고, 만약 최초 실행이라.. 기리's Android 이야기 2021. 2. 6. 더보기 ›› [Android/Error] 안드로이드 error: cannot find symbol @dagger.hilt.InstallIn(value = {ApplicationComponent.class}) Dagger Hilt를 업데이트하고 나서 Build를 하니깐 아래와 같은 에러가 발생했습니다. error: cannot find symbol @dagger.hilt.InstallIn(value = {ApplicationComponent.class}) ApplicationComponent 가 SingletonComponent 으로 이름이 변경되었다고 합니다. Ctrl + Shift + F 를 통해서 ApplicationComponent를 찾아서 SingletonComponent로 변경했더니 잘 되네요.. 기리's Android 이야기 2021. 2. 5. 더보기 ›› [Android/admob] 안드로이드 애드몹 app-dts.txt 이슈 해결하기 안녕하세요. 오늘은 구글 애드몹에서 app-ads.txt 추가 메시지와 관련하여 해결하는 방법에 대해서 알아보겠습니다. app-ads.txt를 추가하거나 업데이트 하지 않으면 나중에 불이익이 발생할 수 도 있기 때문에 구글이 시키는대로 추가하는 것이 좋습니다. 먼저 애드몹 페이지에 들어가 우측에 APP-ADS.TXT 탭으로 이동합니다. 그러면 아래와 같은 페이지를 볼 수 있습니다. app-ads.txt 파일을 찾을 수 없다고 하네요. 파란 버튼의 APP-ADS.TXT 설정 방법을 클릭해 보겠습니다. 아래 스니펫을 복사하여 개발자 웹사이트 루트에 넣어서 게시하라고 하네요... 근데 웹사이트가 없는데.. 티스토리에 하면 될라나? 검색을 해봤더니 티스토리는 안된다고 합니다. 구글 Blogger에서는 된다고 하.. 기리's Android 이야기 2021. 2. 5. 더보기 ›› [Android/Kotlin] 안드로이드 Notification(1) 안녕하세요. 오늘은 알림 이벤트인 Notification을 구현해 보도록 하겠습니다. 안드로이드 Notification은 아래 그림과 같이 제목, 메시지 그리고 아이콘 등이 표시됩니다. 구현하는 방법은 NotificationComapt.Builder 객체를 사용하여 알림 콘텐츠와 채널을 설정해야 합니다. setContentTitle() -> 제목 setContentText() -> 본문 setSmallIcon() -> 작은 아이콘 setPriority() -> 우선순위 설정 그리고 안드로이드 8.0 이상부터는 NotificationChannel 인스턴스를 createNotificationChannel()에 전달하여 등록해야합니다. 그리고 알림 메시지 클릭 이벤트 등을 처리하기 위해 PendingInten.. 기리's Android 이야기 2021. 2. 5. 더보기 ›› [Android/Kotlin] 안드로이드 Room Database 사용하기(3) Migration 안녕하세요. 오늘은 Room Database를 사용하다가 Migration이 필요할 때 Migration 하는 방법에 대해서 알아보겠습니다. 테이블을 추가하거나 컬럼을 변경하는 경우에 유용하게 사용할 수 있습니다. 오늘 설명드릴 케이스는 expense_table에 새로운 컬럼을 추가하는 방법입니다. (지출 목록을 분류할 수 있는 category 컬럼 추가 예정) 지난 예제에 이어서 설명드리겠습니다. 2021/02/01 - [Android/AAC] - [Android/Kotlin] 안드로이드 Room Database 사용하기(2) Select... 2021/01/30 - [Android/AAC] - [Android/Kotlin] 안드로이드 Room Database 사용하기(1) 먼저 그냥 컬럼을 추가한다고.. 기리's Android 이야기 2021. 2. 5. 더보기 ›› [Android/Error] 안드로이드 java.lang.IllegalStateException: An instance of OnFlingListener already set. 안녕하세요. 오늘은 RecyclerView에서 SnapHelper를 적용하는 도중에 아래와 같은 에러가 생겼습니다. java.lang.IllegalStateException: An instance of OnFlingListener already set. OnFlingListener 인스턴스가 이미 존재하는 에러라는데... OnFlingListener 리스너를 한번 찾아 봤는데 아래와 같은 설명이 있었습니다. This class defines the behavior of fling if the developer wishes to handle it. Subclasses of RecyclerView.OnFlingListener can be used to implement custom fling behavior.. 기리's Android 이야기 2021. 2. 4. 더보기 ›› [Android/Kotlin] 안드로이드 FLAG_FULLSCREEN Deprecated... 안녕하세요. 오늘은 WindowManager.LayoutParams.FLAG_FULLSCREEN 코드가 Deprecated 되어서, 새로운 방법으로 구현하는 방법에 대해서 소개해 드립니다. API >= 30 이상 부터는 WindowInsetsController.hide()를 통해 구현하시면 됩니다. 아래는 예제 코드입니다. class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.splash_activity) if (Build.VERSION.SDK_INT >= Build.VERSION.. 기리's Android 이야기 2021. 2. 4. 더보기 ›› [Android/Error] 안드로이드 NullPointerException: WindowInsetsController... FullScreen 화면을 구현 하던 중 WindowManager.LayoutParams.FLAG_FULLSCREEN가 Deprecated 되어서, 아래와 같이 새로운 코드를 추가하던 중 에러가 발생했습니다. class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.insetsController?.hide(WindowInsets.Type.statusBars()) } else { window.setFlags( Window.. 기리's Android 이야기 2021. 2. 4. 더보기 ›› [Android/Kotlin] 안드로이드 Multi Selection RecyclerView 만들기 안녕하세요. 오늘은 RecyclerView로 여러 아이템을 선택하는 방법에 대해서 알아보겠습니다. 흔히 Multi Selection RecyclerView라고 말합니다. 리스트뷰에서 특정 아이템을 선택하여 따로 저장하거나 삭제하는 경우에 유용하게 쓸 수 있습니다. 오늘 보여드릴 시나리오는 아이템 목록에서 다중선택을 통하여 삭제하는 흐름 입니다. 처음 아이템이 선택되면 버튼이 활성화 되고 삭제하기 버튼을 클릭하면 선택 된 아이템의 갯수가 토스트 메시지로 표시가 됩니다. 완성된 모습은 아래와 같습니다. STEP01. 레이아웃 구성하기 레이아웃은 RecyclerView와 그 아래 삭제 버튼으로 구성했습니다. [activity_main.xml] STEP02. RecyclerView 구현하기 RecyclerVie.. 기리's Android 이야기 2021. 2. 2. 더보기 ›› [Android/Kotlin] 안드로이드 TextInputLayout 사용해보기 안녕하세요. 오늘은 TextInputLayout에 사용법에 대해서 알아보겠습니다. TextInputLayout은 EditText를 기반으로 좀 더 유연한 동작을 보여주는 레이아웃입니다. TextInputEditText를 감싸고 있습니다. TextInputLayout을 사용하기 위해서는 Material Library가 추가되어 있어야합니다. implementation 'com.google.android.material:material:1.2.1' 기본적인 사용법은 아래와 같습니다. TextInputEditText에 Hint 값을 "이메일..."로 주었습니다. 아래와 같이 EditText에 포커스가 주어질때 Hint 값이 TextInputLayout의 라벨로 이동합니다. TextInputLayout 의 스타.. 기리's Android 이야기 2021. 2. 2. 더보기 ›› [Android/Kotlin] 안드로이드 Room Database 사용하기(2) Select... 안녕하세요. 오늘 Room Databse를 활용해서 데이터를 가져오는 방법에 대해서 말씀드리겠습니다. 지난 시간에는 Room Database에 대한 설명과 간단하게 데이터를 입력하는 방법에 대해서 알아봤습니다. 2021/01/30 - [Android/AAC] - [Android/Kotlin] 안드로이드 Room Database 사용하기(1) 오늘은 입력한 데이터를 가져오도록 하겠습니다. 저장하기 버튼을 누르면 바로 아래 ReclclerView 목록에 가져오도록 합니다. 완성된 모습은 아래와 같습니다. 프로젝트 구조는 아래와 그림과 같습니다. STEP01. Resource 클래스 만들기 Resource 파일은 sealed class 입니다. sealed라는 말은 봉인된이라는 의미로 무언가를 봉인하고 있는 .. 기리's Android 이야기 2021. 2. 1. 더보기 ›› [Android/Error] 안드로이드 ViewModelProvider 에러발생 VIewModel을 사용하던 중 에러가 발생했습니다. 에러가 발생했던 코드 부분입니다. MainViewMdoel를 생성할 때 찾을 수 없다는 에러였습니다. mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java) 파라미터로 owner 객체뿐만 아니라 factory 객체를 만들어서 넘겨서 같이 해결했습니다. [MainActivity.kt] mainViewModel = ViewModelProvider(this, MainViewModel.Factory(application)).get(MainViewModel::class.java) [MainViewModel.kt] class Factory( private val application: App.. 기리's Android 이야기 2021. 1. 31. 더보기 ›› [Android/Kotlin] 안드로이드 Section(Group) RecyclerView 만들기 안녕하세요. 오늘은 Section 또는 Group RecyclerView에 대해서 알아보겠습니다. 여기서 말하는 Section 또는 Group이라는 말은 대분류안에 소분류가 있다고 생각하시면 될 것 같습니다. 예를들어 데이터를 일단 날짜별로 일단 보여주고, 해당날짜에 상세 내역을 보여주는 용도로 보면 될 것 같습니다. 그래서 오늘은 아래와 같은 시나리오를 준비했습니다. 1. 그룹(고등학교, 대학교, 직장 등) 리스트 보여주기 2. 그룹 내 친구 리스트 보여주기 완성된 모습은 아래와 같습니다. STEOP01. 데이터 클래스 만들기 두가지 데이터 클래스가 존재합니다. 하나는 그룹별 친구리스트를 보여주는 SectionModel 클래스이고, 친구 정보를 담는 Friend 클래스를 만들어 줍니다. [Section.. 기리's Android 이야기 2021. 1. 31. 더보기 ›› [Android/Kotlin] 안드로이드 Room Database 사용하기(1) 안녕하세요. Room Datebase를 사용하는 방법에 대해서 알아보도록 하겠습니다. 먼저 Room Database는 안드로이드에 내장된 SQLite를 통한 데이터베이스 사용에 도움을 주는 AAC 라이브러리입니다. Room은 SQLite에 대한 추상화 레이어를 제공하여 데이터베이스 사용을 쉽게 해줍니다. 여기서 말하는 데이터베이스는 Local 데이터베이스로, 사용자의 폰에 저장하는 형태입니다. 간단한 데이터를 처리하는 경우 쉽고 빠르게 처리할 수 있는 장점이 있습니다. Room은 아래와 같이 세가지 주요 구성요소가 있습니다. (공식문서) 1. Entity: 데이터베이스 내의 테이블을 나타냅니다. POJO클래스에 @Entity 어노테이션을 추가하여 생성합니다. 2. Dao: 데이터베이스에 액세스하는데 사용.. 기리's Android 이야기 2021. 1. 30. 더보기 ›› 이전 1 2 3 4 다음