MVVM (Model-View-ViewModel) 패턴은 비즈니스 로직과 사용자 인터페이스(UI)를 완전히 분리함으로써 쉬운 유지관리와 테스트를 진행할 수 있으며 기본적으로 모듈화를 진행하기 때문에 코드 재사용성도 뛰어납니다. 기존의 액티비티(Activity)에 비즈니스 로직과 UI 로직과 같은 복잡한 기능을 넣게 되면 액티비티가 무거워지고 종속성이 너무 강해 테스트가 힘들고 유지보수가 힘들어집니다. MVVM 패턴은 기본적으로 Model과 View 그리고 ViewModel과 같이 각자의 역할에 맡는 기능들을 모듈화하기 때문에 유지관리 및 테스트가 용이해집니다. 1. View View는 Activity나 Fragment 같은 화면에 표현되는 레이아웃을 정의합니다. View는 기본적으로 비즈니스 로직을 포함..
개발을 진행하다보면 이전에 짰던 소스를 그대로 복사하여 현재 프로젝트에 붙여넣기를 하는 경우가 많이 있습니다. 그런데 소스를 복사 붙여넣기를 할 경우 소스가 제대로 정렬되지 않아 지저분하게 복사되는 경우가 종종 있죠. 바쁜 개발 일정에 한줄한줄 소스를 수정한다는 것은 시간 낭비입니다. 이번 포스팅에서 단축키 한방으로 소스를 자동 정렬하는 방법에 대해 알아보겠습니다. 1. 정석적인 방법 onCreate 함수안에 두 줄의 코드를 일부러 정렬을 엉망으로 만들었습니다. 안드로이드 스튜디오 상단 메뉴바에서 Code- Reformat Code 메뉴를 누르거나 단축키 Ctl+Alt+L을 누르면 아래와 같이 자동정렬이 됩니다. 해당 방식은 전체 코드에 대해 자동 정렬이 실행되는데 만약 특정 코드 영역에 대해서만 자동 ..
이번 포스팅에서는 안드로이드 스튜디오에서 제공하는 기본 폰트말고 커스텀 폰트(Custom Font)를 적용하는 방법에 대해 알아보겠습니다. 1. 폰트 다운로드 https://noonnu.cc/ 상업적 이용 가능한 무료 한글 폰트 모음 사이트 눈누 상업적으로 이용할 수 있는 무료 한글 폰트를 모아 놓은 사이트 눈누 noonnu.cc 예제 구현을 위해 먼저 폰트를 다운받도록 합니다. 위 사이트로 접속을 하게 되면 무료로 상업적 이용이 가능한 여러 폰트를 제공하고 있습니다. 여러가지 폰트를 제공하고 있으며 미리보기를 통해 폰트가 어떤식으로 적용되는지 확인 할 수 있습니다. 폰트명을 클릭하고 들어가보면 하단에 각 폰트에 대한 라이센스 관련 문구가 있습니다. 잘 확인해보시고 사용하시기 바랍니다. 상단 영역에 있는..
RecyclerView는 Adapter가 관리하는 Data Set의 특정 데이터 항목에 대하여 미리 정의된 View를 통해 스크롤이 있는 List 형식으로 표현할 수 있습니다. 이번 포스팅에서는 한 개의 RecyclerView에서 여러 Type의 View를 정의해놓고 데이터의 타입에 따라 각각 다른 ViewType을 적용시키는 방법을 알아보겠습니다. 간단한 채팅 UI를 가지는 RecyclerView를 구현 할것입니다. 해당 RecyclerView에서 사용하는 ViewType은 3개로 중앙에 표시되는 Type과 왼쪽에 채팅내용이 나오는 Type과 오른쪽에 채팅 내용이 나오는 Type 3개로 구성됩니다. 1. DataItem public class DataItem { private String content..
프로젝트를 진행하면서 RecyclerView의 Data Set에 동적으로 아이템을 추가하여 notifyDataSetChanged() 함수를 통해 ReBinding을 시켜야하는 일이 있었습니다. 문제없이 실행되는가 싶더니 데이터가 추가 되고 RecyclerView에 반영이 되는 순간 View가 깜빡 거리는 현상이 생기더군요. 해당 포스팅에서 Adapter의 notifyDataSetChanged 실행 시 RecyclerView의 깜빡 거리는 현상을 해결하는 방법을 알아보겠습니다. 1. 깜빡거리는 원인 Adapter가 관리하는 Data Set에 데이터가 추가 / 삭제 / 갱신등이 이루어지면 notifyDataSetChanged()를 호출하여 Adapter에게 DataSet이 변경되었으니 갱신하라고 알려줘야 합..
1. /res/layout/activity_main.xml ▼ 갤러리에서 가져온 사진을 표현하기 위해 ImageView 위젯 하나를 배치하였습니다. 해당 예제에서는 화면에 배치되어 있는 ImageView를 클릭하였을 때 Gallery Activity릃 실행한 뒤 사진을 선택하고 예제 앱 액티비티로 돌아왔을 때 ImageView에 해당 사진을 표현하도록 하겠습니다. 2. MainActivity.java public class MainActivity extends AppCompatActivity { private static final int REQUEST_CODE = 0; private ImageView imageView; @Override protected void onCreate(Bundle saved..
디자인 패턴(Design Pattern) 중 싱글톤(Singleton) 패턴은 특정 클래스에 대한 인스턴스를 단 한 번만 Static 메모리 영역에 할당하고 해당 클래스에 대한 생성자를 여러 번 호출하더라도 최초에 생성된 객체를 반환하는 디자인 패턴입니다. 즉 애플리케이션의 특정 클래스에 대한 유일 객체를 보장하는 디자인 형태라고 볼 수 있습니다. 일반적으로 싱글톤 패턴이 적용된 클래스에 대한 new 연산을 수행하더라도 이미 한번 할당된 메모리 영역의 인스턴스를 사용하기 때문에 무분별한 new 연산으로 인한 메모리 낭비를 방지 할 수 있습니다. 안드로이드 스튜디오에서는 클래스 파일을 생성하는 시점에 자동으로 싱글톤 패턴이 적용된 클래스 형태로 파일을 생성해줍니다. public class MovieData..
플로팅 액션 버튼(Floating Action Button)은 화면에 떠있는 원형의 버튼으로 머터리얼 디자인에서 자주 사용되는 기본 위젯입니다. 플로팅 액션 버튼(Floating Action Button)을 구현하는 방법은 일반 버튼 위젯을 구현하는 방법과 비슷합니다. 다만 기본적으로 ImageView를 상속받는 위젯이기 때문에 버튼에 표현할 아이콘을 지정할 수 있으며 버튼을 클릭하였을 때 서브 버튼이 나열이 되도록 구현이 가능합니다. 물론 일반 버튼처럼 사용자가 발생한 클릭 이벤트에 대한 처리도 가능합니다. 1. 화면에 FloatingActionButton 사용법 1.1 xml 레이아웃 리소스 추가 FAB 위젯을 레이아웃에 추가하는 방법은 일반 위젯들을 추가시키는 방법과 동일합니다. FAB에서 사용되는..
안드로이드 앱에서 사용자로부터 값을 입력받을 때 사용되는 View 위젯 중 EditText가 있습니다. 앱을 구현하다 보면 이러한 EditText의 Text 입력값이 변경될 때마다 특정 작업을 처리해야 할 경우가 있습니다. 이때는 TextWatcher 인터페이스를 구현하여 EditText의 이벤트 리스너로 등록하여 처리가 가능합니다. 1. TextWatcher 인터페이스 필구 구현 함수들 ■ beforeTextChanged(CharSequence s. int start, int count, int after) CharSequece s : 현재 EditText에 입력된 값 int start : s에 저장된 문자열에서 새로 추가될 문자열의 시작 위치 값 int count : s에 새로운 문자열이 추가된 후 ..
안드로이드 단말기에는 여러 가지 키(Key)가 존재합니다. 이전 액티비티로 돌아가거나 현재 액티비티가 루트 액티비티일 경우 앱을 종료시키는 뒤로 가기 키, 볼륨 조절을 위한 볼륨 업다운 키, 홈 화면으로 이동 가능한 홈 키등 여러 가지 키 이벤트(Key Event)를 발생시켜 단말기의 특정 작업을 처리하는 경우가 많습니다. 안드로이드 앱 개발 과정에서도 이러한 각 키(Key)에 대한 이벤트 처리를 onKeyUp() 함수와 onKeyDown() 함수를 재정의함으로써 이벤트 처리 작업이 가능합니다. 함수명으로도 직관적으로 알수 있듯이 onKeyDown()은 키가 눌렀졌을 때 호출되며 onKeyUp() 함수는 키에서 손을 뗐을 때 호출되는 함수입니다. 두 함수는 KeyCode 값과 KeyEvent 두 개의 공..
안드로이드 앱에서 컨텐츠 전환 및 탐색을 위한 Navigation Menu는 여러 가지 방식으로 구현할 수 있습니다. 사용자가 앱 상단의 버튼을 클릭하여 왼쪽에서 오른쪽으로 슬라이드 형식으로 메뉴가 오픈되는 Drawer Navigation 방식과 App Bar 자체에서 앱의 탐색 및 컨텐츠 전환이 가능한 메뉴 모음을 두는 방식 등이 있습니다. 현재 출시 된 안드로이드 앱의 레이아웃 구성을 보면 보통 이러한 메뉴들이 앱의 하단에 위치하고 있습니다. 앱의 탐색 모음을 하단에 배치함으로써 사용자가 한 번의 클릭 동작만으로 앱을 쉽게 탐색하고 전환 가능하도록 하여 사용자가 편리하고 직관적인 UI를 경험할 수 있도록 합니다. 하단 메뉴 구성은 BottomNavigationView를 통해서 구현합니다. 이번 포스팅..
다양한 크기의 화면을 가지는 단말기가 늘어남에 따라 한 화면에 여러 개의 화면 요소를 원하는 수요가 늘어가고 있습니다. 대표적으로 화면의 크기가 큰 태블릿 PC와 같이 화면의 크기가 큼에 따라 복잡한 레이아웃 구성과 뷰 위젯 배치들로 인해 기존의 Activity를 통한 레이아웃 구성만으로는 구현하기 버거운 면이 있었습니다. 이를 커버하기 위해 나온것이 안드로이드 3.0(API 11)부터 추가된 개념인 프래그먼트(Fragment)입니다. 프래그먼트는 액티비티 내에서 화면 UI의 일부를 나타냅니다. 여러 개의 프래그먼트를 조합하여 액티비티가 출력하는 한 화면의 UI를 표현할 수 있으며 하나의 프래그먼트를 다른 액티비티에 재사용할 수 있습니다. 액티비티(Activity)처럼 하나의 독립된 모듈처럼 실행되기 때..
안드로이드의 Switch 위젯은 두 가지 옵션 중 하나를 선택할 수 있는 두 개의 상태 Toggle Switch입니다. 사용자는 두 가지 옵션 중 하나를 선택하기 위해 간단한 터치 동작이나 thumb을 앞 뒤로 드래그하여 선택할 수 있습니다. 1. Switch 주요 속성 속성명 설명 android : showText on/off (설정/해제) Text가 보일지 안보일지를 결정하는 속성. android : thumbTextPadding Switch Caption과 Thumb 사이의 간격 android : switchMinWidth 스위치의 너비 최소 크기 android : switchPadding Switch Caption과 스위치 사이의 간격 androiid : switchAppearance on/off..
RatingBar는 SeekBar와 ProgressBar의 확장 버전으로 별 모양을 통해 평점이나 점수 또는 등급을 매길 때 사용하는 뷰 위젯입니다. 1. RatingBar의 주요속성 4가지 속성 설명 android : isIndicator false 일때 사용자가 별표를 터치 또는 드래그를 통해 변경가능 android:numStars 화면에 표시되는 별의 개수 android:stepSize 평점 변경 단위 android:rating 최초 평점 ▼ Xml 레이아웃 리소스를 통해 RatingBar 한 개를 배치한 형태입니다. isIndicator 속성값은 default로 false이기 때문에 사용자와의 터치 또는 드래그와 같은 상호작용을 통해 별 점수를 변경하는 것이 가능합니다. 또한 stepSize가 3..
안드로이드 앱에서 데이터를 저장할 때는 파일(File)이나 데이터베이스(Databaese)를 사용합니다. 하지만 비교적 소규모의 키(Key) - 값(Value)의 자료구조의 데이터는 SharedPreferences API를 사용하여 데이터를 저장합니다. SharedPreferences 사용하여 저장되는 데이터는 파일 형식으로 저장이 되며 앱이 삭제되기 전까지 보존이 됩니다. 데이터베이스를 사용하는 것처럼 key-value 쌍의 데이터를 저장하고 불러오고 삭제가 가능합니다. SharedPreferences에는 수치 값이나 간단한 텍스트 또는 자동 로그인 여부와 같은 간단한 사용자 설정값들을 저장하는 용도로 사용됩니다. 저장 가능한 데이터 타입으로는 boolean, int, float, long, Strin..