1. UI 렌더링 - View의 생명주기 - onMeasure() : rootView와 childView의 size가 결정되면 호출된다. - onLayOut(): View와 childView의 size 및 포지션을 적용할 때 호출된다. - onDraw() : View가 화면에 컴포넌트(위젯)을 그릴 준비가 됐을 때 호출된다. * 래스터화(Rasterization) : 위젯들을 픽셀로 변환시키고, 스크린 상의 textures로 나타내는 변환 과정 2. Activity 생명주기 관련 코멘트 - onPause() : 배터리 수명에 영향이 있는 H/W Sensor Connection 또는 고사양 Resource 제거, 멀티 윈도우로 2개의 App을 쓸 때 다른 앱에 포커스된 경우에도 onPause()가 실행됨 ..
1. Strings.xml에서 다양한 특수문자(@)를 쓰고 싶을 때 - 다양한 이스케이프 시퀀스 활용 또는 CDATA 활용(문자를 그대로 입력해서 가독성은 좋음) 가 포함되어야 합니다. \u0040가 포함되어야 합니다. @가 포함되어야 합니다. 2. 회원가입 시 각 입력항목 별로 Error State를 관리하는 방법 - 기존의 나였다면 enum class를 활용했을 것 같은데, enum의 확장 버전인 sealed interface나 sealed class를 활용한다고 한다. - 데이터 클래스의 companion object-init() 대신에 name, email의 프로퍼티에 직접적으로 default value를 지정해도 되지 않을까 하는 의문이 있었다. -> Q. 재사용성이나 가독성을 위해 init 함..
(TimeTable은 문제시 삭제하겠습니다) - 02:00, 요즘은 ConstraintLayout을 사용하는 추세이다. - 05:05, colors.xml를 활용해보자 -> 유지보수가 편해진다. - 07:22, strings.xml에 선언한 값을 kotlin code에서 불러올 수 있다 -> getString(R.string.resId) Toast.makeText(this, getString(R.string.toast_msg_idpwErr), Toast.LENGTH_SHORT).show() //strings.xml 아이디/비밀번호를 확인해주세요 - 13:00, isFinishing 프로퍼티를 활용하여 Activity가 종료중인지 체크하고, 안전하게 finish() 할 수 있다. // ... // 액티비티..
오늘은 스탠다드 반의 1주차 과제였던 디자인을 적용한 과정을 리뷰해보려 한다. 디자인을 해본 기억이 없어서 추후 기억을 위해 post를 남긴다. 이 메인 View에서 다룰 부분은 Sign in과 Register 버튼의 디자인이다. 첫 번째로 컴포넌트는 디자인 적용을 위해 AppCompatButton을 사용했다. // 요구사항 1 반영 // app:layout_constraint 생략 // 요구사항 1 반영 // app:layout_constraint 생략 문제점 1. AppCompatButton을 사용해서 text를 출력하니 텍스트가 전부 대문자(SIGN IN, REGISTER)로 나왔었다. 원인 : AppCompatButton컴포넌트는 textAllCaps 속성의 디폴트 값이 true여서 대문자로 출력..
기존에 Button 터치에 대한 이벤트를 처리한다고 하자. 1. findViewById override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val startButton = findViewById(R.id.btn_start) startButton.setOnClickListener { val intent = Intent(this, TestActivity::class.java) startActivity(intent) } } 위의 코드는 매우 간단하지만 만약 Button이 100개 라면 findViewById를 100번 할 것인가? 그것은..
!role! : 중요한 내용 / 학습할 키워드 / 새롭게 알게된 사실 or 리마인드 / 이해 못 한 부분 모바일 앱 사용자 환경 일반적인 Android 앱에는 activities, fragments, services, content providers, broadcast receivers를 비롯하여 여러 앱 구성요소 (app components)가 포함된다. 개발자는 앱 매니페스트에서 이러한 앱 구성요소 대부분을 선언하며, Android OS는 이 파일을 사용하여 기기의 전반적인 사용자 경험에 앱을 통합하는 방법을 결정합니다. 일반적인 Android 앱은 여러 구성요소를 포함할 수 있고, 사용자는 짧은 시간 내에 여러 앱과 상호작용할 때도 많다는 점을 고려하면, 앱은 사용자 중심의 다양한 워크플로 및 작업..
오늘은 앱개발 과제에서 새롭게 알게 된 메서드 registerForActivityResult에 대해 리뷰해보려 한다. 기존에 액티비티 흐름에서 A(B call) -> B(result send) -> A(result receive) 구조를 짜려면 startActivityForResult를 사용했다. 하지만, 지금은 startActivityForResult가 Deprecated됐다. 그 이유는 A에서 새롭게 시작된 Some 액티비티에서 메모리를 많이 사용할 경우 이전에 열려있던 A 액티비티가 다운되버려서 제대로 callBack을 받지 못할 때가 있었기 때문이다. 이를 해결하기 위해서 새로운 Some 액티비티를 실행시키는 부분과 callBack을 관리하는 부분을 분리했다. -> 이렇게 탄생한게 register..
- 하드코딩 대신 res/values/strings.xml에 정의하고 사용하는 이유 : 다국어 지원을 위함 - 나인 패치(9-Patch) 이미지 : 이미지에서 늘어날 수 있는 영역과 원본 크기대로 표시되어야 할 영역을 구분하여, 리니어 레이아웃 등을 사용할 때, 원본 이미지가 깨지지 않으면서 자연스럽게 확장되도록 만들어진 것 - Constraint Widget은 최소 3개의 연결이 있어야 오류가 발생하지 않는다. ㄴ(추가) 정확히는 Start or End 중 1개, Top과 Bottom 중 하나씩은 제약조건이 필수적이다. ㄴ(추가) ConstraintLayout에서 절대 배치는 사용하지 말 것 - res/values/Style.xml에 커스텀 디자인을 정의할 수 있다. (커스텀 컴포넌트 아님) Linea..
위와 같이 컴포넌트의 레이아웃이 똑같은 화면들을 구현해야할 때, 사용하면 유용한 ViewPager를 적용하는 방법에 대해 리뷰 해보려한다. 1. xml에서 ViewPager2를 원하는 영역만큼 정의한다. 현재 전체 레이아웃을 사용하므로 가로, 세로 모두 match_parent로 지정 이때, viewPager와 함께 TabLayout 등을 같이 정의해주면 페이지 간의 탐색과 진행도를 알 수 있는 UI도 제공할 수 있다. 탭에 텍스트를 빼서 진행도나 애니메이션으로 써도 괜찮을 듯 ref. https://developer.android.com/guide/navigation/navigation-swipe-view-2?hl=ko#add_tabs_using_a_tablayou 상단에 Tab을 둘것인지 아래에 둘것인..
1. Shift + F6 : 이름(변수명, 함수명) 한 번에 수정 2. Ctrl, Shift + F or Shift 2번 : 모든 프로젝트 파일에서 찾기 3. Ctrl, Alt + l : 자동 정렬 4. Ctrl, Alt + o : import 정리 5. CS + BackSpace : 최근 수정 위치 6. Ctrl + F12 : 파일 구조 확인 7. C + E : 최근 작업 파일 목록(CA L or R도 가능) Tip. Git에 업로드 안된 내용이라도 Local History를 통해서 `파일 단위`로 코드 복구가 가능하다.