2019. 4. 4. 01:57ㆍEngineer/안드로이드 앱 프로그래밍
진도를 나가다 보니 Java 나 XML 에 대한 지식이 어느정도 있으면 이해하기 편하겠다는 생각이 든다. 그래도 일단은 이책부터 끝내자.
Chapter 04. 다양한 위젯과 이벤트 활용하기
04-1 이벤트 처리 이해하기
이벤트 처리 방식
- 위임 모델(Delegation Model) : 각각의 이벤틀르 처리할 수 있는 리스터(Listener) 인터페이스(ex. onClickListener)를 설정, 이벤트가 발생하면 해당 위젯 객체에 전달후 그 이후의 처리 과정을 위젯 객체에 위임 . 코드가 복잡해지지 않고, 이벤트를 위젯마다 개별적으로 처리하는 객체지향 코드가 가능.
대표적인 이벤트
제스쳐 이벤트는 터치 이벤트 중에서 스크롤, 플링 등을 구별한 후 알려주는 이벤트. 제스처 이벤트를 처리해주는 클래스는 GestureDetector이며, 이 객체를 만들고 터치 이벤트를 전달하면 GestureDetector 객체에서 각 상황에 맞는 메소드를 호출하므로, 일반적인 터치 이벤트보다 더 간단하게 처리 가능.
제스쳐(Gesture) 이벤트를 통해 처리할 수 있는 이벤트 유형
키 입력 이벤트는 하드웨어 키보드나 소프트 키패드에 상관없이 동일한 이벤트로 전달됨. 하드웨어 버튼의 경우에도 키 이벤트로 처리할 수 있음.
키를 입력할 때 발생하는 이벤트는 포커스(Focus)를 가진 뷰에게 전달. 포커스는 화면에 보이는 뷰들 중의 하나에 부여. 안드로이드 시스템은 일반적으로 포커슬르 받은 뷰의 생상이나 표시를 바꾸어 줌으로 구분.
단말 방향을 전환 이벤트
단말의 방향 상태(가로, 세로)에 따른 레이아웃 파일이 따로 만들어져 있을 때, 안드로이드 단말의 방향이 바뀌면 기존의 액티비티를 없앤 후 새로 만듬. 가로 방향일 때 사용될 xml 레이아웃 파일을 위해 layout 폴더 하위에 새 폴더(layout-land)를 생성, 이 폴더에 xml 파일을 만들어 작성. 'layout-land'라는 폴더 이름은 미리 지정된 것으로, 단말에 의해 자동으로 확인된 후 단말을 가로 방향으로 돌렸을때 이 폴더 안의 레이아웃 파일을 우선 적용함
단말기 방향이 바뀜에 따라 기존 액티비티가 삭제되고 새로운 액티비티가 생성되는데, 이때 이전에 선언되었던 변수값이 사라지므로 이것을 저장했다가 복원하는 기능이 필요
onSaveInstanceState : 액티비티가 종료되기 전의 상태를 저장. 저장된 상태는 onCreate( )메소드가 호출될 때 전달되어 번들 객체로 복원 가능
단말기의 방향이 바뀜에 따라 기존의 액티비티를 없앴다가 다시 만드는 것이 아니라, 단순히 화면에 보이는 레이아웃만 바꾸는 것도 가능. Manifest파일에 <activity> 태그에 configChanges속성을 추가하면, 설정된 속성값에 따라 상택변화를 액티비티에 알려주게되고 개발자는 각 상태 변화에 따른 대응 코드를 작성하면됨.
방향을 세로 또는 가로로 고정시키고 싶다면 manifest파일에서 액티비티의 screenOrientation 속성 값을 지정하면됨
04-2 토스트와 대화상자
토스트(Toast)는 포커스를 받지 않으므로 대화상자보다 쉽고 간단하게 사용가능하며, 디버깅 등의 목적으로도 사용할 수 있음. 앱이 화면에서 사라지더라도 토스트 메세지는 그대로 표시되므로 앱의 상태와 관계없이 보여줄 수 있는 장점이 있음. 메소드를 이용해 토스트의 모양, 위차와 여백을 지정 할 수 있음.
토스트와 비슷하게 간단한 메세지를 보여주는 용도로 사용되는 스낵바(Snackbar)의 경우에는 외부 라이브러리로 추가되어있기 때문에 스낵바가 들어있는 디자인 라이브러리(com.android.support:design)를 프로젝트에 추가해야 사용 가능
알림 대화상자(Alert Dialog)는 사용자에게 확인을 받거나 선택하도록 할 때 사용.
04-3 프로그레스바 사용하기
프로그레스바(ProgressBar)는 작업의 진행 정도(막대 모양)를 표시하거나 작업이 진행 중임(원모양)을 사용자에게 알려주는 역할로 사용
시크바(SeekBar)는 프로그래스바와 같이 상태 표시 위젯으로 프로그레스바의 속성을 갖고 있으면서 사용자가 값을 조정할 수 있게 함. 볼륨 조절이나, 동영상 재생 때 재생 위치 조절을 위해 사용
04-4 간단한 애니메이션 사용하기
화면을 구성하는 각각의 뷰는 여러가지 방법을 통하여 애니메이션을 적용할 수 있음
애니메이션이 어떻게 동작할지 xml로 작성한 뒤, 이 xml을 자바 소스에서 애니메이션(Animation) 객체로 로딩한 후 뷰 객체의 startAnimation( )메소드를 이용해 동작하도록 함
04-5 페이지 슬라이딩 사용하기
여러 애니메이션 방식 중에서 페이지 슬라이딩은 버튼 등을 눌렀을 때 보이지 않던 뷰가 슬라이딩 방식으로 보이는 것으로, 중첩되어 있는 여러 뷰를 하나씩 전환하면서 보여주는 방식에 애니메이션을 결합한 것. 상위에 있는 뷰가 열리는 애니메이션과 닫히는 애니멘이션 두가지가 필요.
04-6 프래그먼트
액티비티는 하나의 화면을 독립적으로 구성할 때 필요한 여러 가지 속성들을 사용하여 안드로이드 시스템에서 관리하는 애플리케이션 구성 요소이므로 액티비티 안에 다른 액티비티를 넣는 것은 단말의 리소스를 많이 사용하는 비효율 적인 방법임
프래그먼트(Fragment) : 하나의 액티비티 안에 여러 개의 액티비티를 부분 화면으로 올려서 보여주는 방법
프래그먼트는 한 화면 안에 들어가는 부분 화면과 같아서 하나의 레이아웃처럼 보이지만 액티비티처럼 독립적으로 동작하는 부분 화면임. 프래그먼트의 사용 목적은 분할된 화면들을 독립적으로 구성하고 그 상태를 관리하는 것
프래그먼트와 액티비티는 둘다 xml 레이아웃으로 만들지만 액티비티에 사용되면 안드로이드 시스템, 더 정확히는 액티비티 메니저에서 관리하는 화면이되고 프래그먼트에 사용되면 단순히 액티비티 위에 올라가는 화면의 일부가 됨, 즉 '부분화면'임
프래그먼트는 항상 액티비티 위에 올라감. 액티비티로 만들어지는 화면을 분할하여 각각의 부분화면을 프래그먼트로 만들고 그 프래그먼트를 독립적으로 관리하는 것을 목표
액티비티에 프래그먼트 메니저를 구현하여 프래그먼트를 관리하므로 액티비티 위에 올라가 있지 않은 프로그먼트는 정상적으로 동작할 수 없음
인텐트는 시스템에서 이해하는 객체이므로 프래그먼트간의 데이터 전달에 사용할 수 없으므로 따로 메소드를 만들고 메소드를 호출한느 방식을 사용
프래그먼트는 액티비티 위에 올라가 있어 액티비티를 전환하지 않고도 훨씬 가볍게 화면 전환 효과를 만들어 낼 수 있음. 특히 탭 모양으로 화면을 구성할 때 각각의 탭 버튼을 클릭하면 다른 화면이 보이는 효과를 내고 싶을때 효율적임
프래그먼트도 액티비티와 마찬가지로 xml 레이아웃 파일과 자바소스 파일로 만듬. 자바 소스 코드에서 프래그먼트는 Fragment 클래스를 상속하여 만듬. 그리고 자바 소스 파일과 xml 레이아웃 파일을 매칭하는 과정 필요. xml 레이아웃을 인플레이션하면 하나의 뷰처럼 동작 가능한 상태가 됨
메인 액티비티에 프래그먼트를 넣는 방법 2가지
①일반적인 뷰처럼 xml 레이아웃에 <fragment>태그로 추가 하는 방법
②자바 소스코드에서 new 연산자를 이용해 객체를 만든 후 프래그먼트 매니저에 요청하여 추가하는 방법
프래그먼트의 대표적인 특성
- 뷰 특성 : 뷰 그룹에 추가되거나 레이아웃의 일부가 될 수 있음(뷰에서 상속받는 것은 아니며 뷰를 담고 있는 일종의 틀임)
- 액티비티 특성 : 액티비티처럼 수명주기를 가지고 있음 (컨텍스트 객체는 아니며 라이프 사이클은 액티비티에 종속됨)
프래그먼트는 뷰와 달라서 뷰를 담고 있는 공간만 확보. 따라서 태그 이름으로 프래그먼트의 이름을 사용할 수 없으며 name속성에 새로 이름을 설정 필요. 프래그먼트 이름을 설정할 때 패키지 이름을 포함한 이름으로 설정
액티비티와 프래그먼트의 의사소통 방식
프래그먼트 매니저는 프래그먼트를 다루는 작업을 해주는 객체로 프래그먼트를 추가, 삭제 또는 교체 등의 작업을 가능하게 해줌. 이 작업 중에 오류가 생기면 다시 원상태로 돌릴 수 있어야 하므로 트랜젝션 개체를 만들어 실행
트랜젝션 객체는 beginTransaction( ) 메소드를 호출하면 시작되고 commit 메소드를 호출하면 실행됨
프래그먼트는 액티비티처럼 독립적으로 동작하도록 수명주기(Life Cycle)메소드가 있음. 프래그먼트 사용 목적중 하나가 분할된 화면들의 상태를 고나리하는 것인데 이것을 가능하게 하는 것이 수명주기 메소드임. 액티비티 안에 들어있는 프래그먼터도 필요에 따라 화면에 보이거나 보이지 않게 되므로 액티비티 처럼 각각의 상태 관리가 필요
위의 메소드들은 프래그먼트가 처음 만들어지고 화면에 나타나기 전에 호출되는 것들.
주의할 점은 프래그먼트는 액티비티 안에 추가되어 사용되면서 동시에 액티비티에 종속되어 있으므로 프래그먼트와 액티비티가 연결되어야 초기화 될 수 있음. 때문에 new 연산자를 이용해 프래그먼트 객체를 만드는 시점과 onCreate( ) 메소드가 호출 되는 시점이 달라지게됨. 이를 순서대로 보면, 먼저 onAttach( )메소드가 호출되면서 액티비티에 프래그먼트가 추가되면 그 다음 onCreate( )가 호출됨. onAttach( )메소드가 호출될 때 전달되는 Activity객체는 프래그먼트를 포함하는 액티비티 객체가 되므로 액티비티를 위해 설정해야하는 정보들은 이 메소드에서 처리함
프래그먼트가 새로 만들어질 때 그 안에 뷰들을 포함하게 되면 뷰그룹처럼 뷰들의 레이아웃을 결정해 주어야함. onCreateView( )메소드는 프래그먼트와 관련되는 뷰들의 계층도를 구성하는 과정에서 호출됨
onActivityCreated( )는 프래그먼트에서 액티비티가 만들어지는 상태를 알 수 있도록 해주는 메소드
아래는 프래그먼트가 화면에서 보이지 않게 되면서 호출되는 상태 메소드
프래그먼트는 액티비티 위에 올라가야 프래그먼트로서 동작하기 때문에, 프래그먼트 객체가 new 연산자로 만들어졌다고 하더라도 액티비티 위에 올라가기 전까지는 프래그먼트로 동작 하지 않음
04-7 액션바와 탭 사용하기
옵션 메뉴 : 시스템[메뉴] 버튼을 눌렀을 때 나타나는 메뉴로 각 화면마다 설정할 수 있는 주요 메뉴
컨텍스트 메뉴 : 화면을 길게 누르면 나타나는 메누로 뷰에 설정하여 나타나게 할 수 있음. 텐스트 뷰 편집 상태를 바꾸거나 할 때 사용
액티비티의 위쪽에 보이는 타이틀 부분과 옵션 메뉴는 액션바로 합쳐져 보이게 됨. 액션바는 기본적으로 제목을 보여주는 타이틀의 기능을 하므로 앱의 제목을 보여줄 수 있으며 화면에 보이거나 보이지 않도록 설정 가능.
탭 : 몇개의 버튼을 두고 그중에 하나의 버튼을 눌러 서브화면을 전환하는 방식, 하나의 뷰에서 여러개의 정보를 보고자 할 때 일반적으로 사용. 액션바에 제공하는 탭 기능의 사용을 권장. 또한 버튼들과 프레임 레이아웃을 이용해 직접 만들 수도 있음
탭 위젯의 3가지 구성요소 : 탭 호스트(TabHost), 탭 위젯(TabWidget), 프레임 레이아웃(Frame Layout)
프레임 레이아웃과 가시성 속성을 이용해 화면상에 여러개의 레이아웃을 중첩시켜 두고 이중에서 원하는 레이아웃만 보여주는 방법
04-8 웹브라우저 사용하기
웹브라우저를 앱 안에 넣고 싶은 경우 웹뷰(WebView)를 사용하면 됨. Xml 레이아웃에서는 <WebView> 태그로 정의. 웹뷰를 정의하여 사용할 때는 인터넷에 접속하게 되므로 메니페스트에 인터넷 접속 권한이 등록 되어이있어야함
웹페이지를 로딩하여 화면에 보여주기 위해서는 loadUri( ) 메소드 사용
04-9 키패드 설정하기
키패드와 관련된 기능은 InputMethodManager 객체를 사용해 사용 가능. 이 객체는 시스템 서비스 이므로 getSystemService( ) 메소드로 참조해야 함
inputType 속성 설정하면 키패드의 유형을 바꿀 수 있음.
내용이 유익하셨다면 아래 광고 한번 눌러주세요.
홈런볼 사먹고 힘내서 더 유익한 정보로 보답하겠습니다.
(클릭하고 바로 창 닫으셔도 되요. 모두의 시간은 소중하니까요 ^^;)
'Engineer > 안드로이드 앱 프로그래밍' 카테고리의 다른 글
Do it! 안드로이드 앱프로그래밍 8일차 (19.04.16) (0) | 2019.04.16 |
---|---|
Do it! 안드로이드 앱프로그래밍 7일차 (19.04.15) (0) | 2019.04.15 |
Do it! 안드로이드 앱프로그래밍 3, 4일차 (19.04.02) (0) | 2019.04.03 |
Do it! 안드로이드 앱프로그래밍 2일차 (19.03.29) (0) | 2019.03.29 |
Do it! 안드로이드 앱프로그래밍 1일차 (19.03.28) (0) | 2019.03.28 |