개발 노트/Kotlin (102) 썸네일형 리스트형 [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.. 버튼에 elevation 속성값을 지정했음에도 그림자가 안보일때 나는 이런식으로 버튼을 디자인했고, Register버튼에 그림자값을 적용해주고싶었다 그래서 elevation값을 적용했는데도 그림자 적용이 안됐다!!ㅜㅜㅜ 찾아보니깐 그림자가 생길공간이 없는 경우에 적용이 안된다고 한다 그림자 생길공간이 없었기 때문에 padding값을 8정도로줘서 공간을 만들어줬다 근데 이런식으로해도 아직도 안됐다... 부모 컴포넌트의 padding을 적용해줬기때문에 이에 의해서 그림자가 잘리는경우가 발생한다고한다 부모 컴포넌트에 android:clipToPadding="false" 이값을 적용해주면 잘 적용이되는것을 확인할 수 있다 정리해보면 elevation을 적용했는데도 그림자가 적용이 안된다면?? 1. 배경색이 있는지 확인!! 2. 그림자가 생길 공간이 있는지 확인!! 3. 부모.. ConstraintLayout - chain, bias ConstraintLayout으로 레이아웃을 그릴때 다양한 방법이 있는데 Chain과 Bias위주로 살펴볼것이다 1. Chain 크게 이렇게 두개로 나눌수있다 - layout_constraintHorizontal_chainStyle : 수평 방향 체인 스타일 결정 - layout_constraintVertical_chainStyle : 수직 방향 체인 스타일 결정 체인은 spread / spread inside / packed 유형으로 나눌 수 있다. 체인 헤드부분에만 체인속성을 적용하면 된다! 각 속성의 차이를 알아보자 # layout_constraintHorizontal_chainStyle = "spread" -> 각각의 뷰를 균등하게 분산 android:id="@+id/google" android:.. 이전 1 2 3 4 5 6 7 8 ··· 11 다음