안드로이드&IOS 앱 개발자 양성

안드로이드&IOS 앱 개발자 양성(71일차)

HRuler 2020. 7. 16. 18:18
더보기

** Toast
1. 생성
2. 출력
3. 기타 메소드
4. 실습

** Snackbar
1. 안드로이드에서 추가된 라이브러리 사용
2. SnackBar
3. 버튼을 클릭했을 때 Snackbar 출력하기

** 대화상자 - Dialog
1. 생성 및 출력
2. 일반 다이얼로그 출력
3. AlertDialog
4. 화면 출력 처리 방식

** GUI 프로그래밍에서의 화면 출력

** 목록선택 대화상자

** ProgressDialog

** Date 또는 TimePickerDialog

** Custom Dialog
1. 실행 가능한 Activity를 추가(LoginActivity)
2. activity_login.xml 파일 수정
3. res/layout 디렉토리에 로그인 화면으로 사용할 layout login.xml을 생성하고 작성
4. LoginActivity.java 파일에 인스턴스 변수를 선언
5. LoginActivity.java 파일의 onCreate 메소드 작성

** EventHandling
1. Event 처리 방식

** Hierarchy Event Model

** Toast

- 짧은 문자열을 출력하는 작은 대화상자

- 안드로이드 시스템이 제공 : 앱이 종료되어도 출력이 가능

- 플로팅(화면에 떠 있는 상태) 형태로 화면 하단에 나타났다가 일정 시간이 지나면 자동으로 사라진다.

- 알림 사항을 전달만 하고 포커스를 받을 수가 없다.

1. 생성

  Toast.makeText(Context context, int resid, int duration)

  Toast.makeText(Context context, CharSequence text, int duration)

- context는 Toast는 화면에 출력되는 요소이기 때문에 화면 출력 정보를 소유한 Context를 매개변수로 받아야 한다.

  Context는 화면에 무엇인가를 출력할 때 사용하기 위한 선색상, 면색상, 글자 색상, 배경 색상 등의 정보를 소유한 객체이다.

  안드로이드에서는 직접 Context를 생성하는 경우는 거의 없고 Context를 상속받은 Activity를 이용해서 화면 출력을 한다.

  Activity에 대한 참조를 얻는 방법은 Activity 클래스 안에서는 this나 Activity.this를 이용한다.

  이벤트 처리를 할 때는 anonymous class를 자주 사용하는데 anonymous class에서는 this를 사용하게 되면 anonymous class 자신이 되버리기 때문에 이 때는 Activity.this를 이용해야 Activity 클래스의 객체에 대한 참조를 할 수 있다.

  Public class SampleActivity{

     public void onCreate(){

        //this나 SampleActivity.this나 모두 현재 인스턴스에 대한 참조     

        btn.setOnClickListener(new View.OnClickListener(){

              //this는 View.OnClickListener의 인스턴스에 대한 참조

              //SampleActivity.this가 SampleActivity의 인스턴스에 대한 참조

        });

     }

  }

- 안드로이드에서는 getApplicationContext()라는 메소드를 호출하면 시작하는 Activity에 대한 포인터를 리턴받을 수 있다.

- 두 번째 매개변수는 출력할 메시지로 strings.xml 파일에 리소스로 등록하고 그 리소스 id를 설정해도 되고 직접 무자열로 설정해도 된다.

  안드로이드에서는 String도 많이 사용하지만 String의 상위 인터페이스인 CharSequence나 Editable도 자주 사용한다.

  문자열을 리턴할 때 리턴하는 문자열의 자료형을 정확하게 확인해서 CharSequence나 Editable이면 toString()을 호출해서 문자열로 변환해서 사용한다.

- 세 번째 매개변수는 토스트를 출력할 시간인데 1/1000초 단위로 설정할 수 있는데 대부분은 Toast.SHORT나 Toast.LONG과 같은 상수를 이용한다.

2. 출력

  show()를 호출

3. 기타 메소드

- setGravity

- setMargin

- setText

- setDuration

- cancel

- setView(VIew view) : View를 설정 - 모양 변경 

4. 실습

- 버튼을 누르면 토스트가 출력되도록 하기

1) 프로젝트를 생성하거나 실행 가능한 Activity를 추가

2) 토스트를 출력할 Button 생성

3) Activity.java 파일의 onCreate 메소드 수정

** Snackbar

- 하단에 고정된 위치에 메시지를 출력해주는 UI

