본문 바로가기

개발 노트

(145)
[Android/Kotlin] 세로/가로 모드 ui 분리 구현 # 가로모드 레이아웃 생성하기 layout -> New -> Layout Resource File -> File name은 세로모드 이름과 똑같이 써주기 -> orientation -> landscape 이렇게 가로모드 생성해준뒤, 세로모드 레이아웃을 복붙해주고 가로모드에서 이상한 레이아웃들만 수정해주면 쉽게 끝난다! # 트러블 슈팅 가로모드로 전환하니깐 갑자기 앱이 종료되는 현상이 발생했다 찾아보니깐 엑티비티가 회전될때(가로->세로 / 세로->가로 전환시) onDestory되었다가 onCreate되어서 매번 새로운 UI가 그려지기 때문에, 이때 화면이 재생성되면서 앱이 강제종료 될수있는 문제가 발생한다고 한다 따라서 AndroidManifest에가서 모든 엑티비티마다 android:configChang..
[Android] Fragment간 데이터통신 방식 1. FragmentManager에 Bundle로 Data를 담아 전달 //PassBundleFragment는 본인이 전달하고자 하는 Fragment class val bundle = Bundle() bundle.putString("key", "value") val passBundleBFragment = PassBundleBFragment() passBundleBFragment.arguments = bundle parentFragmentManager.beginTransaction() .replace(R.id.fragment_container_bundle, PassBundleFragment()) .commit() -> 데이터를 전송하려는 Fragement에서 작성 override fun onCreateVi..
[Android] Fragment Lifecycle 프래그먼트를 사용하면 화면하나를, 독립적으로 작동하는 부분화면 여러개로 구현할 수 있다 프레그먼트는 엑티비티처럼 레이아웃을 표시하고, 생명주기를 가지며 입력 이벤트를 받을 수 있다 하지만 독립적으로는 존재할 수 없고, 해당 프래그먼트를 관리하는 호스트 액티비티나 프래그먼트 하위에서만 존재할 수 있다 엑티비티는 안드로이드 4대 컴포넌트 중 하나로 안드로이드 시스템에서 관리하지만, 프레그먼트는 안드로이드 시스템이 직접 관리하지 않고 FragmentManager가 관리하기 때문에 엑티비티보다 메모리 리소스가 상대적으로 덜 소모된다. 또한 한번 작성된 프레그먼트는 여러 액티비티에서 재사용이 가능하며, 따라서 UI 구현에 필요한 작업량을 감소시킬 수 있다 # 프래그먼트 수명 주기 상태 및 콜백 -> 그림을 보면 ..
[Android] Activity Stack 및 backStack 각 앱마다 원하는 화면흐름이 있기 때문에 태스크 및 백스택 관리를 해야하는 경우가 발생한다이번시간에는 이런 태스크 및 백스택 관리에 대해 정리해볼것이다 실행된 엑티비티들은 기본적으로 task라는 곳에 존재하게 된다task는 사용자와 상호작용하는 엑티비티들을 묶어놓은 모음이다예를 들어 이메일앱에는 새 메시지 목록을 표시하는 활동이 있을 수 있는데, 사용자가 메시지를 클릭하면 해당 메시지를 볼 수 있는 새 활동이 열린다. 그러면 이 새 활동은 백스택에 추가되고, 사용자가 뒤로탭하는 동작을 취하면 새 활동이 종료되고 스택에서 사라지는 걸 볼 수 있다.  # 백스택이란?실행된 엑티비티의 인스턴스들은 자료구조의 Stack구조로 저장되어 태스크에 속하게 되는데, 안드로이드 시스템에서는 이 스택을 Back Stack..
버튼 눌렀을때 Fragment화면 나타내기 안드로이드에서는 화면을 바꾸는 방법이 두가지가 있는데 첫번째는 새로운 엑티비티를 띄우는 방식, 두번째는 엑티비티의 일부만 바꾸는 방식(프레그먼트를 통해) 이렇게 두가지가 있다 오늘은 두번째방식인 버튼을 눌렀을때 프레그먼트를 통해 엑티비티의 일부를 바꿔보는 방법을 기록해보려고 한다 일단 버튼을 만들어주고, 프레그먼트가 들어갈부분을 FrameLayout으로 만들어준다 디자인을 보면 FrameLayout부분이 이렇게 공간을 차지하고있는것을 볼수있다. 이부분에 프레그먼트를 넣어줄것이다 activity_main.xml 이제 새로운 프레그먼트를 만들어준다. 뷰바인딩을 사용해서 바인딩만 미리 설정해줬고, 디자인은 텍스트뷰만 추가해줬다 class DonutListFragment : Fragment() { lateini..
코틀린의 ViewBinding과 DataBinding # ViewBinding과 DataBinding 사용하는 이유 XML 레이아웃 파일을 만들고, 이 레이아웃을 코드에서 findViewById를 사용해서 연결해주는데 findViewById를 계속 쓰게되면 코드도 복잡해지고 유지보수도 어려워질 수 있는 문제가 발생한다 이러한 문제를 해결하기위해 ViewBinding과 DataBinding이 나왔는데 이를 사용하면 매번 findViewById를 사용하지 않고 바로 바인딩할 수 있어서 가독성이 좋고, 유지보수가 쉽다 ViewBinding과 DataBinding은 이런점에서 공통점을 가지지만 선언방식, 코드작성방식 등에서 차이가 있다 항상 ViewBinding과 DataBinding 쓸때마다 조금 헷갈려서 정리를 해보려고한다 # findViewById와의 차이..
[Android] 엑티비티 생명주기(Activity Life Cycle) 생명주기의 사전적 정의를 살펴보면 "어떤것이 태어나고 죽기까지의 기간"을 말한다고 나와있다 사람으로 예를들어보면, 사람은 태어나고 죽기까지의 생명주기를 가지며 이 생명주기동안 사람은 어린아이에서 어른이, 어른에서 노인이되는 과정을 거치게된다 그런데 안드로이드의 Activity도 이렇게 생성되고 소멸되기까지의 생명주기를 가지고있다 이런과정은 여러함수들로 구성이 되어있는데 이런 함수들을 총칭해서 Activity 생명주기라고 부른다 그래서 이런 Activity 생명주기를 사용하면 프로그램을 더욱 안정적으로 구현할수있게된다 먼저 이런 Activity 생명주기를 왜 사용해야되는지 예를 들어서 설명해보면 휴대폰으로 게임을하고있는 도중에 전화가 왔다고 해보자 그러면 보통 게임이 일시정지가 되고, 전화를 마치게되면 다..
프로그래밍 기초 과제 - 계산기 - 필수구현 기능 - 선택 구현 기능 LV4까지 진행해주었다 먼저 추상클래스를 만들어서 클래스를 추상화해준다 추상화는 클래스의 이름과 클래스 안에 있음직한 기능을 유추해서 메서드 이름으로만 먼저 나열하는것이다 그런다음 추상클래스를 상속받은 클래스에서는 오버라이딩을 통해 구현해줘야한다!! // 추상메소드로 만들기 abstract class AbstractOperation { abstract fun calculator(x: Int, y: Int) : Int } AbstractOperation.kt abstract 키워드를 사용해서 추상화를 시켜줬고, 입력값과 반환값이 Int인 간단한 추상메소드를 만들었다 class AddAbstractOperation: AbstractOperation() { override..
프로그래머스 알고리즘 문제[나누어 떨어지는 숫자] # 문제 array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요. # 제한사항 arr은 자연수를 담은 배열입니다. 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다. divisor는 자연수입니다. array는 길이 1 이상인 배열입니다. # 입출력 예 입출력 예#1 arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다. 입출력 예#2 arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다. 입출력 예..
프로그래머스 알고리즘 문제[서울에서 김서방 찾기] # 문제 String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다. # 제한사항 seoul은 길이 1 이상, 1000 이하인 배열입니다. seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다. "Kim"은 반드시 seoul 안에 포함되어 있습니다. # 입출력 예 ex) seoul = ["Jane", "Kim"] / return = "김서방은 1에 있다" # 풀이 class Solution { fun solution(seoul: Array): String { var answer = "" for(i in 0....