ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 프로그래밍
    Android 2019. 6. 18. 23:19

     

    안드로이드 기초

    https://imar.tistory.com/94

     


     

    개발환경

    안드로이드 앱개발은 보통

    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:context 속성으로 관련된 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_Panel

    Theme_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_Panel

    Theme_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
Designed by Tistory.