- 초창기에 안드로이드 버전에 없었고 나중에 추가가 되었다.

  라이브러리를 추가해서 사용해야 한다.

1. 안드로이드에서 추가된 라이브러리 사용

- 안드로이드는 버전이 업데이트될 때 새로운 UI를 추가하는 경우가 많아서 이런 UI를 사용할 때 이용한다.

1) File - Project Structue 메뉴를 실행

2) 왼쪽 창에서 Modules 하단의 app을 선택

3) 오른쪽 탭에서 dependencies를 선택하고 +버튼을 눌러서 필요한 라이브러리를 추가한다.

 Snackbar는 suppot.design 라이브러리를 추가해서 사용한다.

2. SnackBar

- Snackbar는 Action을 통해서 onClick을 설정할 수 있다.

  사용자와의 인터페이스로 이용 가능하다.

- Toast는 Context를 매개변수로 받지만 Snackbar는 View를 매개변수로 받는다.

1) 생성

  Snackbar.make(View view, CharSequence text, int duration)

  Snackbar.make(View view, int residents, int duration)

2) 출력

  show()

3) 클릭했을 때 동작 지정

  setAction(String msg, new View.OnClickListener(){

      클릭했을 때 수행할 내용;

  });

3. 버튼을 클릭했을 때 Snackbar 출력하기

1) suppot.design 라이브러리를 추가

- [File] - [Project Structure]를 실행

2) dependencies나 module을 선택하고 dependency 위의 + 버튼을 눌러서 design을 검색한 후 support.design을 추가

3) Activity.java 클래스의 onCreate 메소드에서 버튼의 클릭 처리 메소드의 내용을 수정 - 음악재생을 할 경우 res 디렉토리에 raw 디렉토리를 만들고 그 안에 space.mp3 파일을 저장하고 해야 한다.

** 대화상자 - Dialog

- 사용자에게 전달 상항을 알리고 사용자의 선택을 받아들이는 통신 수단 중의 하나

- Activity를 화면에 그대로 유지한 채 중앙에 열리기 때문에 메시지를 보여주거나 추가 입력 또는 선택용으로 사용하기에 적합하다.

1. 생성 및 출력

1) Dialog 생성

- 생성자에 Context를 대입받아서 생성

2) 모양 설정

  setContentView(View view)로 출력되는 모양 설정

  serTitle(문자열)을 이용해서 제목을 설정

3) 출력

  show()

2. 일반 다이얼로그 출력

1) 사용 가능한 Activity 추가

2) 레이아웃 수정

3) Activity.java 파일의 onCreate 메소드 수정

3. AlertDialog

- Dialog 클래스는 화면 모든 영역을 직접 디자인해야 하지만 AlertDialog는 무자열 메시지 그리고 타이틀 바와 아이콘 영역 등을 미리 만들어두고 사용자가 선택해서 설정만 하면 생성할 수 있도록 만든 Dialog의 고수준 매핑 클래스이다.

- 생성자는 protected으로 되어 있어서 직접 호출하지 못하고 Builder를 통해서 생성한다.

- 설정과 관련된 메소드들은 다시 AlertDialog를 리턴하기 때문에 메소드를 연속해서 호출하는 형태로 디자인한다.

  AlertDialog.Builder setMessage(CharSequence message)

  AlertDialog.Builderset Title(CharSequence title)

  AlertDialog.Builder setIcon(int iconld)

  이와 유사한 형태의 클래스로는 String이 있다.

- 출력은 show 메소드를 이용한다.

- 어떤 클래스를 디자인할 때 생성하는 부분이 복잡하면 생성자를 private이나 protected으로 숨기고 별도의 메소드를 이용해서 생성하도록 만들어 주어야 한다.

  이러한 디자인 패턴을 팩토리 메소드 패턴이라고 한다.

- 하나의 클래스에 설정해야할 내용이 많은 경우 하나의 메소드에서 전부 설정하면 메소드의 모양이 너무 복잡해지거나, 오버로딩을 많이 하게 되거나, 별도의 클래스를 만들어야 하는 일이 발생하기 때문에 이런 경우 Map을 이용해서 설정하는 경우가 있는데 바람직 하지 못하다.

  Map은 리턴 타입으로 사용하는 것이 좋다.(Map을 매개변수로 사용하는 것은 좋지 못하다.)

1) 레이아웃에 버튼을 추가

