본문 바로가기

android

(24)
Android 권한 안드로이드 권한 유형 (1) 설치 시간 권한: 앱에서 설치 시간 권한을 선언하면 시스템에서는 사용자가 앱을 설치할 때 자동으로 앱에 권한을 부여합니다. 앱스토어에서는 사용자가 앱의 세부정보 페이지를 볼 때 설치 시간 권한 안내를 표시합니다. (2) 런타임 권한: 런타임 권한은 위험 권한이라고도 잠재적으로 민감한 정보가 포함된 특별 유형의 제한된 데이터에 액세스 하기 위해서 요구되는 권한입니다. 예를들어 위치 정보와 연락처 정보등이 있습니다. 권한의 필요성에 대한 평가 앱에서 권한을 선언하기 전에 권한의 필요성을 먼저 고려해야 합니다. 런타임 권한을 요청하는 경우 사용자가 권한을 요청하는 이유를 이해하지 못한다면 권한을 거부하거나 앱을 제거할 수도 있기 때문입니다. 그리고 이미 기기에 설치된 다른 앱이 내..
Firebase Ream-Time Database Paging 처리 Firebase Real-Time Database 에서 데이터를 읽어와서 RecyclerView 또는 ViewPager2 에 데이터를 연결할 때 고려해야 하는 부분 중 서버에서 데이터를 한번에 읽어오지않고 사용자의 스크롤 지점에 따라서 조금씩 읽어오는 방식으로 하는 것이 좋습니다. 예를들어 서버에 저장된 Post 가 총 100개라고 하면 앱을 실행하면 최초로 10개만 받아오고 사용자가 스크롤하여서 앞으로 보여줄 아이템이 3~4개 정도 남아있을 때 다시 10개를 받아오는 방식으로 한다면 사용자에게 쾌적한 앱 서비스를 제공하는데 도움이 됩니다. 이 글에서는 Firebase Real-Time Database 를 사용하여 Paging 처리하는 방법에 대해 작성합니다. 1. 로딩한 데이터를 보여줄 ViewPage..
DialogFragment width 조정 앱을 개발하던 중 Dialog 가 필요해서 적용을 하기위해, DialogFragment 의 레이아웃의 width 를 match_parent 로 주고 margin 값을 이용해서 양쪽 여백을 만들려고 했으나 예상했던것과 다르게 동작하는 문제가 발생했습니다. 검색을 해보니 나와 비슷한 문제를 겪으신 분들이 많은 것 같습니다. 그 중 하나의 솔루션을 발견했고 적용한 결과 처음 원했던 대로 스크린 width 의 90%만 차지하는 Dialog 를 만들 수 있었습니다. ... override fun onResume() { super.onResume() resizeDialog() } private fun resizeDialog() { val windowManager = requireActivity().getSystem..
1. App bar(앱바 추가, 액션 추가 및 핸들링, up 액션) 1. 앱바 추가하기 support library 의 Toolbar 클래스를 사용하여 앱 바를 구현해야 합니다. support library 의 Toolbar 를 사용하면 앱이 수많은 종류의 기기에서 일관되게 작동하도록 할 수 있습니다. Activity 에 Toolbar 추가하기 (1) Activity 가 AppCompatActivity 를 확장하는지 확인한다. (2) AndroidManifest.xml 파일의 태그의 theme 속성에 NoActionBar 테마 중 하나를 지정한다. 이러한 테마 중 하나를 사용하면 앱이 Native ActionBar 클래스를 사용하여 앱 바를 제공할 수 없습니다. (3) Activity 의 레이아웃에 Toolbar 를 추가한다 아래의 코드는 Toolbar 를 추가하고 Ac..
Frgament 통신 [1]. Fragment-Fragment 또는 Fragment-Host Activity 간 통신을 하기 위한 간단한 방법으로는 Jetpack 의 ViewModel 라이브러리와 LiveData 라이브러리를 사용하는 방법이다. ViewModel 은 기기의 구성 변경이 발생하여 컴포넌트가 재생성 되더라도 컴포넌트의 상태를 유지하기 위한 용도로 사용되며 LiveData 는 컨트롤러(예: Activity) 에 데이터 변경 사실을 알려주는 용도로 사용된다. [2]. ViewModel 객체를 생성하기 위해서 ViewModelProvider 클래스를 사용하는데 이때 ViewModelProvider 의 생성자에는 ViewModelStoreOwner 라는 값을 넘겨줘야 한다. 이미 생성된 ViewModel 객체를 가져오거..
Fragment Transaction 동작 분석 런타임 시 Fragment 를 추가, 삭제, 대체할 경우에는 FragmentManager 의 beginTransaction() 메서드를 사용하여 트랜잭션 객체를 생성한 후, 트랜잭션 내에 명령어들을 추가하고 마지막으로 commit() 메서드를 사용하여 해당 트랜잭션에 모든 명령이 담겼다는 것을 알려줘야 한다. 이 문서를 작성하는 이유는 developer android 문서를 읽고 이해하려고 해봤지만 다소 추상적인 내용들이 있어서 좀 더 구체적으로 이해를 해야 할 필요성을 느꼈기 때문이다. 1. add, replace, remove 등의 메서드가 호출되면 FragmentTransaction 내의 mOps 자료구조에 해당 명령이 저장된다. 2. addToBackStack 메서드를 실행하면 FragmentTr..
5-1. Jetpack Navigation의 구성요소 [1]. Jetpack Navigation 이란? Jetpack Navigation 은 앱 내의 여러 컨텐츠에 들어갔다 나올 수 있게 하는 상호작용을 구현하도록 도와주는 라이브러리 이다. [2]. Navigation 구성요소 1. Navigation Graph => 모든 Navigation 관련 정보가 모여있는 XML 파일이다. XML 파일 내에는 목적지 과 이용 가능한 경로 등이 포함되어 있다 2. NavHost => Navigation Graph 를 호스팅하기 위한 빈 Container 이다. app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" android:name="androidx.navigation.fragment.NavHostFrag..
4-2 단방향 데이터 바인딩, 양방향 데이터 바인딩 *개인적으로 분석한 내용이므로 틀린 내용이 있을 수 있습니다. 틀린 내용을 댓글로 남겨주시면 수정하도록 하겠습니다! [1]. 단방향 데이터 바인딩 vs 양방향 데이터 바인딩 1. 단방향 데이터 바인딩: 예를들어 ViewModel 내 특정 프로퍼티의 값이 변화함에 따라 연결된 View 가 변한다. (data 변화 -> view 변화) 2. 양방향 데이터 바인딩: 단방향 데이터바인딩 기능에 더해 사용자의 입력을 받을 수 있는 View(대표적으로 EditText)에 입력이 들어오거나 이미 입력된 값이 변화하면 연결된 프로퍼티의 값을 변화시킬 수 있다. [2]. 양방향 데이터 바인딩 표현식을 사용했을 때의 코드 분석 //EditText 에 입력된 값이 변화할 때 마다 해당 리스너의 onChage 메서드가 호출된..
4-1 DataBinding *개인적으로 분석한 내용이므로 틀린 내용이 있을 수 있습니다. 틀린 내용을 댓글로 남겨주시면 수정하도록 하겠습니다! DataBinding 라이브러리는 UI Component 들이 데이터 소스에 Programmatically 한 방식이 아닌 선언적 방식을 통해 결합하도록 지원하는 Jetpack 라이브러리이다. [1]. DataBinding 사용방법 *DataBinding 을 사용하는 방법은 수많은 블로그에 이미 자세히 기록되어 있기 때문에 간략히 작성하고 넘어간다. 1. gradle 파일에서 DataBinding 활성화 buildFeatures { dataBinding true } 2. layout 파일을 DataBinding 사용 형식으로 변경 내의 태그를 선언하면 DataBinding 라이브러리에 의해..
3. LiveData *개인적으로 분석한 내용이므로 틀린 내용이 있을 수 있습니다. 틀린 내용을 댓글로 남겨주시면 수정하도록 하겠습니다! [1]. LiveData 의존성 선언 dependencies { ... // LiveData implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.0-alpha02" ... } [2]. LiveData 사용방법 class MainViewModel : ViewModel() { private var _flag = MutableLiveData() /* ViewModel 클래스 외부에 노출될 LiveData 프로퍼티는 변경이 불가능한 LiveData 타입을 사용한다. */ val flag: LiveData get() = _flag /* Li..