id : View를 지칭하기 위해서 사용하는 이름한 화면에서 같은 id가 있으면 안된다.
layout_width : 가로 길이. (wrap_content or match_parent or dp 단위의 크기)
layout_height : 세로 길이 (wrap_content or match_parent or dp 단위의 크기)
wrap_content : 자기 자신을 완벽하게 보여줄 수 있는 최소의 크기. 공간이 부족할 경우 화면에서 짤린다.
match_parent : 부모의 크기에 꽉 채워준다. 공간이 부족할 경우 계속 축소된다.
padding : 내부의 여백
layout_margin : 외부의 여백
layout_gravity : layout 내에서 자신의 정렬 위치
LinearLayout의 주요 속성
LinearLayout에 배치되는 View의 주요 속성


레이아웃 상에 버튼이 2개가 배치되어있지만 겹쳐있어 한 개만 있는 것 처럼 보인다.
layout_margin 속성을 설정하여 위치를 변경할 수 있다.


layout_gravity로 위치를 잡고 layout_margin으로 여백을 주어 좌측 하단에 띄워줄 수도 있다.


추후 게시판 미니프로젝트할때 많이 쓸 예정
Constraint 이전에는 RelativeLayout(Legacy임)을 많이 사용했었음
View의 부모 또는 다른 View들과의 관계를 나타내는 제약 조건을 설정하여 View를 원하는 곳에 배치함
ConstraintLayout에 배치되는 View의 주요 속성
버튼을 하나 생성하여 화면 가운데에 배치해도

실제로 실행을 해보면 왼쪽상단에 배치된 것처럼 보여짐

실제로 위치를 잡고자 한다면 요소 선택할때 보여지는 동그라미 부분을 원하는 위치대로 드래그해주면 된다.



절대적 길이와 상대적 길이를 아래와 같이 직접 설정 가능하다.


제약 조건은 선으로 표시된다.
직선 : 절대적 길이, 물리적인 액정 사이즈에 관계없이 고정된 길이
지그재그선 : 상대적 길이, 물리적인 액정 사이즈에 따라 변화되는 길이
뷰를 가운데에 배치하고 싶다면 절대적 길이보다는 상대적 길이로 셋팅
절대적 길이로 가운데를 배치하게 될경우 스마트폰 사이즈에따라 가운데가 아니게될 수도 있다.

뷰와 뷰와의 관계를 설정해주면

뷰를 옮길때 같이 위치가 변경된다
요소의 가로길이를 빈칸을 꽉 채우고 싶을때



layout_width를 0dp(match constraint)로 설정해주면

빈칸 없이 가로길이가 꽉 채워짐
버튼 두개를 동일한 가로 비율로 설정하고 싶을 경우

각 버튼을 왼쪽 오른쪽으로 제한을 걸어준 후에

왼쪽 버튼의 오른쪽 제약을 오른쪽 버튼에 걸어주고

오른쪽 버튼도 왼쪽 제약을 추가해주면 자동으로 왼쪽 버튼에 제약이 걸어진다

layout_width값을 두 버튼 모두 0으로 설정해주면

동일한 비율로 버튼 길이가 셋팅이 된다.

A ~ G : 테마 x
H ~ I : Holo 테마
...
Material 테마 등장
Material 2
Material 3(현재) https://m3.material.io/
package kr.co.lion.android08_button
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.View.OnClickListener
import kr.co.lion.android08_button.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.apply {
// 버튼
button.apply {
// 버튼에 표시될 문자열
text = "새로운 문자열"
// 리스너 객체를 생성한다.
val buttonClickListener = ButtonClickListener()
// 버튼을 눌렀을 때 동작할 리스너를 설정한다.
setOnClickListener(buttonClickListener)
}
button2.apply {
// 보통 다수의 뷰가 하나의 리스너를 사용하는 경우는 별로 없다.
// 작성한 리스너가 하나의 뷰에 대한 리스너라면 익명중첩클래스를 사용하기도 한다.
setOnClickListener(object : OnClickListener{
override fun onClick(p0: View?) {
textView.apply {
text = "두 번째 버튼을 눌렀습니다."
}
}
})
}
button3.apply {
// 코틀린으로 작업하는 경우
// 구현해야할 메서드가 하나밖에 없는 리스너에 대해서는
// 고차함수도 제공하고 있다. (자바에는 없다)
setOnClickListener {
textView.apply {
text = "세 번째 버튼을 눌렀습니다."
}
}
}
}
}
// 버튼을 눌렀을 때 동작할 리스너
inner class ButtonClickListener : OnClickListener{
// 버튼을 눌렀을 때 호출되는 메서드
override fun onClick(p0: View?) {
activityMainBinding.apply {
textView.apply {
text = "첫 번째 버튼을 눌렀습니다."
}
}
}
}
}



※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스