2) Activity.java 클래스의 onCreate 메소드에 버튼의 클릭 이벤트를 작성해서 AlertDialog를 출력

- 연속적으로 메소드를 호출하는 것을 Method Chaining이라고 하는데 메소드 체이닝을 할 수 있도록 만드는 경우는 어떤 작업을 할 때 설정해야 할 내용이 많고 그 내용들이 필수가 아니고 선택적으로 설정해야 하는 경우 한번에 설정하도록 하면 순서를 기억해야 하거나 종류들을 전부 기억해야 하기 때문에 체이닝 형태로 설정할 수 있도록 만들어 준다.

- 대화상자에 버튼 배치

  대화상자에는 사용자가 어떤 선택을 했는지 알 수 있도록 버튼을 추가할 수 있다.

  AlertDialog에는 버튼을 추가할 수 있는 메소드가 3가지가 있는데 이름만 다르고 사용방법은 모두 동일하다.

  단지 코딩의 의미를 전달하기 위해 메소드 이름을 다르게 만들어 둔 것이다.

  setPositiveButton(CharSequence text, DialogInterface.OnClickListener);

  setNeutralButton(CharSequence text, DialogInterface.OnClickListener);

  setNativeButton(CharSequence text, DialogInterface.OnClickListener);

  여기서 만들어지는 버튼들은 기본적으로 대화상자를 단는 기능을 가지고 있기 때문에 따로 닫는 버튼을 생성하지 않아도 된다.

- 안드로이드는 Back Button을 가지고 있어서 Back Button을 누르면 대화상자가 닫히게 된다.

  그래서 setCancelable(boolean cancelable)를 호출해서 false를 대입하면 Back Button을 눌러도 대화상자가 닫히지 않게 된다.

4. 화면 출력 처리 방식

1) 1초에 1씩 증가하면서 TextView에 숫자를 출력하기

- 실행 가능한 Activity 생성

- 레이아웃에 텍스트 뷰 1개와 버튼 1개를 배치

2)Activity.java 클래스에 작업을 위한 코드를 작성

 

** GUI 프로그래밍에서의 화면 출력

- 하나의 메소드 안에 화면 출력하는 코드와 그렇지 않은 코드가 같이 존재하면 화면 출력을 하는 코드는 오랜 시간이 걸리기 때문에 나중에 처리한다.

  화면 출력 이후에 작업을 수행하고자 하면 화면 출력이 끝나면 수행해달라고 콜백 메소드에 작성을 해주어야 한다.

- Callback Method : 이벤트가 발생하면 호출되는 메소드

- 스레드를 이용하지 않고 주기적으로 화면 갱신을 수행하면 모아서 한꺼번에 처리한다.

  화면 갱신은 오랜 시간이 걸리는 작업이라 모아서 한꺼번에 처리한다.

  GUI 프로그래밍을 할 때는 스레드를 만드는 것을 할 수 있어야 하고 main 스레드와 다른 스레드를 구분할 수 있어야 한다.

  main 스레드에서만 화면 갱신을 할 수 있기 때문이며 이러한 이유로 main 스레드에게 수행할 내용을 전달하는 방식을 반드시 알아야 한다.

 

** 목록선택 대화상자

- AlertDialog는 버튼을 배치하는 메소드를 3개 가지고 있다.

  Positive, Neutral, Negative 이다.

  하나의 메소드를 2번 이상 호출하면 마지막에 호출한 것 하나만 유효하다.

  이런 이유로 버튼은 3개 까지만 배치가 가능하다.

- 4개 이상의 목록에서 선택하는 대화상자를 만들고자 할 때는 목록선택 대화상자를 만들어야 한다.

  이 대는 setItems(CharSequence [] items 또는 int itemsld,

  DialogInterface.OnClickListener listener)를 호출해야 한다.

- 문자열 배열을 리소스로 만들 때는 values 디렉토리에 arrays.xml 파일에 만들면 된다.

- listene의 onClick 메소드의 2번째 매개변수가 선택한 아이템의 인덱스이다.

- setItems 대신에 setSingleChoiceItems를 호출하면 목록 옆에 라디오 버튼이 생성되서 하나만 선택할 수 있도록 해준다.

  이 메소드는 문자열 배열, 리소스 아이디, ListAdapter, Cursor를 매개변수로 받을 수 있다.

- setMultiChoiceItems 메소드를 호출하면 다중 선택이 가능한 목록 대화상자를 만들 수 있다. 이 메소드는 boolean 배열을 매개변수로 받아서 선택한 목록들의 인덱스에 해당하는 데이터만 true로 설정한다.

 

