일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- textfield
- livedata
- data
- Coroutines
- 앱바
- android
- binding
- ScrollView
- Kotlin
- appbar
- Flutter
- Button
- CustomScrollView
- LifeCycle
- scroll
- Compose
- Navigation
- 앱
- drift
- activity
- 테스트
- textview
- viewmodel
- 안드로이드
- DART
- tabbar
- TEST
- 계측
- Dialog
- intent
- Today
- Total
Study Record
[안드로이드] Activity 와 layout 파일 본문
😶 Activity 와 Layout
프로그램을 시작할 때 main 함수로 시작한다거나 하는 단일 진입 지점이 안드로이드 앱에는 존재하지 않는다. 핸드폰 기기의 앱 아이콘을 눌러 앱을 시작할 때도 있고 특정 앱을 사용하다가 카메라 앱에 접근하는 등 여러 가지 방식으로 앱을 시작할 수 있다.
Activity 는 사용자와 상호작용하기 위한 진입점이고 사용자 인터페이스(버튼, 검색 입력 바 등)를 포함한 하나의 화면이다. Activity 는 사용자 인터페이스에 대한 규격을 가지고 있는 layout 파일을 가진다.
(layout 파일 예시)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
다음 예시 코드에서도 onCreate() 함수가 불릴 때 setContentView() 함수로 해당하는 layout 파일을 인수로 받고 있다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
액티비티가 어떤 사용자에게 보여지는 화면을 정의한다는 것은 이제 알지만, 어떤 타이밍(상황)에 어떤 액티비티가 사용될지를 정해야 한다.
앱 아이콘을 눌러 실행했을 때 실행되는 화면이 어떤 건지,
카메라 기능이 있는 앱인데 다른 앱에서 카메라의 기능을 사용하고자 할 때 어떤 화면을 보여줄지,
등 상황마다 불러야 할 화면이 다를 수 있다. 이런 사항들을 정의하는 것은 AndroidManifest.xml 파일이다.
매니패스트 파일(AndroidManifest.xml) 에는 <activity>에 Activity 에 대한 정보도 기재되어 있는데 그 태그 안에 Intent-filter 태그로 어떤 상황에 해당 Activity 가 사용되는지 정의할 수 있다. 다음 코드는 사용자가 앱 아이콘을 눌러 시작했을 때 시작할 Activity 를 보여준다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapp">
<application
android:name=".config.ApplicationClass"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Mbamboo"
tools:targetApi="31">
<activity
android:name=".src.SplashActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
😶 layout 구조
레이아웃은 View 와 ViewGroup 객체의 계층 구조를 사용하여 빌드된다. 반드시 하나의 루트 View Group 이 존재한다.
View 객체는 일반적으로 위젯이라고 불리며 사용자가 보고 상호작용할 수 있는 것을 그리고, ViewGroup 객체는 레이아웃 구조를 정의하는 보이지 않는 컨테이너이다.
예를 들어, LinearLayout(ViewGroup) 이면 View 와 ViewGroup 을 선형으로 위치할 수 있는 컨테이너이며 수평, 수직으로 View 와 ViewGroup 을 위치시킬 수 있다. RelativeLayout(ViewGroup) 은 하위 View 와 ViewGroup 를 기준으로 얼마큼 떨어져 있는지 등으로 서로 겹칠 수 있게 뷰를 위치할 수 있다.
😶 레이아웃 매개변수(LayoutParams)
View 와 ViewGroup 의 컨테이너 역학을 하는 ViewGroup 는 LayoutParams 를 가지고 하위 요소에 확장한다. 따라서 하위 요소의 LayoutParams 는 상위 요소에 적합한 LayoutParams 를 정의해야 한다.
이는 런타임 도중 새로운 뷰를 생성할 때 상위 ViewGroup 이 LinearLayout 이면 LinearLayout.LayoutParams 를 가지고 RelativeLayout 이면 RelativeLayout.LayoutParams 를 가져야 한다는 의미이다.
LayoutParams 에는 너비와 높이(layout_width, layout_height), 여백과 테두리 (Padding, margin) 을 포함한다.
'안드로이드' 카테고리의 다른 글
[안드로이드] kotlin, java jdk, gradle 버전 맞추기 (0) | 2023.06.13 |
---|---|
[안드로이드] TextView 속성 값 한번에 정리하기 (0) | 2023.06.12 |
[안드로이드] 매니패스트 개요 (0) | 2023.06.11 |
다양한 픽셀 밀도 지원(기기에 따른 이미지 지원, sp, dp) (0) | 2023.06.10 |
앱 리소스와 관리 (0) | 2023.06.09 |