Programming

    Take Photo with Intent

    Take Photo with Intent

    Take Photo with Intent 화면 작업 👉 FileProvider 등록 👉 저장 데이터 정의 와 파일 저장 경로 설정 👉 사진 찍기 기능 추가 👉 ImageButton and ImageView 만들기 원하는 프래그먼트나 액티비티의 xml 에 ImageButton 과 ImageView를 만든다. 위의 예시 처럼 원하는 형태로 이미지뷰와 이미지 버튼을 만든다. 파일 저장소 사진 파일은 용량이 크다. SQLite DB 에 넣기도 어렵다. 그러므로, 폰의 저장소에 저장하는 것이 바람직하다. (물론, DB 용량이 크다면 가능하다.) 개인 저장소에 저장하려면, Context.getFileStreamPath(String) or Context.getFilesDir() 함수들을 이용한다. Context 클래..

    DialogFrag to Frag with Data

    DialogFrag to Frag with Data

    Dialog 상속 관계 : Dialog >> AlertDialog >> DatePickerDialog 대화상자는 사용자의 주의를 끌고 입력을 받는데 사용되며 사용자의 선택을 받거나 중요한 정보를 보여줄 때도 유용하다. DialogFragment to Fragment with Data 프래그먼트에서 다이얼로그 DatePickerDialog 는 사용자에게 날짜를 선택하게 유도하는 대화상자이다. 프래그먼트에서는 Fragment의 서브 클래스인 DialogFragment 인스턴스에 포함시키는 것이 좋다.FragmentManger로 DatePickerDialog를 관리하는 것이 유연성이 좋다. 또한, 화면회전시 화면을 유지해주기 때문에 DialogFragment를 사용하는게 좋다. FragmentManger VS..

    Frag to Frag with Data

    Frag to Frag with Data

    Fragment to Fragment with Data 프래그먼트에서 프래그먼트로 이동하는 방법은 다양하다. 단일 활동 구조 (single activity architexture) 를 사용한다는 가정하에 (간단히 말하면, 한 액티비티에 여러개의 프레그먼트가 있는 구조이다. ) 프래그먼트에서 데이터와 함께 이동하는 방법에 대해 알아본다. 정확히 말하자면, DB와 연동된 데이터가 뜨는 재활용뷰에서 특정 아이템을 선택한다. 그 선택된 아이템의 상세 페이지로 이동한다. 해당 상세 페이지에는 그 아이템의 정보가 보여지게 하는 것이다. 단순 프래그먼트 이동 방법 이동을 시작하는 프래그먼트에서 아래의 코드를 작성해주면 되긴하다. fun onClick(view:View){ val 도착프래그먼트 = 도착Fragment...

    JetPack AAC: LiveData

    JetPack AAC: LiveData

    LiveData LiveData Jetpack 의 lifecycle - extensions 라이브러리에 있는 데이터 홀더 클래스 이다. Room 에서 LiveData를 사용한다. 라이브 데이터의 목적 앱의 서로 다른 부분 간에 데이터 전달을 쉽게 만드는 것이다. 라이브 데이터는 스레드 간에도 데이터를 전달할 수 있어서, 백그라운드 스레드에서 메인 스레드로 데이터를 전달할 수 있다. Room DAO 의 쿼리에서 LiveData를 반환하도록 구성하면, Room은 백그라운드 스레드에서 쿼리 작업을 자동 실행한 후그 결과를 LiveData 객체로 반환해준다. 즉, 액티비티나 프래그먼트에서는 LiveData 객체를 관찰하도록 설정만 하면 자동으로 처리가 된다는 말이다.그리고 LiveData 객체가 준비되면 메인 ..

    Thread

    Thread

    Thread 안드로이드에서의 스레드, 메인 스레드 스레드는 단일의 실행 시퀀스다. 스레드 내부의 코드는 한 단계씩 실행된다. 모든 안드로이드 앱은 메인 스레드로 시작된다. 그러나 메인 스레드는 미리 정해진 순서로 실행되지 않는다. 대신에 무한 루프에 머물면서 사용자나 시스템이 유발한 이벤트를 기다리는 것이다. 그리고 이벤트가 발생하면 응답하는 코드를 실행한다. 메인 스레드는 액티비티 시작, UI 관련 처리를 주로 하기 때문에 UI 스레드라고도 한다. 백그라운드 스레드 앱을 실행하다보면, 앱이 중지되는 경우가 있다. 이런 경우를 ANR(Application Not Responding)이라 한다. 앱이 응답을 안한다는 의미이다. ANR = 앱 미응답 백그라운드 스레드를 앱에 추가할 때 고려할 규칙이 두가지 ..

    Repository Pattern

    Repository Pattern

    Repository Pattern Repository Pattern ? 저장소 패턴이다. 저장소 클래스는 저장소를 구현한다. 또한 단일 또는 여러 소스로부터 데이터를 액세스하는 로직을 캡슐화하고, 로컬 데이터베이스나 원격 서버로부터 특정 데이터셋을 가져오거나 저장하는 방법을 결정한다. 그리고 UI코드에서는 저장소에 모든 데이터를 요청한다. UI는 어떻게 데이터를 저장하거나 가져오는지에 관여하지 않는다. 이러한 작업은 저장소에서 따로 처리한다. 저장소 클래스는 싱글톤이다. 데이터를 가져오는 것만 처리하는 코드는 아래와 같다. package com.bignerdranch.android.criminalintent import android.content.Context // 이 저장소 클래스는 싱클톤이다. : ..

    JetPack AAC: Room

    JetPack AAC: Room

    Room 룸은 재트팩 아키텍쳐 컴포넌트 라이브러리 이다. 데이터베이스 설정과 사용을 쉽게 해준다. 룸을 사용하면 애노테이션이 지정된 코틀린 클래스로 데이터베이스 구조와 쿼리를 정의할 수 있다. 룸의 구성은? API : 데이터베이스를 정의하고 인스턴스를 생성하기 위해 상속받는 클래스들이 API에 포함되어 있다. Annotation (@) : 데이터베이스에 저장할 필요가 있는 클래스, 데이터베이스를 나타내는 클래스, 데이터베이스 테이블을 사용하는 함수들을 정의하는 클래스 등을 나타내기 위해 애노테이션을 사용한다. Compiler : 지정한 애노테이션을 컴파일해서 데이터베이스 구현체를 생성한다. 종속성 추가 ... plugins { id 'com.android.application' id 'kotlin-and..

    Layout Design

    Layout Design

    Layout Design 레이아웃 디자인 창은 ConstraintLayout에서 많이 사용한다. 왼쪽, 컴포넌트 트리에서 LinearLayout을 우클릭 하면 위와 같이 Convert LinearLayout to ConstraintLayout 으로 변경이 가능하다. 제약을 제어하는 툴바가 상단에 생성된다. 각 툴의 의미는 아래와 같다. 보기 옵션 | 자동연결 활성화/비활성화 | 0dp | 모든 제약 삭제 | 제약 추론 | 가이드 라인 보기옵션 : Show All Constraints 를 선택하면 레이아웃 디자인과 청사진 모두에 설정된 제약을 보여준다. Show System UI 를 선택하면 레이아웃과 함께 장치 화면 맨 위의 상태 바나 앱 이름을 포함한 앱 등도 같이 볼 수 있다. 자동 연결 활성화/비활..