와챠의 우당탕탕 코딩 일기장
[Android/Kotlin]Udemy 강의 정리: #5 UI 구성: 화면 이동 설계(Activity/Fragment 생명주기, Splash) 본문
[Android/Kotlin]Udemy 강의 정리: #5 UI 구성: 화면 이동 설계(Activity/Fragment 생명주기, Splash)
minWachya 2022. 6. 10. 15:53목차
- Manifest에 대해서
- allowBackup
- icon / label / roundIcon
- mipmap
- supportsRtl
- exported
- intenr-filter
- Splash
- api 30 이하 버전의 Splash
- api 31 이상 버전의 Splash
- Fragment Manager
- 액티비티 내에 프레그먼트를 추가할 수 있는 영역 만들기
- 프레그먼트 호출법
- Activity 생명주기
- Fragment 생명주기
- 기타 배운 것들
1. Manifest에 대해서
Manifest 내용
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.shoppi">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Shoppi">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<application> 태그 안
1-1. allowBackup
사용자 데이터를 구글 드라이브에 25메가바이트까지 자동으로 백업/복원 여부
android:allowBackup="true"
1-2. icon / label / roundIcon
기본 아이콘 / 앱이름 / 원형 아이콘
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
1-3. mipmap
: mipmap폴더에는 app icon res만 추가해야 함
여러 해상도에 대응하기 위함
1-4. supportsRtl
LtR: 왼쪽에서 오른쪽으로 읽는 것, ex: 한국어, 영어...
RtL: 오른쪽부터 왼쪽으로 읽는 것
supportsRtl: RtL 지원 활성화 여부: true | false
android:supportsRtl="true"
<activity> 태그 안
1-5. exported
다른 구성 요소로 이 Activity 실행할 수 있는지 여부
android:exported="true"
1-6. intenr-filter
메인 액티비티를 런처 액티비티로 사용하겠다
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2. Splash
api 31버전(S)부터 sdk 내부에서 스플래시 스크린 제공해줌
api 30 이하와 31 이상의 동작이 달라짐
2-1. api 30이하의 Splash Screen 만드는 법:
1. drawable > background_splah_screen.xml 생성
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<gradient
android:angle="315"
android:endColor="@color/shoppi_gradient_purple"
android:startColor="@color/shoppi_gradient_pink"
android:type="linear" />
</shape>
</item>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/img_logo" />
</item>
</layer-list>
2. theme에 아래 스타일 추가(기존 Theme을 확장함)
<style name="Theme.Shoppi.Splash">
<item name="android:windowBackground">@drawable/background_splah_screen</item>
</style>
3. SplashActivity 생성
package com.example.shoppi
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class SplashActivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
finish()
}
}
4. Manifest에서 SplashActivity 먼저 실행되게 + SplashTheme 적용되게 변경
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.shoppi">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Shoppi">
<activity
android:name=".SplashActivity"
android:exported="true"
android:theme="@style/Theme.Shoppi.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="false" />
</application>
</manifest>
2-1. api 31 이상의 Splash Screen 만드는 법:
android project의 리소스 파일은 버전별로 구분 가능함.
ex) mipmap-anydip-v26 폴더: 26버전 이상에서 참조하는 파일
values 폴더도 버전별로 구분 가능함
1. values-v31 폴더 생성하기
res 오른쪽 클릭 > New > Androud Resource Directory
2. values-v31에 theme.xml 추가
여기서 Splash 내용 정의해주면 된다.
이때 Theme의 이름은 위에서 정의한 Theme 이름과 같아야 한다!!
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Shoppi.Splash">
<item name="android:windowSplashScreenBackground">@color/shoppi_white</item>
</style>
</resources>
3. Fragment Manager:
액티비티에 프레그먼트를 추가/삭제/교체하는 작업 함
프레그먼트는 단독으로 존재할 수 없음
호스트 액티비티에 추가할 수 있는, 액티비티의 구성요소임
3-1. 액티비티 내에 프레그먼트를 추가할 수 있는 영역 만들기
FragmentContainerView
name: 맨 처음 보여줄 프레그먼트 지정하는 속성
android:name="com.example.shoppi.HomeFragment"
전체코드:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/container_main"
android:name="com.example.shoppi.HomeFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/navigation_main"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation_main"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/navigation_main" />
</androidx.constraintlayout.widget.ConstraintLayout>
3-2. 프레그먼트 호출법
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val button = view.findViewById<Button>(R.id.btn_enter_product_detail)
button.setOnClickListener {
val transaction = parentFragmentManager.beginTransaction()
transaction.add(R.id.container_main, ProductDetailFragment())
transaction.commit()
}
}
4. Activity 생명주기
1. onCreate
- 액티비티 생성되초 최초 한 번 호출되는 콜백
- 최초 한 번만 해도 좋을 작업하기
- ex) 레이아웃 인플레이트, 데이터 초기화
2. onStart
- 액티비티가 화면 벗어났다가 되돌아왔을 때 호출될 수 있음
- ex) 애니메이션 실행, 데이터 갱신
3. onResume
- 액티비티가 화면에서 보여짐(액티비티가 포커스를 얻음)
- 포커스를 얻었을 때 반드시 처리해야 하는 작업하기
4. onPause
- 포커스 잃었을 때 호출되는 콜백
- onResume, onPause는 자주 호출될 수 있어서 오래 걸리는 연산 처리하면 안됨
5. onStop
- onStart와 대응
- 애니메니션 중지, 데이터 갱신 중지
6. onDestroy
- 사용중인 앱 목록에서 완전히 제거될 때 호출
- onStop에서 정리하지 못한 작업이 있다면 리소스 해제 작업하기
5. Fragment 생명주기
프레그먼트는 액티비티에서 인플레이트 시키는 것이므로
액티비티의 상태에 따라 프레그먼트의 상태도 변함
1. onCreate
- 액티비티의 onCreate: 레이아웃 인플레이트
- but, 프레그먼트의 onCreate에서는 레이아웃 인플레이트 X
(프레그먼트는 액티비티에서 인플레이트 하기 때문에 액티비티가 먼저 인플레이트 되어야 하기 때문) - onCreateView에서 생성된 View를 가지고 onViewCreated에서 View 참조 얻을 수 있음
2. onViewStateRestored
- 화면 소멸 뒤 다시 재생성될 때 이전 저장했던 데이터 기반으로 View 복원할 때 불리는 콜백
- 프레그먼트 생명주기의 Create단계에서 호출되는 콜백들은 프레그먼트를 프레그먼트 매니저에 추가할 때 호출됨
3. onSaveInstanceState
- 화면소멸 전에 복원에 필요한 데이터 저장하는 단계
4. onDestroyView
- onCreateView와 대응
- 화면 소멸 직전에 리소스 해제하지 못한 거 정리
5. onStart, onResume, onPause, onStop, onDestroy은 Activity 생명주기와 동일
6. 기타 배운 것들
AppCompatActivity()의 Compat의미:
이전 버전과 호환성 지원
Layout inflate:
레이아웃을 띄움==
setContentView()의 인자로 레이아웃 id 전달하고, 이 레이아웃 내부에 구현되어 있는 것을 위젯으로 변경하는 과정==
View 하이어락키 정보(View의 위계관계, 트리구조)를 실제로 위젯을 인스턴스화시켜 화면에 그리는 것
어떠한 이벤트들을 알려 주는 메서드(콜백)는 이름 앞에 on 붙음
ex) onCreate, onStart, onResume
생명주기들 다시 봐서 좋았다.
봐도봐도 새로운 것 같은 생명주기^^ㅋㅋㅋ
버전별로 스플래시 다르게 만들어 주는 것,,
저번에 기본 Theme과 night Theme 도 챙겨주는 것처럼,,
하나만 하는 게 아니라 여러 버전들 생각해주는 것도 꼬옥 익혀야겠다 싶음
호환성!!! 귀찮다고 대충하지 말고 꼼꼼하게 생각하기
그리고... 새 파일 만들기 딘축키 : alt + insert
'코딩 일기장 > Android(Kotlin)' 카테고리의 다른 글
[Android/Kotlin]Udemy 강의 정리: #7 UI 구성: Home 화면(Json 파싱, Viewpager2 + TabLayout) (0) | 2022.06.11 |
---|---|
[Android/Kotlin]Udemy 강의 정리: #6 UI 구성: BottomNavigation 하단 탭 구성 (0) | 2022.06.10 |
[Android/Kotlin]Udemy 강의 정리: #4 UI 구성: 상품 상세 페이지 (0) | 2022.06.09 |
[Android/Kotlin]Udemy 강의 정리: Kotlin Basics(2) (0) | 2022.06.05 |
[Android/Kotlin]Udemy 강의 정리: Kotlin Basics(1) (3) | 2022.06.04 |