1주차 과제 (AndroidManifest, layout)
Basic
1. AndroidManifest 란 ?
1.manifest file이란 ?
쉽게 말하자면 명세서와 같다. 앱을 구성하는 요소들을 설명하는것.
이름 아이콘 등등 설정정보
어떤권한이 부여되었는지 시스템에 알려준다. 매우중요 !_!
모든 안드로이드 앱은 가장 상위 폴더에 매니페스트파일이 있어야 한다.
명세서 해당프로젝트에 어떤것들이 사용되는지 나타냄
app에 관한 정보를 입력하는 파일로, 모든 앱 프로젝트에는 '프로젝트폴더/manifest/'라는 경로에 AndroidManifest.xml으로 존재
2. 구성요소
아래는 manifest tag들 구성요소들이다.
주 속성 열가지를 좀 더 구체적으로 소개 해볼까 한다.
<action> | 인텐트 필터에 작업을 추가합니다. |
<activity> | 액티비티 구성 요소를 선언합니다. |
<activity-alias> | 액티비티의 별명을 선언합니다. |
<application> | 애플리케이션을 선언합니다. |
<category> | 인텐트 필터에 카테고리 이름을 추가합니다. |
<compatible-screens> | 애플리케이션과 호환되는 각 화면 구성을 지정합니다. |
<data> | 인텐트 필터에 데이터 사양을 추가합니다. |
<grant-uri-permission> | 상위 콘텐츠 제공자가 액세스할 권한이 있는 앱 데이터의 하위 집합을 지정합니다. |
<instrumentation> | 애플리케이션과 시스템의 상호작용을 모니터링할 수 있는 Instrumentation 클래스를 선언합니다. |
<intent-filter> | 액티비티, 서비스 또는 Broadcast Receiver가 응답할 수 있는 인텐트 유형을 지정합니다. |
<manifest> | AndroidManifest.xml 파일의 루트 요소입니다. |
<meta-data> | 상위 구성 요소에 제공할 수 있는 추가적인 임의의 데이터 항목에 대한 이름-값 쌍입니다. |
<path-permission> | 콘텐츠 제공자 내에서 특정 데이터 하위 집합에 대한 경로와 필수 권한을 정의합니다. |
<permission> | 이 애플리케이션 또는 다른 애플리케이션의 각 구성 요소나 기능에 대한 액세스를 제한하는 데 사용하는 보안 권한을 선언합니다. |
<permission-group> | 관련 권한의 논리적 집합에 대한 이름을 선언합니다. |
<permission-tree> | 권한 트리의 기본 이름을 선언합니다. |
<provider> | 콘텐츠 제공자 구성 요소를 선언합니다. |
<receiver> | Broadcast Receiver 구성 요소를 선언합니다. |
<service> | 서비스 구성 요소를 선언합니다. |
<supports-gl-texture> | 앱이 지원하는 단일 GL 텍스처 압축을 선언합니다. |
<supports-screens> | 앱이 지원하는 화면 크기를 선언하고 앱이 지원하는 것보다 큰 화면에 대해서는 화면 호환성 모드를 활성화합니다. |
<uses-configuration> | 애플리케이션이 요구하는 특정 입력 기능을 나타냅니다. |
<uses-feature> | 애플리케이션이 사용하는 단일 하드웨어 또는 소프트웨어 기능을 선언합니다. |
<uses-library> | 애플리케이션과 링크되어야 하는 공유 라이브러리를 지정합니다. |
<uses-permission> | 앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한입니다. |
<uses-permission-sdk-23> | 앱이 특정 권한을 원한다는 것을 지정합니다. 단, 오직 Android 6.0(API 레벨 23) 이상을 실행하는 기기에서 설치되는 경우에만 해당됩니다. |
<uses-sdk> | 하나 이상의 Android 플랫폼 버전과의 애플리케이션 호환성을 API 레벨 정수로 표시할 수 있습니다. |
1. <manifest>
매니페스트 파일에서 가장 위에 있는 태그이며 <application>을 포함해야 한다.
어플리케이션에 대한 전반적인 정보들을 포함한다.
xmlns:package : Android namespace를 정의
package : 패키지 이름 입력 ( 중복 불가 )
versionCode : 어플리케이션의 내부 버전 번호
versionName: 사용자에게 표시되는 어플리케이션의 버전번호
installLocation: 어디에 설치되는지, internalOnly, auto, preferExternal중에서 한가지를 선택하여 입력합니다. 앱의 기본 설치 위치를 설정할 수있습니다.
2. <application>
애플리케이션의 각 구성요소를 선언하고 모든 구성요소에 영향을 줄 수 있는 속성을 가진 하위요소를 포함한다.
android:allowBackup : application이 백업 및 복원 인프라에 참여하도록 허용할지 여부 기본은 true
android:icon= 리소스 경로를 입력하여 전체 애플리케이션에서 기본 아이콘으로 사용할수 있다.
android:label= 리소스 경로를 입력하여 전체 애플리케이션을 나타내는, 사용자가 읽을 수 있는 기본 라벨로 사용할수있다.
android:roundIcon= 둥근 형태의 아이콘을 설정하는 소겅
android:supportsRtl=애플리케이션이 RTL 레이아웃을 지원하는지 여부를 선언. sdk 17이상에선 지원
3. <activity>
안드로이드의 4대 컴포넌트중 하나. 말 그대로 액티비티를 정의한다. class
애플리케이션의 시각적 사용자 인터페이스 요소를 구현하는 액티비티를 선언한다.
<activity android:name=".MainActivity"> //액티비티의 클래스 이름
액티비티를 구현하는 클래스의 이름이다. 기본값은 없고 이름을 지정해야 한다.
4.<intent-filter>
암시적 인텐트를 통해 사용자로 하여금 어느 앱에 사용할지 선택하도록 하고자 할때 사용 !
다른앱에서 본인앱으로 접근하거나 본인앱에서 다른 앱으로 접근하기 위한 필터.
5.<action>
인텐트 필터에 작업을 추가한다. <intent-filter>는 <action>요소가 없다면 intent를 허용하지 않는다.
6. <meta-data>
쉽게 말하면 facebook kakaotalk등 과 연동하는것을 말한다.
상위 구성 요소에 제공할 수 있는 추가적인 임의의 데이터 항목에 대한 이름-값 쌍입니다. ->이게 정확
7. permission : ex) 작업을 허용하시겠습니까?
애플리케이션 설치할 때 카메라 위치 등등 정보등을 사용할 수 있게 허용하느냐 ? 의 담당
8. <provider>
콘텐츠 제공자 구성요소를 선언한다. 안드로이드 4대 컴포넌트중 하나인 ContentProvider의 서브클래스이다.
애플리 케이션의 모든 콘텐츠 제공자는 <provider>에서 정의해야 인식되고 사용된다.
9.<receiver>
브로드캐스트 리시버를 애플리케이션의 구송요소중 하나로 선언한다.
10.<service>
서비스 구성 요소를 선언합니다. Activity와 달리, 서비스는 시각적 사용자 인터페이스가 없습니다. 서비스는 오래 실행되는 백그라운드 작업이나 다른 애플리케이션에서 호출할 수 있는 리치 커뮤니케이션 API를 구현하는 데 사용합니다.
모든 서비스는 매니페스트 파일의 <service>
요소로 나타내야 합니다. 여기에 선언되지 않은 서비스는 시스템에 표시되지 않으며 실행되지 않습니다.
2.안드로이드 4대 컴포넌트(구성요소)
< 인텐트란 ? >
- 네가지 구성요소간의 정보 전달하는 통신수단 !
- 컴포넌트에 Action, Data 등을 전달한다.
1.액티비티(Activity) : 화면 관리자
2.서비스(Service) : 백그라운드 작업자
3.콘텐트 프로바이더(Content Provider): 데이터 제공자
4.브로드캐스트리시버(Broadcaster Receiver) : 방송수신자
네가지 요소는 intent를 통해 상호작용한다.
1. 액티비티
액티비티는 사용자화면(UI)를 담당한다. App에서 액티비티를 구현하기 위해서는
Activity class를 상속받아야 하고 Activity Life Cycle관련 메소드들을 재정의하여
원하는 기능들을 구현할 수 있다.
인텐트(intent)를 통해 다른 어플리케이션의 Activity를 호출할 수 있습니다.
App에는 하나 이상의 Activity를 포함하고 있어야 한다. 하지만 두개이상의 Activity를 Display할순없다.
2.서비스
서비스는 백그라운드(Background)에서 실행되는 프로세스를 의미한다.
화면에 보이지 않고(따로 UI를 가지지 않음) service class를 상속받아 구현한다.
App이 종료 되어도 시작된 서비스는 백그라운드에서 계속 동작한다.
액티비티와 서비스는 UI스레드라고 불리는 동일한 애플리케이션 스레드로 실행된다.
네트워크와 연동이 가능하다.
이해가 안 돼서 예시를 찾아보았는데, 핸드폰을 할 때 다른 어플을 틀면서 멜론이나 지니로 노래를 들을때라고 한다.
3.방송수신자
안드로이드 OS로부터 발생하는 각종 이벤트와 정보를 받아와 핸들링하는 컴포넌트입니다
사용자 디바이스의 네트워크 연결 해제, 시스템 부팅시 앱 초기화 등 특수한 이벤트에 대한 처리!
대부분 UI가 없고 특수상황대처에 사용한다.
4. 콘텐츠 제공자
데이터를 관리하고 다른 App의 데이터를 제공하는데 사용된다.
더 쉽게 말하자면 특정 App이 사용하고 있는 DB를 공유하기 위해 사용한다.
App간의 데이터 공유를 위해 표준화된 인터페이스를 제공한다.
- SQLite DB / Web / 파일 입출력 등을 통해서 데이터를 관리합니다.
-외부 애플리케이션이 현재 실행 중인 애플리케이션 내에 있는 데이터베이스(DB)에 함부로 접근하지 못하게 할 수 있으면 서 나 자신이 공개하고 공유하고 싶은 데이터만 공유할 수 있도록 도와줍니다.
- 작은 데이터들은 인텐트(Intent)로 애플리케이션끼리 데이터를 서로 공유가 가능하지만 콘텐 프로바이더는 음악 또는 사 진 파일 등과 같이 용량이 큰 데이터들을 공유하는데 적합합니다.
- 프로바이더는 데이터의 Read(읽기), Write(쓰기)에 대한 퍼미션이 있어야 애플리케이션에 접근이 가능합니다.
- 데이터베이스에서 흔히 사용되는 CURD(Create, Read, Update, Delete) 원칙을 준수합니다
2.팔레트에 있는 view들을 전부조사
ImageView : 아이콘이나 비트맵을 출력하는 위젯
WebView : 반응형 웹사이트를 안드로이드 디바이스에서 띄워줄수 있는 기능
※반응형 웹사이트 : pc뿐 아니라 다른 디바이스에서도 레이아웃 유연하고 강력하게 관리할수있도록 설계된 웹사이트
VideoView : 다양한 자원에서 영상을 불러올 수 있는 동영상 재생 전담 위젯
CalendarView: 스크롤이 가능한 달력을 보여주는 위젯
SearchView: 텍스트 검색을 수행할 수 있는 위젯, 어플에서 많이보이는 돋보기
TextureView : surfaceview와 비슷한 역할을 수행. 카메라 미리보기를 위한 place holder
surfaceview : 미리보기 지원
RecyclerView: 많은 수의 데이터 집합을, 제한된 영역 내에서 유연하게(flexible) 표시할 수 있도록 만들어주는 위젯
ScrollView: 수직으로 스크롤하는 기능
HorizontalScrollView: 수평으로 스크롤 하는 기능
NestedScrollView: 뜻 그대로 중첩된 스크롤 뷰 , 보통 ScrollView안에 RecycleView 가 들어있는 경우 사용
CardView: 곡선테두리와 음영을 표시할수있는형태의 레이아웃
NavigationView: 어플에서 보통 옆에 세줄 있는 걸 누르면 서랍처럼 다른 뷰가 나와서 정보를 보여주는것
ex) 쇼핑앱에서 옆에 누르면 자기정보 나오는거 같은것?
BottomNavigationView: 하단 메뉴를 구성
ListView : 사용자가 정의한 데이터 목록을 세로방향으로 나열하여 화면에 표시하는 뷰
RecyclerView랑 뭐가 다르지 ?? 의문 : listview는 세로만 지원..
GridView: listview와 비슷하지만 GridView는 2차원 형태 데이터를 1열이상으로 나열 가능.
3.layout조사 6가지
- layout은 ViewGroup을 상속 --> layout마다 자식인view를 배치하는 방법이 다르다.
1. linear Layout
속성
1.view를 수평 or 수직으로 배치할 수 있다. -> orientation속성을 통해서 결정.
android: orientation = "vertical" -> 수직
android: orientation = "horizontal" -> 수평
2. android:gravity = "bottom" -> gravity는 해당 layout의 모든 하위 뷰들에 대한 중력방향을 결정.
3. android:layout_weight = "1" - > 자식 뷰에 가중치를 지정해서 그 비율만큼 뷰의 크기를 지정
찾아보다가 이해가 쉬워서 퍼왔습니다.
상위 view group 하나와 그 밑에 하위 view 3개로 이루어진 화면.
비율은 1:2:3
4. ViewGroup안에 ViewGroup이 포함되는것이 가능하다. --> linearLayout안에 linearlayout을 포함할수 있다.
출처 : https://lktprogrammer.tistory.com/132
2. RelativeLayout
:자식 뷰 또는 부모 뷰 곤계에 따라 배치를 적용하는 layout
속성
1. gravity : RelativeLayout의 자식 뷰들의 중력방향을 결정.
ignoregravity : gravity 설정 상태에서 특정 자식 뷰에 대해 gravity 속성 무시.
-예시를 들자면 android:gravity: "bottom"으로 하면 아래 자식들은 모두 최하단에 위치하지만 , button1에 대해 ignoregravity를주면 button1은 bottom을 무시하고 위로 올라온다는 말입니다. !
2. 부모 뷰 그룹간의 관계에 따른 배치
layout_alignParentLeft : 부모 뷰 그룹 영역에서 왼쪽에 배치
layout_centerHorizontal : 부모 뷰 그룹 영역에서 수평중앙에 배치
layout_alignParentRight : 부모 뷰 그룹 영역에서 우측
layout_alignParentBottom : 상단에 배치
layout_alignParentVertical : 수직중앙
layout_centerInParent : 정중앙
보기 좋은 사진을 퍼왔습니다.
출처 : https://lktprogrammer.tistory.com/133?category=741470
3. 자식 뷰 간의 관계배치 속성
layout_above = [ 기준이 되는 뷰의 id] : 기준이되는 뷰의 상단에 배치
layout_alignTop = [기준이 되는 뷰 id] : 기준이 되는 뷰 상단의 아래쪽에 배치
layout_alignBottom =[기준이 되는 뷰 id] : 기준이 되는 뷰 하단의 위에 배치
layout_below = [기준이 되는 뷰 id] : 기준이 되는뷰 하단의 아래쪽
layout_toLeftOf =[기준이 되는 뷰 _id] : 기준이 되는뷰 하단의 아래쪽
layout_alignLeft = [기준이 되는 뷰 id] : 기준이 되는뷰 하단의 왼쪽
layout_toRightOf = [기준이 되는 뷰 id] : 기준이 되는 뷰 우측의 오른쪽
layout_alignRight = [기준이 되는 뷰 id] : 기준이 되는 뷰 우측의 왼쪾
layout_alignBaseline =[기준이 되는 뷰 id] : 기준이 되는 뷰에 텍스트가 존재 할 때
배치 될 뷰와 기준선에 맞추어 배치
보기 좋은 사진을 퍼왔습니다.
출처 : https://lktprogrammer.tistory.com/133?category=741470
3. ConstraintLayout
레이아웃 구성 시, 뷰 위젯의 위치와 크기를 유연하게 조절할 수 있게 만들어주는 레이아웃
찾아보면서, relative랑 다른게 뭔지 잘 모르겠다고 생각했다.
출처 : https://recipes4dev.tistory.com/158
속성
ConstraintLayout 속성 | 설명 |
---|---|
layout_constraintLeft_toLeftOf | 뷰의 왼쪽 사이드(Side)를 대상 뷰의 왼쪽 사이드(Side)에 맞춤. |
layout_constraintLeft_toRightOf | 뷰의 왼쪽 사이드(Side)를 대상 뷰의 오른쪽 사이드(Side)에 맞춤. |
layout_constraintRight_toLeftOf | 뷰의 오른쪽 사이드(Side)를 대상 뷰의 왼쪽 사이드(Side)에 맞춤. |
layout_constraintRight_toRightOf | 뷰의 오른쪽 사이드(Side)를 대상 뷰의 오른쪽 사이드(Side)에 맞춤. |
layout_constraintTop_toTopOf | 뷰의 위쪽 사이드(Side)를 대상 뷰의 위쪽 사이드(Side)에 맞춤. |
layout_constraintTop_toBottomOf | 뷰의 위쪽 사이드(Side)를 대상 뷰의 아래쪽 사이드(Side)에 맞춤. |
layout_constraintBottom_toTopOf | 뷰의 아래쪽 사이드(Side)를 대상 뷰의 위쪽 사이드(Side)에 맞춤. |
layout_constraintBottom_toBottomOf | 뷰의 아래쪽 사이드(Side)를 대상 뷰의 아래쪽 사이드(Side)에 맞춤. |
layout_constraintBaseline_toBaselineOf | 뷰의 텍스트 Baseline을 대상 뷰의 텍스트 Baseline에 맞춤. |
layout_constraintStart_toEndOf | 뷰의 시작 사이드(Side)를 대상 뷰의 끝 사이드(Side)에 맞춤. |
layout_constraintStart_toStartOf | 뷰의 시작 사이드(Side)를 대상 뷰의 시작 사이드(Side)에 맞춤. |
layout_constraintEnd_toStartOf | 뷰의 끝 사이드(Side)를 대상 뷰의 시작 사이드(Side)에 맞춤. |
layout_constraintEnd_toEndOf | 뷰의 끝 사이드(Side)를 대상 뷰의 끝 사이드(Side)에 맞춤. |
layout_goneMarginLeft | 뷰 위젯의 왼쪽(Left) 사이드 대상 뷰가 View.GONE 상태일 때 여백 설정. |
layout_goneMarginTop | 뷰 위젯의 위(Top) 사이드 대상 뷰가 View.GONE 상태일 때 여백 설정. |
layout_goneMarginRight | 뷰 위젯의 오른쪽(Right) 사이드 대상 뷰가 View.GONE 상태일 때 여백 설정. |
layout_goneMarginBottom | 뷰 위젯의 아래(Bottom) 사이드 대상 뷰가 View.GONE 상태일 때 여백 설정. |
layout_goneMarginStart | 뷰 위젯의 시작(Start) 사이드 대상 뷰가 View.GONE 상태일 때 여백 설정. |
layout_goneMarginEnd | 뷰 위젯의 끝(Start) 사이드 대상 뷰가 View.GONE 상태일 때 여백 설정. |
layout_constraintHorizontal_bias | 수평 방향(Left/Right 또는 Start/End) 사이드 제약 시, 양 사이드 간 위치 비율. |
layout_constraintVertical_bias | 수직 방향(Top/Bottom) 사이드 제약 시, 양 사이드 간 위치 비율. |
layout_constraintCircle | 원형 위치 지정에 사용될 대상 뷰 ID 지정. |
layout_constraintCircleRadius | 원형 위치 지정 시, 뷰 위젯과 대상 뷰 위젯 중심 사이의 거리. |
layout_constraintCircleAngle | 원형 위치 지정 시, 원 둘레에서 뷰 위젯이 배치될 각도. |
4. FrameLayout
여러개의 뷰를 중첩으로 배치하고 그 중 하나를 레이아웃의 전면에 표시할 때 사용 !
framelayout에 여러개의 같은 크기를 가진 view들을 배치했을 때, 마지막에 추가된 뷰만 화면에 보인다 !
속성
1. layout_gravity : view의 위치 지정
출처 :https://lktprogrammer.tistory.com/134?category=741470
3. visible or invisible
특정 뷰의 보이는 상태를 결정지는 속성 !
layout_red.setVisibility(View.GONE); // 보이게, 공간도 차지하지 않음
layout_red.setVisibility(View.INVISIBLE); // 보이지 않게, 그러나 공간은 차지
layout_red.setVisibility(View.VISIBLE); // 보이게
5. TableLayout
-뷰를 격자로 배치하는 layout. 이름과 똑같다 ! 말 그대로 테이블처럼 보이게 하는 layout
-여러개의 뷰를 동일한 크기로 배치해야 할 때 유용하다. 다른 레이아웃은 ViewGroup의 상속을 받지만 TableLayout은 LinearLayout을 상속
<TanbleRow>
<button>
<button>
</TanbleRow>
<TanbleRow>
<button>
<button>
</TanbleRow> --- > 버튼을 2x2로 배치
속성
1. stretchColumns
여유공간이 생기지 않도록 뷰를 배치하기 위해 사용
android:stretchColumns : <0,1,2> -- >숫자는 view의 인덱스 왼쪽부터 0이다. 모든column을 지정할땐 *사용
2. layout_span
해당 column이 지정한 값 만큼의 공간을 차지하게 된다.
layout_span = "2"를 적용하면 기존을 1이라고 하면 2만큼 차지하게 된다.
3. layout_column
layout_column에 인덱스 번호를 입력하면, 그 column이 지정된 index의 위치로 이동. (index는0부터시작)
column의 위치를 직접 설정할 때 사용한다 !
만약 네번째에 배치되어 있던 인덱스가 2였던 뷰에 layout_column ="3" 적용하면 한 칸 오른쪽으로 이동한다.
//움직임 기준은 index!! 중간에 빈 인덱스를 만들수도 있다.
6. GridLayout
2차원 격자무늬 형태! 열과 행의 집합형태로 구성..!
talbelayout의 단점 보완..! --> 다른 레이아웃과중첩할 필요가 없어 메모리 사용량을 줄일 수 있다.
속성
1. orientation : 자식 view들의 배치 방향 결정
orientation = "horizontal" -> 수평
orientation = "vertical" -> 수직
2. rowCount : 행의 개수
3. columnCount: 열의 개수
2,3번의 속성으로 tablelayout보다 편리하게 배치할 수 있을것 같다. .!(내생각)
4. alignmentmode
자식 뷰들을 정렬할 때 기준이 되는 뷰의 여백을 포함하여 나머지 뷰들을 정렬할지
결정하는 속성,, - > 기준이 되는뷰 : 가장 큰 너비 or 높이를 가지는 View
5. layout_gravity
익숙한 속성 다른 layout에서도 보았다. 하는역할은 똑같다. 위치배정 !
6. layout_row /layout_column
자식 view를 특정 행과열의 위치로 지정 가능
ex) app: layout_column ="0"
7. layout_columnspam/ layout_rowspan
지정한 값만큼 셀의 행과 열을 합치는 속성..! -> 한컴에서 많이 쓰는거 같은 ?
Challenge
1.어플 layout사용하여 구상하기 (최대한 많이)
아직 사용법을 잘 몰라서 제대로 하지는 못했습니다 ㅠ_ㅠ
제가 만들고 싶던 어플은 '지그재그' 이고
먼저 linearlayout 아래에 textview를 두어서 zigzag를 쓴 후
gridlayout으로 세개의 상품소개
아래는 tablelayout으로 2*2의 tableview를 만들었습니다.
색깔과 아이콘, 그리고 search는 멘토님께 물어보려고 합니다 .. .!