Skip to content

Issue #20

dongk00 edited this page Feb 18, 2022 · 3 revisions

Fragment Refresh

Main Fragment 내에 Viewpager를 생성하면서 viewpager의 3개의 fragment를 추가하였다. 3개의 fragments는 모두 같은 fragment를 재활용하여 사용한 것으로, viewpager를 swipe 할 때는 각각의 viewpager 내 fragment들이 pause와 resume을 거치는 것을 확인하였다.

그런데 그 상태에서 main fragment에서 navigate 할 경우 viewpager 내 fragment 어느 하나도 pause되지 않지만 main fragment 자체는 pause 된다. navigation에 등록된, viewpager의 parentfragment만 생명주기를 타는 것 같다.

새로운 정보 저장 후 addfragment에서 mainfragment로 navigateup 될 때 viewpager 내 fragment 한테 변경된 정보를 전달해야하는데, 이걸 add fragment에서 직접 viewpager 내 fragment의 viewmodel의 값을 변경하는 것도 까다롭고, viewpager fragment의 생명 주기 변화가 있는 것도 아니므로, 결국 mainfragment에서 viewpager를 refresh하는 방법으로 해결했다. -> 추후 좋은 방법을 계속 찾을 것

Desugar 추가

https://developer.android.com/studio/write/java8-support?hl=ko 코드를 짜다보면 특정 클래스의 API 요구 수준이 현재 min API level보다 높아 경고가 뜰 때, api 레벨을 고려해서 코드를 짜는 것이 아니라 desugar만 추가해주면 문제 없이 사용 가능. -> 정확히 문제 없는지는 추후 공부해봐야 함.

<build.gradle[Module]>
android defaultConfig 내
multiDexEnabled = true 추가

android compileOptions 내
coreLibraryDesugaringEnabled = true 추가

dependency 
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$desugar_version" 추가

Animation

좌측 상단이 x, y가 0% 우측 하단이 x, y가 100% 로 설정되어있다.

  1. BottomSheet BottomSheet 같은 경우 dialog 인데 , dialog는 navigate 할 때 action에 animation을 추가하면 작동하지 않는다. 클래스 내 override fun onCreateDialog 내에 아래 코드 추가해서 사용
dialog.window?.attributes?.windowAnimations = R.style.BottomSheetAnimation

<style name="BottomSheetAnimation">
    <item name="android:windowEnterAnimation">@anim/from_bottom</item>
    <item name="android:windowExitAnimation">@anim/to_bottom</item>
</style>
  1. Navigation from~to left, right animation 파일을 만들어서 사용했는데, 개념이 조금 헷갈린다. 1 fragment에서 2fragment로 들어간다 하면

enterAnim은 2fragment의 입장 모션이고, exitAnim은 1fragment의 퇴장 모션이다. 여기서 enterAnim이 왼쪽에서 온다면 (from_left) exitAnim은 오른쪽으로(to_right) 나가게 하는 것이 자연스럽다.

pop은 navigateup일 때 똑같이 생각해주면 된다. 즉 2fragment -> 1fragment로 생각하면 된다. 그럼 들어올 때의 방향과 이어지려면 popEnterAnim은 1fragment(backstack)의 입장 모션이고, popEnterAnim은 2fragment의 퇴장 모션이다. 처음 2fragment가 왼쪽에서 왔으므로 왼쪽으로 나간다 하면 popExitAnim은 to_left, 따라서 popEnterAnim은 from_right이다.

dialog에는 적용 X

CurrentInfo class 추가

App 전역에서 사용할 수 있는 클래스를 만들었다. 앱이 실행될 때 한 번 정해지면 되기 때문에 companion object로 선언했다. const는 LocalDate.now()와 같이 클래스가 아닌 string, int와 같은 단순 type만 지정할 수 있다. 계산이 필요한 변수의 경우 함수로 받아오게 하였다.

Appbar

원하는 디자인을 Appbar를 통해 하려고 했는데, Appbar는 모든 navigation의 하위 위젯이 아니기 때문에 모든 페이지에 적용되어 버린다. 그래서 appbar, collapsingtoolbar, toolbar의 활동을 최소한으로 줄였다. 거의 사용 안했다. 여기서 drawerlayout 방향이 rtl 이였기 때문에 메뉴가 포함된 toolbar도 rtl, 나머지(fragmentContainerView 등)는 ltr로 해줘야 메뉴하고 drawerlayout만 오른쪽에 배치된다. drawerlayout의 메뉴는 toolbar에 붙여지기 때문에 toolbar의 방향만 신경쓰면 된다.

그리고 appbar의 height를 높이면 floating action button의 위치를 첫 화면에 보이게 고정시키는 방법이 까다로웠다..

일말결산 design

아무래도 이전 scrollview에 모든 항목을 넣은 것보다 깔끔하게 되었다. item frame도 제거하니 탁 트이고 좁은 느낌이 들지 않는다. UI/UX 는 찾아보고 느껴보면서 간편하고 깔끔한 방향으로 만들 수 있게 계속 공부해야 하는 것 같다.

RecyclerView Context

RecyclerView 내에서 context를 받기 위해서 parameter로 context를 전달하는게 아니라, 안에서 viewholder의 parent.context를 받아올 수 있다.

private lateinit var context: Context

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyCheckItemViewHolder {
    context = parent.context
    return DailyCheckItemViewHolder(DailyCheckItemBinding.inflate(LayoutInflater.from(parent.context),parent,false))
}

toast function

fun Any.toast(context: Context): Toast {
    return Toast.makeText(context, this.toString(), Toast.LENGTH_SHORT).apply { show() }
} 

font

ttf 파일 다운 후 xml 파일 생성

<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/_alexbrush_regular"/>
</font-family> 

Clone this wiki locally