-
안드로이드 프로그래밍Android 2019. 6. 18. 23:19
안드로이드 기초
개발환경
안드로이드 앱개발은 보통
IDE(통합개발환경)로 안드로이드 스튜디오를 사용한다
프로젝트 파일 구성

https://developer.android.com 안드로이드 스튜디오는 4개 영역으로 프로젝트를 나눔
manifests : 앱설정 및 권한설정
java : 내부로직(백엔드)
res : 앱 리소스(레이아웃, 오디오, 이미지 등)
gradle : 프로젝트 빌드 구성
res폴더안의 모든 파일과 폴더 이름은 소문자로 해야한다
app > manifests > AndroidManifest.xml
매니페스트 파일
app > java > com.example.프로젝트이름 > MainActivity
기본 Activity. 앱의 진입점. 앱을 빌드하고 실행하면 시스템은
이 Activity 의 인스턴스를 시작하고 해당 레이아웃을 로드
app > res > layout > activity_main.xml
MainActivity의 UI 레이아웃이 정의되어있다
액티비티 이름이 MailActivity 이면 activity_mail.xml 로 형성된다
Gradle Scripts > build.gradle
프로젝트용. 앱 모듈용 2가지 파일 존재
Gradle 도구에서 앱을 컴파일하고 빌드하기 위해 대부분의 모듈에 대한 build.gradle 파일을 사용
프로그래밍 방식
이벤트 기반 프로그래밍
특정 소스에 대해 이벤트를 설정하고 콜백메소드 정의
Activity는 xml파일과 java파일 2가지로 구성된다
웹에 비유하면 xml의 역할은 html이고, java는 javascript 이다
xml파일(화면구성 layout)
1. 가장 처음 특정 레이아웃에 관한 태그 설정
1-2. tools:contex
t속성으로 관련된 java파일(클래스)와 연결2. 그 안에 리소스에 대한 태그(view)들로 구성
각 리소스에는 ID와 속성이 있음
위젯=컴포넌트=뷰=엘리먼트
html에선 각 요소를 엘리먼트라 부른다면
안드로이드에선 view라는 용어를 사용
java파일(로직)
0. 연관된 xml파일을 지정한다
setContentView()
1. xml에 있는 리소스를 찾는다
findViewById()
2. 리소스에 일어날 이벤트에 대해 콜백을 지정
setOnClickListener(), setOnTouchListener(), setOnLongClickListener() 등..
액티비티 생명주기
R 클래스
리소스를 참조할 수 있도록
프로젝트의 모든 리소스에 대한 ID를
변수명으로 하여 주소값들을 저장한 클래스이다
시스템에서 자동으로 생성하고 관리됨
Cannot resolve symbol R 에러가 자주뜨니 주의..
일차적인 해결방안 : menu탭->project->clean
안드로이드 주요 클래스와 api
액티비티
리눅스 커널에서 프로세스로 실행됨
하나의 UI(화면)를 갖음
하나의 앱에서 여러 액티비티를 가질수있다
한 액티비티가 다른 액티비티를 호출하여 전환. 이때 Intent 객체를 전달
하나의 액티비티가 여러 개의 Fragment를 가질 수 있다
액티비티 관련 클래스 : Activity, FragmentActivity, AppCompatActivity
생명주기에 맞춰 자동으로 호출되는 메소드가 존재한다
onCreate 메소드는 필수로 오버라이드해야한다
액티비티 상태보존
상태? 가지고있는 모든 데이터
동적상태 : 화면에 보이는 UI
영속적 상태 :
알림메시지
Toast.makeText(Activity, Text).show()
뷰 클래스
모든 UI는 View 클래스의 서브클래스
기존 SDK에서 제공하지 않는 위젯이 필요한경우
View 클래스나 이미 만들어진 뷰를 상속해 위젯을 새로만듬(커스텀 뷰)
뷰는 여러개의 다른 뷰를 결합해 구성할수도 있음(composite view복합뷰)
복합뷰는 ViewGroup 클래스를 상속(ViewGroup은 View의 상속(서브클래스))
복합뷰는 부모 뷰와 그 자식뷰로 나뉜다
부모 뷰는 컨테이너 뷰라고도 함
ViewGroup기반 컨테이너 뷰로 레이아웃 매니저가 있다
레이아웃은 컨테이너 뷰이다
설계목적 : 자식 뷰들을 화면에 위치시키는 방법을 제어
각 액티비티는 레이아웃을 지정해야한다
RelativeLayout
LinearLayout
TableLayout
GridLayout
FrameLayout
ConstraintLayout
AbsoluteLayout
뷰를 생성하는 방법
1. xml파일로 생성
2. java 파일에서 직접 생성
예시
public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); EditText edit = new EditText(this); edit.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); Button button = new Button(this); button.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); button.setText("버튼"); layout.addView(edit); layout.addView(button); setContentView(layout); } }
프레그먼트
설계목적 : 하나의 액티비티가 여러 화면(UI)를 가질수있도록
하나의 화면에 여러 화면요소를 넣으려면?
레이아웃중첩, 액티비티중첩, 프레그먼트 이용
프레그먼트가 가장 효율적
액티비티와 마찬가지로
xml파일과 java파일을 가짐(레이아웃이 필요없는경우 java파일만 존재할수있음)
생명주기있음
독립적인 모듈
다른액티비티에서 재사용가나ㅡㅇ
액티비티 내에서 실행중에 추가, 제거 가능
프레그먼트 생명주기
onAttack
onCreate
onCreateView
onActivityCreated
onStart
onResume
프레그먼트는 반드시 하나의 액티비티와 연결되어야함
프레그먼트와 액티비티 연결방법 2가지
1. Activity에서 Fragment View 를 사용해 지정
2. Fragment Manager 를 통한 연결
보통 2번째 사용
프레그먼트 매니저
액티비티, 프레그먼트간의 상호작용을 위한 중간자역할
프레그먼트 트랜잭션
액티비티가 프레그먼트를 추가/삭제/교체 하는 작업을 수행할 수 있도록함
트랜잭션 상태를 백스택에 저장할수있음
액티비티와 통신
액티비티에서 특정 이벤트가 발생할때 프레그먼트에서 어떤 동작을 구현할수있음
FragmentManager 클래스 사용
Bundle
Bundle 객체
안드로이드 프레임워크간 데이터 통신시 주고받는 자료구조
key-value 쌍의 해쉬맵
Bundle bundle = getIntent().getExtra(); int value1 = bundle.getInt(key); int value2 = bundle.getString(key2);
로그 남기기
android.util.Log 클래스 이용
메소드 목적 Log.e("태그", "메시지") Error. 가장 심각한 문제가 발생했을 때 Log.w("태그", "메시지") Warning. 심각하지는 않지만 나중에라도 문제의 소지가 있을 수 있어 남기는 로그 Log.i("태그", "메시지") Information. 어떤 처리를 하면서 발생하는 진행 과정 등을 모니터링하기 위한 목적 Log.d("태그", "메시지") Debugging. 디버깅 목적 Log.v("태그", "메시지") Verbose. 동작 여부를 최대한 자세히 살펴볼 목적
스타일 및 테마
차이
스타일 : 레이아웃파일에서 특정 뷰에 적용
테마 : AndroidManifest.xml에서 특정 액티비티에 적용
스타일 적용하기
- 스타일 파일
위치 : /res/values/원하는이름.xml
글자크기와 색깔을 지정한 예시
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="myStyle"> <item name="android:textColor">#ff0000</item> <item name="android:textSize">20sp</item> </style> </resources><style> 태그에 name 속성을 지정하고
그 하위에 <item> 태그를 추가하여 지정- 레이아웃 파일
원하는 뷰에 style 속성 적용 (예시는 텍스트뷰)
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/글자가 빨간색으로 보인다" style="@style/myStyle" />원하는 스타일의 <style> 태그 name값을 넣는다.
*스타일 상속
스타일은 상속이 가능하다
<style> 태그에 parent 속성으로 부모 지정
원하는 스타일의 <style> 태그 name값을 넣는다.
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="myTheme"> <item name="android:textColor">#ff0000</item> </style> <style name="myTheme2" parent="myTheme"> <item name="android:textSize">20sp</item> </style> </resources>테마 적용하기
- 테마 파일 작성
위치 : /res/values/원하는이름.xml
작성방식은 스타일과 같다
- 테마 적용
1. AndroidManifest.xml
특정 액티비티에 android:theme 속성으로 지정
*이 방식으로 설정시 속성값을 바꾸지 않는이상 테마가 바뀌지 않음
<activity android:name=".Main" android:label="@string/app_name" android:theme="@style/테마name" > ...원하는 <style> 태그 name 값을 지정
2. 자바코드에서 setTheme()
setTheme(R.style.테마이름)원하는 <style> 태그 name 값을 지정
*setContentView() 호출전에 해야함
안드로이드는 기본적으로 머티리얼 디자인 테마가 앱에 적용된다.
여러단에서 스타일을 적용할 경우 계층구조에 따라 우선적용한다. (참고 : https://developer.android.com/guide/topics/ui/look-and-feel/themes?hl=ko#hierarchy)
*기본으로 제공되는 주요테마
테마이름
Theme.Translucent : 투명 배경을 가짐
Theme.Translucent.NoTitleBar : 투명배경 + 제목 제거
Theme.Translucent.NoTitleBar_Fullscreen
그외
Theme_DeviceDefault
Theme_DeviceDefault_NoActionBar
Theme_DeviceDefault_NoActionBar_Fullscreen
Theme_DeviceDefault_Dialog
Theme_DeviceDefault_DialogWhenLarge
Theme_DeviceDefault_DialogWhenLarge_NoActionBar
Theme_DeviceDefault_Dialog_MinWidth
Theme_DeviceDefault_Dialog_NoActionBar
Theme_DeviceDefault_Dialog_NoActionBar_MinWidth
Theme_DeviceDefault_InputMethod
Theme_DeviceDefault_PanelTheme_DeviceDefault_Light
Theme_DeviceDefault_Light_DarkActionBar
Theme_DeviceDefault_Light_Dialog
Theme_DeviceDefault_Light_DialogWhenLarge
Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar
Theme_DeviceDefault_Light_Dialog_MinWidth
Theme_DeviceDefault_Light_Dialog_NoActionBar
Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth
Theme_DeviceDefault_Light_NoActionBar
Theme_DeviceDefault_Light_NoActionBar_Fullscreen
Theme_DeviceDefault_Light_PanelTheme_DeviceDefault_Wallpaper
Theme_DeviceDefault_Wallpaper_NoTitleBar'Android' 카테고리의 다른 글
Intent 인텐트, 인텐트 필터 정리 (0) 2019.07.03 액티비티 Activity (0) 2019.07.01 앱 호환성 build.gradle (0) 2019.07.01 뷰 속성 (0) 2019.06.24 안드로이드 기초 (0) 2019.06.18