1주차 과제
Android studio
Manifest 조사
Palette 조사
Layout 6가지(Linear, Relative, Table, Grid, Constraint, Frame)
Challenge. Layout이 맘에 드는 앱 따라 Layout 적용하여 만들기
1주차 과제
1.모든 앱프로젝트에 있어야 한다.
Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보를 설명합니다.
앱을 빌드하면서 대부분의 매니페스트 요소가 추가된다.
선언해야 하는 것
- 다른 앱 → 이 앱
- 이 앱 → 시스템 또는 다른 앱
- 보호된 부분에 액세스
- 필요한 하드웨어 및 소프트웨어 기능
- 설치할 수 있는 기기의 종류가 달라짐(google play에서)
시작 : startActivity()
Android 5.0(API 레벨 21) 이상 : JobScheduler
Android 5.0(API 레벨 21) 이하 : Service
일회성 service작업(예: 파일 다운로드) : Intent를 startService()에 전달
★명시적 인텐트 : 실행할 app지명, 지정
★암시적 인텐트 : 특정 이름을 대지 않고, 조건에 부합하는 app 실행
<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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
1라인 : XML version (1.0), utf-8 = (8-bit Unicode Transformation Format)
XML header 예시
2라인 :
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
해당 앱에 관한 필수정보를 설명하는 탭
xmlns:android
패키지 이름 : com.daniel.app.testproject // 보통 com.소속(이름).app or android.프로젝트명 으로 한다.
5 라인 : <application
어플리케이션을 선언한다.
App 구성요소 선언 + 하위요소 포함
구성요소에 해당하는 속성의 기본값 설정
6 라인 : android:allowBackup="true"
백업 및 복원에 참여하도록 할 것인가?
False : 어플리케이션의 백업 또는 복원이 수행되지 않습니다.
모든 애플리케이션 데이터가 adb를 통해 저장되는 전체 시스템 백업에 의해서도 안됨. 이 속성의 기본값은 true
기본 아이콘 모양
Mipmap : 화소가 떨어진 거리에 따라 여러 가지 수준이나 텍스쳐 크기를 저장한 후 객체(오브젝트)에 그래픽 화질과 성능을 개선하여서 매핑시킨 것
전체 애플리케이션을 나타내는, 사용자가 읽을 수 있는 라벨 및 애플리케이션의 각 구성요소의 기본 라벨입니다.
애플리케이션이 오른쪽에서 왼쪽(RTL) 레이아웃을 지원하는지 여부를 선언합니다.
속성이 true일 경우
targetSdkVersion이 17 이상 : 앱이 RTL 레이아웃을 표시할 수 있도록 시스템에서 다양한 RTL API가 활성화되고 사용됩니다.
targetSdkVersion이 16 이하 : 레이아웃은 항상 왼쪽에서 오른쪽이 됩니다.
기본값은 false
모든 활동의 기본 테마를 정의하는 스타일 리소스의 참조입니다.
11라인 :
앱의 필수정보(manifest) 안에
앱 (application) 안에
Activity – 앱의 단일 화면 선언
android:name=".MainActivity">
.mainactivity만 선언해도 앞에 붙여서
com.daniel.app.testproject.mainactivity 로 해석함
mainactivity는 해당 어플리케이션activity의 최초 시작점
12 라인 :
Intent filter : 어떤 intent를 사용할 것인가에 대한 조건? 필터가 들어갈 곳
구성요소 이름, 데이터, 카테고리, 엑스트라, 플래그
13 라인 :
Action 텐트 필터에 작업을 추가합니다.
요소에 요소가 하나 이상 포함되어야 한다.
작업의 이름
예를 들어 ACTION_MAIN이면 'android.intent.action.MAIN'을 사용하고 ACTION_WEB_SEARCH이면 'android.intent.action.WEB_SEARCH'를 사용합니다
15라인 :
Intent filter의 category 부분
CATEGORY_LAUNCHER의 문자열 값은 'android.intent.category.LAUNCHER'입니다.
16 라인 :
인텐트 필터 닫기
17 라인 :
액티비티 닫기
18 라인 :
어플리케이션 닫기
19 라인 :
Manifest 닫기
이미지에서 중요한 색상을 추출하여 시각적으로 매력적인 앱을 만드는 데 도움이 되는 지원 라이브러리이다.
textview
글
button
버튼
Imageview
사진
Recyclerview
RecyclerView 위젯은 ListView가 더 진보하고 유연해진 버전입니다.
RecyclerView 모델에서는 여러 다양한 구성요소가 함께 작동하여 데이터를 표시합니다
fragment
한 화면에 여러 개의 화면 요소를 원하는 수요가 늘어가고 있습니다.
기존의 Activity를 통한 레이아웃 구성만으로는 구현하기 버겁다.
이를 커버하기 위해 나온것이 안드로이드 프래그먼트(Fragment)입니다.
프래그먼트는 액티비티 내에서 화면 UI의 일부를 나타냅니다.
여러 개의 프래그먼트를 조합하여 한 화면의 UI를 표현
일부 프래그먼트를 다른 액티비티에 재사용할 수 있습니다.
액티비티(Activity)처럼 하나의 독립된 모듈처럼 실행되기 때문에 액티비티와 연관된 생명주기를 가지고 있으며
액티비티 실행 중, 화면에 동적으로 추가되거나 다른 Fragment로 교체가 가능합니다.
레이아웃을 분리 관리할 수 있고,
액티비티의 화면 구성을 위한 레이아웃의 복잡도도 줄일 수 있습니다.
태블릿 환경에서는 하나의 액티비티로 조합될 수 있는 반면(화면이 커서)
모바일 단말기에서는 두 개의 액티비티로 분리되어 사용될 수 있습니다.
Fragment android studio에서 구현이 안됨
주의할점 : 스크롤뷰에는 단 하나의 위젯만 넣을 수 있다.!!
그래서, 스크롤뷰 안에 리니어레이아웃(LinearLayout)을 1개 넣고(일반적으로 LinearLayout을 사용, 다른 layout도 가능), 그 안에 자신이 원하는 위젯을 여러 개 넣는 방법을 사용함.
스크롤뷰 내부에 둘 이상의 위젯을 넣게 된다면 아래와 같은 로그를 확인하게 될것이다.
java.lang.IllegalStateException: ScrollView can host only one direct child
ScrollView - xml코드
수직으로 스크롤되므로 레이아웃의 orientation은 vertical이어야 함.
결과화면
수직, 수평으로 스크롤 해보면 오르쪽에 화면이 스크롤 되면서 스크롤바가 생겨남.
View와 Widget의 차이
패키지 레벨에서는 android.view 패키지에 포함되어 있고,
클래스 레벨에서는 스크린 레이아웃이나 사용자와의 상호작용을 핸들링하는 기본적인 사용자 인터페이스 클래스들을 제공한다.
간단히 말해, 스크린에 사각 영역에 그림을 그리고, 사용자 입력을 핸들링하는 클래스들의 집합 정도로 생각하면 된다.
구체적인 실체는 보이지 않지만 이 영역에는 대략 요만한 사이즈의 무언가가 들어가는 추상적인 개념 정도로 봐도 되겠다.
안드로이드 어플리케이션 화면상을 구성하는 비주얼 UI 엘리먼트들을 통칭하는 패키지 이름이다.
ImageView, TextView, Button 등을 통칭하는 이름이다.
Widget 패키지내의 클래스들은 앞서 설명드린 View 클래스 또는 ViewGroup 클래스를 상속 받는다.
정리하면
*Widget이 명시화된 클래스가 아닌 개념화된 패키지로 import되는 것이다.
*개발시에는 View 위주로 커뮤니케이션한다.
Imageview
Displays image resources,
for example Bitmap or Drawable resources.
ImageView is also commonly used to apply tints to an image and handle image scaling.
Web View
A View that displays web pages.
Basic usage
In most cases, we recommend using a standard web browser, like Chrome, to deliver content to the user.
WebView objects allow you to display web content as part of your activity layout, but lack some of the features of fully-developed browsers.
A WebView is useful when you need increased control over the UI and advanced configuration options that will allow you to embed web pages in a specially-designed environment for your app.
Video View
Displays a video file.
The VideoView class can load images from various sources
provides various display options such as scaling and tinting.
Note: VideoView does not retain its full state when going into the background.
Calendar View
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<CalendarView
android:id="@+id/calendar"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
/>
<CalendarView
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:minDate="04/01/2012" // 달력에 표시할 최소 날짜 mm/dd/yyyy
android:maxDate="12/31/2012" // 달력에 표시할 최대 날짜 mm/dd/yyyy
android:focusedMonthDateColor="#ff0000" // 현재 선택된 달의 배경 색상
android:unfocusedMonthDateColor="#0000ff" // 선택되지 않은 달의 배경 색상
android:selectedWeekBackgroundColor="#ffff00" // 선택된 "주"의 배경 색상
android:showWeekNumber="false"
android:weekSeparatorLineColor="#00ff00"
/>
firstDayOfWeek : 제일 왼쪽의 첫 요일 (디폴트 1 : 일요일이 시작, 2: 월요일이 시작)
minDate : 달력에 표시할 최소 날짜
maxDate : 달력에 표시할 최대 날짜
focusedMonthDateColor : 현재 선택된 달의 배경 색상
selectedWeekBackgroundColor : 선택된 주의 배경 색상
unfocusedMonthDateColor : 선택되지 않은 달의 배경 색상
showWeekNumber : 왼쪽에 "1주차, 2주차, 3주차... "를 보여줄 것인가를 지정 (디폴트는 true)
weekNumberColor : "주(週)"차의 색상을 지정
weekSeparatorLineColor : 주 사이의 구분선. 디폴트는 투명한 색
selectedDateVerticalBar : 선택한 날짜 양쪽에 보일 수직바에 대한 드로블
안드로이드에서 프로그레스바(ProgressBar)는, 앱 내에서 어떠한 작업이 수행될 때, 그 작업의 진행 상태를 시각적으로 보여주기 위해 사용하는 뷰(View) 위젯입니다.
시크바는 ProgressBar를 확장하여 사용자가 터치로 상태를 변경할 수 있도록 한 뷰이다. 시크바는 볼륨 조절이나 화면 밝기 조절 등에 사용할 수 있으며 발생된 이벤트는 SeekBar.OnSeekBarChangeListener 인터페이스를 통해 처리할 수 있다.
Layout
세로 또는 가로의 단일 방향으로 모든 하위 요소를 정렬하는 뷰 그룹
android:orientation 특성을 사용하여 레이아웃 방향을 지정할 수 있습니다.
하위 요소는 순차적으로 스택된다.
세로 목록의 경우 너비에 상관없이 한 행당 하나의 하위 요소만 있게 된다.
가로 목록의 경우 높이가 한 행 높이이다.
.
Layout 가중치
android:layout_weight
특성으로 개별 하위 요소에 가중치를 할당한다.
화면에서 얼마나 많은 공간을 차지해야 하는지
상위 뷰 큰 가중치= 남은 공간을 모두 채우도록 확장될 수 있습니다.
하위 뷰는 가중치 값을 지정시 비율에 따라 할당
기본 가중치는 0입니다.
균등분포
동일한 크기의 공간 :
세로 android:layout_height = "0dp" // 가로= android:layout_width = "0dp"
• 세 개의 텍스트 필드가 있는데 그 중 두 개가 가중치를 1로 선언하고 다른 하나에는 가중치가 지정되지 않은 경우 가중치가 지정되지 않은 세 번째 텍스트 필드는 확장되지 않고 해당 콘텐츠에 필요한 영역만 차지합니다. 반면 다른 두 텍스트 필드는 세 필드가 모두 측정된 후 남은 공간을 균등하게 채우도록 확장됩니다.
가중치1
가중치1
가중치X
• 세 개의 텍스트 필드가 있는데 그중 두 개가 가중치를 1로 선언하고 세 번째 필드에 가중치가 (0 대신) 2로 지정되면 다른 두 필드보다 더 중요한 것으로 선언된 것입니다. 따라서 전체 남은 공간 중 절반을 차지하며, 처음 두 개 필드가 나머지를 균등하게 나눠 갖습니다.
가중치1
가중치1
가중치2
예를 들어)
다음 코드 스니펫은 "메시지 전송" 액티비티에서 레이아웃 가중치가 어떻게 작동하는지 보여줍니다. To 필드, Subject, Send 버튼은 각각 필요한 높이만 차지합니다. 이 구성을 사용하면 메시지 자체가 그 액티비티 높이의 나머지 공간을 차지합니다.
이 중에서 세번째 edittext 코딩을 보면,
Match parent : 너비는 해당 레이아웃 컨테이너를 모두 채운다.
선형 layout 의 정렬방법은 vertical이고
세로의 높이 측정치에 0을 두었다. 나머지는 두지 않음.
가중치 1을 둠으로써 나머지 공간을 다 쓰게 된다.
Gravity를 이용해서 정렬은 위쪽에 정렬
상대 위치에 하위 뷰를 표시하는 뷰
위치는 동위 요소(예: 다른 뷰의 왼쪽 또는 아래)에 상대적이거나
상위 RelativeLayout 영역(예: 맨 아래, 왼쪽 또는 중앙으로 정렬됨)에 상대적인 위치로 지정될 수 있습니다.
중첩된 뷰 그룹을 없애고 레이아웃 계층 구조를 평면으로 유지하여 성능을 개선
사용자 인터페이스 설계에 매우 유용
여러 개의 중첩된 LinearLayout 그룹을 사용한다면 단일 RelativeLayout으로 대체할 수 있다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp" >
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/reminder" />
<Spinner
android:id="@+id/dates"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/times" />
<Spinner
android:id="@id/times"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignParentRight="true" />
<Button
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/times"
android:layout_alignParentRight="true"
android:text="@string/done" />
</RelativeLayout>
그림과 같은 구조를 만들기 위해
RelativeLayout을 사용한다면, 모든 자식(Children) 뷰에 상대적 위치 지정을 위한 속성을 일일이 지정해야 하므로, 레이아웃 작성이 번거로워질 수 있습니다.
그나마 LinearLayout을 사용하면 좀 더 편하게 만들 수 있지만, 자식(Children) 뷰들의 가중치(weight)를 하나하나 지정해줘야 하는 문제가 있습니다.
이보다 더 좋은 방법이 없을까요? 음.. 있습니다. 그것은 바로 TableLayout을 사용하는 것입니다.
TableLayout을 사용하는 기본적인 방법은, TableLayout 아래에 TableRow를 선언하여 행(Row)을 추가하고, TableRow아래에 뷰(View) 위젯을 선언하여 열(Column)를 추가하는 것입니다.
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#F44336"
android:textColor="#FFFFFF"
android:text="A" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#9C27B0"
android:textColor="#FFFFFF"
android:text="B" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#3F51B5"
android:textColor="#FFFFFF"
android:text="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#00BCD4"
android:textColor="#000000"
android:text="2" />
</TableRow>
</TableLayout>
GridLayout은 2차원 격자무늬 형태의 레이아웃으로 행과 열의 집합형태로 구성된 레이아웃입니다.
TableLayout의 단점을 보완한 레이아웃으로 LinearLayout 또는 FrameLayout과 같은 다른 레이아웃의 장점을 포함하는 레이아웃입니다.
GridLayout을 사용할 시 다른 레이아웃과 중첩으로 사용할 필요가 없어 메모리 사용량을 줄일 수 있다는 장점이 있습니다.
alimengntMode
alignmentMode 속성은 자식 뷰(View)들을 정렬할 때 기준이 되는 뷰(View)의 여백을 포함하여 나머지 뷰(View)들을 정렬할지를 결정하는 속성입니다.
이때 기준이 되는 뷰(View)란 가장 큰 너비 혹은 높이를 가지는 뷰(View)를 의미합니다.
여러 개의 뷰를 중첩으로 배치하고
그중 하나를 레이아웃의 전면에 표시할 때 사용하는 레이아웃입니다.
반드시 전면에 나오는 뷰(View)만 표시되는 건 아닙니다. 위에서는 FrameLayout에 중첩되는 뷰(View)들이 모두 통일한 크기일 때 얘기입니다. 만약 위 그림처럼 가장 마지막에 들어간 뷰(View)의 크기가 먼저 들어간 뷰(View)보다 작으면 먼저 들어간 뷰(View)의 일부도 나타날 수 있습니다.
평면 보기 계층 구조(중첩 보기 그룹이 없음)로 크고 복잡한 레이아웃을 만들 수 있습니다.
동위 보기와 상위 레이아웃 사이의 관계에 따라 모든 보기의 레이아웃이 결정된다는 점에서 RelativeLayout과 비슷하지만,
RelativeLayout보다 유연하고 Android 스튜디오의 Layout Editor와 함께 사용하기가 더 쉽습니다.
제약조건(Constraint) 개요
ConstraintLayout에서 위치를 정의 - 가로 및 세로 제약조건을 각각 하나 이상
각 제약조건은 각기 다른 기준으로 한 정렬 또는 연결을 나타냅니다.
각 제약조건은 세로 또는 가로 축을 따라 보기의 위치를 정의하므로, 각 보기에는 축마다 하나 이상의 제약조건이 있어야 하며, 흔히 더 많이 필요합니다.
보기를 Layout Editor에 놓으면 제약조건이 없어도 둔 위치에 그대로 남아 있습니다. 이는 단지 더 쉽게 편집하도록 한 것이며, 기기에서 레이아웃을 실행할 때 보기에 제약조건이 없으면 [0, 0](맨 위 왼쪽 모서리) 위치에 그립니다.
그림 1의 편집기에서 레이아웃은 문제가 없어 보이지만, 보기 C에 세로 제약조건이 없습니다. 기기에 이 레이아웃을 그리면 보기 C가 보기 A의 왼쪽과 오른쪽 가장자리에 맞게 가로로 정렬되지만, 세로 제약조건이 없으므로 화면의 맨 위에 표시됩니다.
제약조건이 누락되어도 컴파일 오류가 발생하지는 않지만,
Layout Editor에서는 누락된 제약조건을 툴바에 오류로 표시합니다.
Show Warnings and Errors 를 클릭하세요.
자동 연결 및 제약조건 추론 기능을 사용하여 제약조건을 자동으로 추가합니다.
Nice tutorial!