** ProgressDialog

- 진행 상황을 표시해주는 다이얼로그

- setProgressStyle이라는 메소드를 이용해서 막대모양이나 원 모양의 진행률을 표시할 수 있다.

 

** Date 또는 TimePickerDialog

- DatePickerDialog : 날짜를 선택할 수 있는 대화상자

- TimePickerDialog : 시간을 선택할 수 있는 대화상자

- 스마트 폰은 초단위 설정이 안된다.

 

** Custom Dialog

- 사용자가 디자인한 뷰를 출력하는 다이얼로그

- 뷰는 자바코드로 직접 생성해서 설정해도 되지만 layout.xml 파일을 만들어서 작성한 후 전개해서 사용해도 된다.

  전개는 layout.xml 파일로 만든 것을 View 클래스의 객체로 변환하는 작업이다.

- 로그인 다이얼로그를 만들어서 출력하고 입력한 내용을 확인하는 예제

1. 실행 가능한 Activity를 추가(LoginActivity)

2. activity_login.xml 파일 수정

- TextView 1개와 대화상자를 출력할 버튼 1개를 추가

- 실제 작업이라면 로그인을 할 수 있도록 할 Activity에 버튼이나 ImageView 1개를 배치하면 된다.

3. res/layout 디렉토리에 로그인 화면으로 사용할 layout login.xml을 생성하고 작성

4. LoginActivity.java 파일에 인스턴스 변수를 선언

- 버튼과 텍스트 뷰 변수

5. LoginActivity.java 파일의 onCreate 메소드 작성

 

** EventHandling

- Event: 시스템 또는 사용자가 발생시키는 사건

  시스템이 발생시키는 사건은 Notification이라고 별도로 부르기도 한다.

  시스템이 발생시키는 사건은 사용자에게 주는 알림의 성격이 강하기 때문에 별도로 부르기도 한다.

- EventHandler : Event가 발생하면 호출되는 객체 또는 함수

1. Event 처리 방식

1) Hierachy Event Model : 클래스에 만들어져 있는 메소드를 재정의하는 구조

- 상속받은 클래스에서만 사용이 가능하다.

- 이 형태의 이벤트 처리 메소드는 이벤트가 발생한 객체를 매개변수로 갖지 않는다. 이 메소드가 구현된 클래스의 객체가 이벤트가 발생한 곳이므로 this이면 이벤트가 발생한 객체이다.

- 이벤트에 대한 정보를 가지고 있는 객체만 매개변수로 만들어진다.

2) Delegation Model : 이벤트를 처리할 객체나 함수를 지정하는 구조

- 상속과 상관없이 자신이 처리할 수도 있고, 다른 객체에게 위임할 수도 있다.

- 이렇게 이벤트 처리를 위임받은 객체를 Listener라고 부른다.

- 이 경우의 메소드들은 첫 번째 매개변수를 이용하면 이벤트가 발생한 객체를 알 수 있다.

3) VC# 이나 MFC, Java의 Swing, Java F/X 그리고 iOS, Mac OS X 등의 모든 GUI 프로그래밍에서는 모두 동일

  첫 번째 매개변수가 이벤트가 발생한 객체인지 아니면 이벤트가 발생한 객체에 대한 정보를 가진 객체인지의 차이이다.

 

** Hierarchy Event Model

- 상위 클래스가 가진 이벤트 처리 메소드를 재정의하는 방식이다.

- View와 Activity 클래스에는 기본적인 이벤트 처리를 위한 메소드가 내장되어 있다.

  boolean onTouchEvent(MotionEvent event) : 터치했을 때 호출되는 메소드

  boolean keyDown(int keyCode, KeyEvent event) : 키보드를 눌렀을 때

  boolean keyUp(int keyCode, KeyEvent event) : 키보드를 땠을 때

  boolean keyLongPress(int keyCode, KeyEvent event) : 키보드를 길게 눌렀을 때

  void onBackPressed() : back 버튼을 눌렀을 때

  boolean onTrackballEvent(MotionEvent event) : 트랙볼 이벤트

- boolean을 리턴하는 메소드들은 이벤트가 발생하면 시스템이 무엇인가를 수행하는 이벤트이다.

  리턴하는 값이 true이면 시스템이 가진 처리를 하는 것이고 false를 리턴하면 하지 않는 것이다.