작성한 부스트코스 후기입니다.
여러분들의 성원에 더 노력하는 부스트코스가 되겠습니다.
감사합니다.
******************************************
1)링크: https://blog.naver.com/iraira7777/221818898049
강의는 이제 이벤트를 주로 다루고 있으며, XML이 아닌 자바 소스코드를 건들이기 시작했다. 강의도 코딩을 주로 하는 만큼, 포스팅도 소스코드가 많아질 예정이니 참고하시길.
- Content -
Toast/Snack Bar/Dialogue
*해당 포스팅은 아래 강좌를 기반으로 작성되었습니다*
https://www.edwith.org/boostcourse-android/joinLectures/13159
1. 토스트, Toast
난 언제나 동기들에게 말한다. 내가 만약에 부자가 된다면 작고 예쁜 토스터기를 살 것이라고. 가뜩이나 바쁜 아침인데, 빵을 꽃아 넣으면 다 구워진 채로 튀어나오게 만들어주는 토스터기. 얼마나 간편한가!
안드로이드의 '토스트(Toast)'는 토스터기에서 빵이 튀어나오는 이미지에서 착안한 이름이다. 메세지가 갑자기 튀어나와 사용자에게 메세지를 보여준 후 사라지는 모습, 마치 토스트와 비슷하지 않은가? 이러한 안드로이드의 '토스트 메세지'는 사용자에게 간단하거나 매우 작은 분량의 메세지를 간편하게 보여줄 때 사용되고는 한다.
토스트 메세지의 예시. 해당 메세지는 사용자에게 보였다가 사라진다. (출처: https://blog.mysms.com/quick-tip-de-activate-toast-message-your-text-has-been-sent.html )
토스트 메세지는 다음과 같은 소스코드로 이루어진다.
Context는 해당 토스트 메세지가 출력되는 앱의 구성, 즉 해당 토스트가 출력 될 어플리케이션을 입력하는 파라미터이다. "Text"는 토스트 메세지에는 어떤 텍스트가 출력될 것인지에 대한, Duration은 토스트 메세지가 지속되는 시간에 대한 파라미터이다. Toast 메세지에는 짧은 지속시간을 뜻하는 Toast.LENGTH_SHORT, 긴 지속시간을 뜻하는 Toast.LENGTH_LONG이 있다. 아래의 소스코드를 보면 이해가 더 잘 될 것이다. 아래의 소스코드는 위의 사진과 같은 토스트를 만드는데에 사용되는 코드이다.
getApplicationContext()는 현재 앱이 실행되는 Application을 가져오는 것인데, 이 메소드와 this의 차이는 나중에 액티비티(Activity)에 대해서 공부할 떄 다시 알아보도록 하자.
토스트 메세지는 setGravity() 메소드를 활용하여 토스트 메세지가 보이는 위치를 바꿀 수 있다. 아래의 소스코드를 보자.
Gravity는 TOP, LEFT, RIGHT, CENTER 외에도 여러 위치가 들어갈 수 있고, '|' 기호를 사용하여 두 위치를 합친 위치에 토스트 메세지를 띄울 수 있다. (ex: Gravity.TOP | Gravity.LEFT = 왼쪽 위에 토스트 메세지 형성)
xoffset, yoffset으로 좀 더 세밀한 위치 선정이 가능한데, 각각 입력된 값만큼 x축으로, y축으로 메세지를 움직이는 것이다.
이를 응용하면 다음과 같은 소스코드를 만들 수 있다.
해당 코드는 다음과 같이 해석이 가능하다.
- 토스트 메세지를 다음과 같이 형성을 하되, 바로 생성하지 않고 Toast 객체인 toast로 참조를 한다.
- setGravity 메소드로 토스트 메세지가 나타나는 기준점과, x,y축으로 움직일 값을 각각 입력한다.
- 토스트 메세지를 생성한다.
2. 스낵바, Snack Bar
또 먹는 이름이다. 안드로이드를 개발하다보면 먹는 이름이 매우 많이 나온다. 애초에 운영체제 버전 이름을 음식으로 짓는 사람들에게 무엇을 바라겠는가.
스낵바(Snack Bar)는 활용도가 더 높은 토스트다. 토스트는 잠깐 나타났다가 사라지는 대신, 스낵바는 아래에서 불쑥 올라왔다가 사라지는 메세지이다. 말로는 이해가 안될테니, 예시 사진을 보도록 하자.
스낵바의 예시. 사진을 보면 어떤 식의 메세지인지 이해가 될 것이다. (출처: https://www.androidhive.info/2015/09/android-material-design-snackbar-example/ )
스낵바는 토스트와 달리 외부 라이브러리에 지정이 되어있어서 따로 Gradle 파일에 들어가 build 파일에 해당 라이브러리를 넣어줘야 한다. 해당 라이브러리는 아래의 정보를 build.gradle에 입력하면 저장이 된다. 강의에 나오는 경로는 이전 버전에만 해당되는 이야기니, 최신 버전을 쓰는 여러분들은 참고 바란다.
스낵바는 다음과 같은 소스코드로 이루어져있다.
스낵바는 위와 같이 토스트와 매우 흡사한 형태를 지니고 있다. maketext가 make로, context가 view로 바뀐 점, 그리고 Duration에 스낵바가 사라지지 않게하는 Snackbar.LENGTH_INDEFINITE이 있다는 점 외에는 다른 것이 없다. 하지만 스낵바는 토스트와 달리 위치가 아래로 고정되어 있다. 이러한 디메리트를 가지고 있음에도 불구하고 왜 스낵바가 활용도가 더 높다고 하는 것일까?
스낵바는 사용자의 입력을 받는 setAction()이라는 메소드가 존재한다. 즉, 토스트와 달리 사용자와의 상호작용이 가능하다는 것이다. 위 예시사진의 UNDO버튼이 그러하다. 저 UNDO버튼을 누르면 지속 시간이 얼마나 남아있든간에 스낵바는 사라진다. 스낵바는 상호작용이 가능하단 점에서 토스트보다 훨씬 무궁무진한 활용도를 자랑한다.
다시 말하지만 setAction() 메소드는 사용자와 상호작용이 가능하게 만들어주는 메소드이다. 즉, 사용자의 행동을 받는 리스너가 있으며, 리스너가 받은 신호에 따라 행동하는 함수 또한 존재한다는 이야기다. 다음 소스코드는 위의 예시 사진과 같은 스낵바를 만들 때에 사용되는 소스코드이다. setAction()이 어떻게 사용되는지 잘 보도록 하자.
해당 코드는 다음과 같이 해석이 가능하다.
- 해당 스낵바는 "Message is deleted"라는 메세지를 띄우며, 긴 시간동안 지속된다.
- setAction()메소드를 활용해 사용자가 UNDO를 누르면 그 이벤트를 OnClickListener()가 수신한다.
- 이벤트가 수신되면 아래의 onClick 함수가 실행되며, 함수 안의 토스트가 실행된다. 즉, UNDO를 누르면 "Message is restored!"라는 내용의 토스트가 발생한다.
위에서 설명한 토스트와 스낵바는 모두 XML 드로어블로 사용자가 원하는 디자인으로 꾸밀 수 있으니 참고하자.
3. 대화상자, Dialogue
아마 여러분들이 앱을 종료하면서 가장 많이 보는 것은 앱을 종료할 것이냐는 내용이 들어간 일종의 상자일 것이다. '이 앱을 종료하시겠습니까?' 그리고 아래에 보이는 '예' 와 '아니요'. 이것을 안드로이드는 대화상자 (Dialogue)라고 부른다.
대화상자는 소스코드가 조금 복잡하다. 일단 전체적인 코드를 먼저 본 뒤, 천천히 분석하는 방법으로 포스팅을 진행하겠다. 주석으로 해당 설명의 번호를 붙였으니 참고 바란다.
- 0. 기본적인 버튼의 리스너다. Dialogue라는 아이디를 가진 버튼을 button_dia라는 Button객체로 참조한다. 해당 버튼을 누름으로써 대화상자가 형성되니, 버튼에 리스너를 만든다. 토스트, 스낵바 또한 거치는 기본적인 과정이니 자세한 설명은 생략하겠다.
- 1. showMessage()라는 별도의 함수를 만든다. 아무래도 우리는 new라는 키워드로 리스너 객체를 정의하며 가다보니, 바깥에 있는 변수를 사용하기 쉽지 않다. 그러한 이유로 별도의 함수를 정의하여 바깥에서 그 기능을 형성한다.
- 2. 대화상자는 AlertDialogue.builder 객체 안에 정의되어 있다. 해당 객체를 참조하여 새로운 대화상자를 형성하자.
- 3. 대화상자의 구성이다. setTitle()메소드로 대화상자의 제목을, setMessage()메소드로 대화상자의 내용을, setIcon()메소드로 대화상자의 아이콘을 정의한다. android.R.drawable은 안드로이드 스튜디오 내에 미리 정의되어있는 아이콘을 사용할 수 있는 경로이니 참고하자.
- 4. 'Leave'라는 이름을 가진 확인 버튼이다. 이 대화상자는 '이 앱을 종료하시겠습니까?"이니, 저 버튼을 누르면 앱이 종료되어야 한다. 하지만 지금은 예시일 뿐이니, Leave를 누르면'Leave' Entered! 라는 토스트를 띄우도록 하자. 사용자와 상호작용이 되어야 하니 리스너가 있어야 한다는 사실을 잊지 말자.
- 5. 'Stay'라는 이름을 가진 부정 버튼이다. 역시 리스너가 있어야 한다는 사실을 잊지 말자. 해당 코드는 Stay를 누르면 'Stay' Entered! 라는 토스트를 띄우도록 했다.
-6. 완성된 대화상자를 보여준다.
대화상자는 지금까지 배워온 리스너와 메소드, 객체 참조 등을 종합한 내용이다. 처음인 사람들에겐 어렵게 다가올것이니, 항상 복습하고 복습하자.
4. Wrap-up
오늘 내용을 기점으로 안드로이드는 어려워지기 시작한다. 객체지향에 대한 이해와 기본적인 프로그래밍 지식, 리스너에 대한 이해가 기본적으로 전제되어 있어야 하기 때문이다. 안드로이드의 기본이 사용자와의 상호작용이기에, 절대 설렁설렁 넘어갈 수도 없는 파트이기도 하니, 통곡의 다리가 아닐 수 없다.
다음 포스팅에는 인플레이션에 대해서 이야기해볼 것이다. 토스트와 스낵바에 핵심적으로 사용되는 것 중에 하나가 바로 이 인플레이션인데, 오늘 배운 내용들이 그떄까지 익숙해지도록 복습하고 또 복습하자.
만약 이 포스팅을 보고도 이해가 안되는 점이 있다면 바로부스트코스 안드로이드 프로그래밍무료강의를 듣자! 필자보다 설명력이 1,000배는 좋은 강사분이 친절하게 하나 둘 다 가르쳐준다. 그 강의를 듣고 이 포스팅을 보면 색다른 느낌이 들지 않을까 싶다.