📗Log
- 코딩을 할 때 코드의 흐름 및 프로그램 오류를 파악하기 위해 앱 외부로 출력하는 정보
- 디버거를 사용할 수도 있지만 매번 디버깅할 포인트를 지정해야 하는 불편함이 있음.
- 로그를 사용하면 한 번 설정으로 항상 해당 코드의 흐름을 쉽게 확인
📗Logcat (로그 캣)
- 출력되는 로그를 보는 도구
- 태그를 필터로 사용해서 특정 로그만 확인 가능
함수 | 의미 | 내용 |
Log.v() | verbose | 상세한 로그 내용을 출력하기 위해 사용 |
Log.d() | debug | 개발에 필요한 내용을 출려갛기 위해 사용(개발자용) |
Log.i() | information | 일반적인 메세지를 전달하기 위해 사용 |
Log.w() | warning | 에러는 아니지만 경고성 메시지를 전달하기 위해 사용 |
Log.e() | error | 실제 에러 메시지를 출력하기 위해 사용 |
위 그림처럼 var1에 제대로 된 값이 들어갔는지 로그 캣을 이용해서 검사할 수 있다.
안드로이드 스튜디오에 디버깅 기능에 손이 잘 안 갔었는데 Logcat을 이용해서 내가 검사하고자 하는 값을 볼 수 있는 기능은 편리한 것 같다.
📕사용자 이벤트 처리
📗Android에서 이벤트 처리 방법
💡방법#1. XML 파일에 이벤트 처리 메서드를 등록
- 가장 쉬운 방법
- android:onClick="함수명"
- kotlin 소스에 함수명() 함수 구현
💡방법#2 이벤트 처리를 위한 인터페이스 구현
- 클래스에서 인터페이스를 상속받아서 구현하는 방법
class MainActivity : AppCompatActivity(), View.OnClickListener{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
override fun onClick(v: View){
//onClick 코드 추가~~
}
}
}
💡방법#3. 이벤트 처리를 위한 리스너 객체 생성
- 내부 클래스 사용 : 동일한 여러 위젯을 한 번에 처리
- 위젯 별 익명 리스너 클래스 사용: 위젯의 수가 적고 단순한 기능
- Lambda 사용
📕이벤트 리스너(Listener) 종류 및 콜백 메서드
📗리스너 연결
- setOnxxxListener()
- 콜백 메서드는 반드시 구현해야 됨.
리스너 | 콜백 메소드 | 설명 |
View.OnClickListener | onClick() | 사용자가 어떤 항목을 터지하거나 내비게시연 키나 트랙볼로 항목으로 이동한 후에 엔터키를 눌러서 선택하면 호출 |
View.OnLongClickListener | onLongClick() | 사용자가 항목을 터치한 상태로 일정 시간 동안 그대로 누르고 있으면 발생 |
View.OnFocusChangeListenr | onFocusChange() | 사용자가 하나의 항목에서 다른 항목으로 이동할 때 호출 |
View.OnKeyListener | onKey() | 포커스를 가지고 있는 항목 위에서 키를 눌렀다가 놓았을 때 호출 |
View.OnTouchListenr | onTouch() | 사용자가 터치 이벤트로 간주되는 동작을 한 경우에 호출 |
이러한 콜백 메서드를 통해서 우리는 버튼을 눌렀을 때 동작하는 기능을 만들 수 있습니다.
📗1.XML 파일에 이벤트 처리 메서드를 등록
이런 레이아웃에서 버튼을 누르게 된다면 버튼의 이름이 Button으로 바뀌게 만들어 보겠습니다.
역으로 버튼을 다시 누르게 된다면 버튼의 text가 다시 버튼으로 바뀝니다.
이러한 동작은 onclick 이벤트를 이용해서 처리했습니다.
버튼에다가 onclick 이벤트를 처리해주고 해당 버튼이 눌린다면 btnClicked 함수를 실행하게 만들었습니다.
버튼의 text가 BUTTON이면 -> 버튼으로, 버튼이면 -> BUTTON으로 바꿔주는 함수.
Toast는 휴대폰 화면 아래에 짧은 메시지 창을 띄우는 기능인데 현재 단계에서는 그렇게 중요한 기능은 아니라서 괜찮습니다.
📗2. 인터페이스 구현
💡OnClickListener 인터페이스 구현
- 클래스에서 인터페이스를 상속받아 구현
class MainActivity : AppCompatActivity(), View.OnClickListener {
💡onClickListener의 onClick() 추가
💡각 버튼에 setOnClickListner(this) 연결
- 현재 클래스에 OnClickListener를 구현하기 때문에 this를 사용함.
btn1= findViewById(R.id.btn1)
btn1.setOnClickListener(this)
💡onClickListener의 콜백 메서드(onClick())를 구현
각 버튼 btn1,2,3 에다가 setOnClickListener()를 연결하고 Onclick() 메서드에서 세 개의 버튼 이벤트를 처리한다.
📗3. 이벤트 리스너 객체 사용
💡이벤트 리스너
- 이벤트를 처리하는 메서드들이 정의된 인터페이스
💡이벤트 리스너 객체 사용 과정
- 이벤트 리스너를 구현하는 클래스를 정의
- 리스너 객체를 생성
- 위젯에 리스너 객체를 등록
💡리스너 객체를 생성하는 방법
- 리스너 클래스를 내부 클래스로 정의한다. (리스너 객체 전달)
- 리스너 클래스를 무명(익명) 클래스로 정의한다.
- 람다식을 이용한 구현
📕#이벤트 리스너 방법 1 (내부 클래스 생성 및 객체 전달)
- 내부 클래스 사용
- 리스너 내부 클래스 생성
- 외부 클래스의 변수에 접근할 수 있는 장점이 있음
- 외부에 선언된 TextView 변수 tv1에 직접 접근할 수 있음
- 리스너 내부 클래스 생성
- Object 키워드
- 클래스를 정의하면서 객체를 생성
- 익명 클래스를 생성할 때 사용
- 각 버튼에 OnClickListener를 연결(전달)
- setOnClickListener(listener) 호출
listener = object : View.OnClickListener{
override fun onClick(v:View?){
//onClick 메소드 오버라이딩
}
}
btnAdd.setOnClickListener(listener) // 리스너 등록
📕#이벤트 리스너 방법 2 (익명 클래스를 사용한 리스너 객체 연결)
- 익명 클래스 사용
- 클래스 선언과 동시에 객체 생성
- 버튼 변수명. setOnClickListener()
- object : View.OnClickListener(){ } 내부에 onClick() 함수 추가
- 익명 클래스는 재활용이 안돼서 버튼 하나하나 연결해줘야 함.
- 즉 각 버튼마다 별도의 OnClickListener 작성해줘야 함.
btnAdd.setOnClickListener(View.OnClickListener.{
override fun onClick(v:View?){
// onClick 메소드 오버라이딩
}
})
📕#이벤트 리스너 방법 3 (lambda 사용: Kotlin에서 주로 사용)
- Lambda 사용
- 간단한 방식으로 Kotlin에서 많이 사용됨.
- 익명 리스너처럼 버튼마다 OnClickListener를 구현
btnAdd.setOnClickListener{
tv1.text = "lambda : button1 clicked"
}
📕터치 이벤트
📗터치 이벤트 종류
- ACTION_DOWN : 화면을 손가락으로 누른 순간 발생
- ACTION_UP : 화면에서 손가락을 떼는 순간 발생
- ACTION_MOVE : 화면을 손가락으로 누른 상태에서 이동하는 순간에 발생
📗터치 이벤트 처리
- onTouchEvent() 오버 라이딩 메서드 추가
- onTouchEvent(event:MotionEvent) : Boolean 선택
📕터치 이벤트 발생 좌표 얻기
- onTouchEvent() 메서드의 매개변수인 MotionEvent 객체로 획득
- x: 터치 이벤트가 발생한 뷰의 x 좌표
- y : 터치 이벤트가 발생한 뷰의 y 좌표
- rawX : 화면의 X좌표
- rawY : 화면의 Y좌표
- Activity에 onTouchEvent()를 재정의 한 경우
- x, rawx 값은 차이가 없음
- 특정 View에 onTouchEvent()를 재정의 한경우
- x, rawX의 값은 차이가 있음.
📕키 이벤트
📗키 이벤트
- 폰의 키를 누르는 순간 발생
- 콜백 메서드
- onKeyDown() : 키를 누른 순간 이벤트 발생
- onKeyUp() : 키를 떼는 순간 이벤트 발생
- onKeyLongPress() : 키를 오래 누르는 순간 이벤트 발생
📗onKeyDown(KeyCode : Int, event : KeyEvent?)
- KeyCode : 어떤 키가 눌렀는지 식별
- KeyEvent 클래스에 정의된 상수들 중 하나로 많은 key와 대응
- Home키 : KeyEvent.KEYCODE_HOME
📗뒤로 가기 버튼
- onBackPressed() 함수를 이용할 수 있음. -> 완전 종료, 이전 화면 등 많은 기능을 구현할 수 있음.
📕컴파운드 버튼
📗CompoundButton 클래스
- Button 클래스의 하위 클래스
- 체크박스, 라디오 버튼, 스위치, 토글 버튼의 상위 클래스
- 위의 네 클래스는 공통적으로 체크(check) 또는 언체크(uncheck) 상태를 가짐
- 실제로 비슷한 형태를 띠지만 용도는 조금씩 다름.
📗컴파운드 버튼 계층도
📕CheckBox(체크박스)
- 체크박스는 클릭할 때마다 상태가 체크, 언체크로 바뀜
- 여러 개의 체크박스가 있어도 서로 독립적으로 동작한다는 특징이 있어 여러 개를 동시에 체크할 수 있음. -> 라디오와 차별점.
- android:checked= "true/false"
- 이벤트 처리 : setOnCheckedChangeListener() 사용
- 독립된 박스
- 복수 선택 가능
📕라디오 버튼과 라디오 그룹
📗라디오 버튼
- XML 속성이나 메서드가 체크박스와 거의 동일하지만 용도가 다름
- 여러 개 중 하나만 선택해야 하는 경우에 사용
- 라디오 버튼만 여러 개 나열하면 클릭하는 것마다 모두 중복 선택되므로 라디오 그룹과 함께 사용해야 함.
- 각 라디오 버튼의 id 속성이 꼭 있어야 함.
- id 속성이 없으면 해당 라디오 버튼이 계속 선택된 것으로 지정되어 해제되지 않음.
📗라디오 그룹
- ViewGroup-LinearLayout의 하위 클래스로 존재함.
- TextView 하위의 위젯들과는 성격이 조금 다름.
- 라디오 그룹에서 가끔 사용되는 메소드인 clearCheck()
- 해당 라디오그룹 안에 체크된 것을 모두 해제함.
💡라디오 그룹 안에 묶고 싶은 라디오 버튼을 선언해야 함.
📕뷰 이벤트
📗뷰 이벤트
- 이벤트 소스와 이벤트 핸들러로 역할이 나뉨.
- 이 둘을 리스너로 연결해야 이벤트를 처리할 수 있음.
- 단순히 이벤트 콜벡 메서드로만 처리할 수 없음.
- onTouchEvent(), onKeyDown() : 단순 이벤트 콜벡 메서드
- 이 둘을 리스너로 연결해야 이벤트를 처리할 수 있음.
📗뷰 이벤트 처리 구조
- 이벤트 소스 : 이벤트가 발생한 객체
- 이벤트 핸들러 : 이벤트 발생 시 실행할 로직이 구현된 객체
- 리스너 : 이벤트 소스와 이벤트 핸들러를 연결해 주는 함수
이벤트 소스 -------------------------------------------------------------> 이벤트 핸들러
(Button) (리스너) (OnClickListener)
📕체크박스 이벤트 처리
📗익명 클래스로 리스너 구현 및 리스너 등록
- OnCheckedChangeListener
💡setOnCheckedChangeListenr을 통해 리스너를 등록하고 OnCheckedChangeListener로 호출함
📗액티비티에서 인터페이스 구현
📗리스너를 별도의 클래스로 작성
- 외부에 리스너 클래스 작성
- 외부에 필수적으로 작성할 필요는 없지만 코드가 복잡할 경우 외부에 작성하는 것이 코드가 깔끔해짐.
📗Lambda 식 구현
📕라디오 버튼 이벤트 처리
📗RadioButton 이벤트 처리
- OnClick 이벤트
- 각 RadioButton에 이벤트 처리 함수 연결
- OncheckedChanged 이벤트
- RadioGroup에 이벤트 리스너 추가
📗XML을 이용
- OnClick 이벤트 추가 : onRadioButtonClicked(view : View) 함수 구현
- 파라미터 view를 이용하여 클릭된 RadioButton을 구분함
- view> getId()
- 라디오 버튼 선택 여부 확인 : view.isChecked 사용
- 파라미터 view를 이용하여 클릭된 RadioButton을 구분함
📗RadioGroup - OnCheckedChangeListener 구현
- OnCheckedChange() 함수 구현
- RadioGroup : 라디오 버튼을 묶은 라디오 그룹
- checkedId: 선택된 라디오 버튼 ID
abstract fun onCheckedChanged(
group : RadioGroup!,
checkedId : Int
): Unit
📕Lambda 식 구현
- checkedID는 선택된 라디오 버튼 id
radioGroup.setOncheckedChangeListenr{group,checkedId ->
if(checkedId==R.id.radio_black){
textView.setBackgroundColor(Color.BLACK)
textView.setText("검은색 선택")
textView.setTextColor(Color.WHITE)
}
}
요약
- 이벤트 처리 방법에는 3가지가 있다.
- XML을 이용
- onClick 이벤트 처리 함수 연결
- main.kt에 함수 구현
- 인터페이스 구현
- 클래스에서 인터페이스를 상속받아 구현
- View.OnClickListener
- onClick()를 추가
- this를 사용해서 리스너를 등록함.
- 버튼명. setOnClickListener(this)
- 콜백 메서드(onClick)를 구현해야 함.
- 이벤트 리스너 객체 사용
- 이벤트 리스너란?
- 이벤트를 처리하는 메서드들이 정의된 인터페이스
- 이벤트 리스너 객체 사용 과정
- 이벤트 리스너를 구현하는 클래스를 정의
- 리스너 객체를 생성
- 위젯에 리스너 객체를 등록
- 리스너 객체를 생성하는 법
- 리스너 클래스를 내부 클래스로 정의. [리스너 객체를 전달해야 함]
- 리스너 클래스를 익명 클래스로 정의한다.
- 람다식을 이용한 구현
- 각 방법마다 장단점이 있으니 때에 맞게 사용하도록! (위젯의 수 , 버튼 수, 코드 복잡성 등등..!
- 이벤트 리스너란?
- XML을 이용
'Skils > Android' 카테고리의 다른 글
[Android] - 프래그먼트(Fragment) (0) | 2022.11.20 |
---|---|
[Android] - androidx 라이브러리 (액션바,메뉴 구현) (0) | 2022.11.20 |
[Android] - Layout이란 (0) | 2022.10.07 |
[Android] 애플리케이션 기본항목 - 4대 구성요소(Component) (1) | 2022.09.23 |
[Android] - 계산기 만들기(클론 코딩) - 계산 기록O (0) | 2022.09.18 |