Android LinearLayout
업데이트:
카테고리: Android
/태그: Data Binding, Data Class, EditText, Google Develop, KeyBoard, LinearLayout, ScrollView, style, visibility
무엇을 배우는가
View
와ViewGroup
이 어떻게 동작하는지ScrollView
을 사용해서 스크롤 가능한 콘텐츠 만들기View
을 어떻게 바꾸는지
1. TextView
Resource로 만들어 관리
xml
파일에 code
탭에서는 해당 리소스 왼쪽 💡버튼의 Extract Resource를 통해서 만들 수 있다.
또는 design
탭에 해당 속성 오른쪽에 |
을 클릭해 나온창 왼쪽 상단에 +으로 리소스를 만들 수 있다.
style 지정
해당 요소가 가지고 있는 CSS를 스타일로 저장한다.
Design
탭에 Component Tree에 있는 요소를 우클릭해 Refator > Extract Style
을 클릭한다.
그럼 하나의 창이 뜨게되고 원하는 스타일 속성만 체크하여 이름을 지정해 저장하면 코드가 깔끔해져 있다.
해당 스타일은 res/values/style.xml
에 들어있다.
2. ImageView
ImageView
에는 이미지를 보여줄 수 있는 요소이다.
PNG, JPG, GIF, WebP file인 Bitmap
을 보여주거나 Drawable
의 리소스를 보여줄 수 있다.
이미지를 추가하게 되면 ⚠️가 뜨는데 그 이유는 이미지 설명, contentDescription
이 존재하지 않기 때문이다.
3. ScrollView
내부에 배치된 계층 구조를 스크롤할 수 있도록 하는 ViewGroup이다.
ScrollView는 하나의 View 또는 ViewGroup만 넣을 수 있다.
하위 보기는 일반적으로 LinearLayout
을 사용한다.
4. EditText
Design탭에 Plain Text
를 넣거나 <EditText/>
를 작성한다.
inputType
유저가 입력할 수 있는 타입을 제한한다.
password
로 지정하면 입력된 값이 안보이게 처리되고 phone
으로 지정하면 전화패드의 숫자가 보이게 된다.
5. TextView Visible
TextView에 visibility
옵션은 앱을 사용하는 동안 보이거나 숨기거나 할 수 있다.
visible
: 보이게 한다.Invisible
: 안보이게 한다. 하지만 레이아웃에 공간은 차지한다.gone
: 보이지도 않으며 레이아웃을 차지하지도 않는다.
6. 클릭시 닉네임 변경
private fun addNickName(view: View) {
val editText = findViewById<EditText>(R.id.nickname_edit)
val nicknameTextView = findViewById<TextView>(R.id.nickname_text)
nicknameTextView.text = editText.text
editText.visibility = View.GONE
nicknameTextView.visibility = View.VISIBLE
}
editText
에 있는 값을 가져와 textView
에 넣어준다.
이후 editText
는 안보이게 textView
는 보이게 바꾼다.
7. 입력완료 후 키보드 숨기기
val inputMethodMananger = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodMananger.hideSoftInputFromWindow(view.windowToken, 0)
keyboard는 ‘Soft KeyBorad’ 와 ‘Hardware KeyBoard’로 구분한다.
Soft Keyboard는 화면에 나오는 가상의 키보드로 InputMethodManager
로 제어가 가능하다.
hideSoftInputFromWindow
를 통해서 가상 키보드를 숨길 수 있고
showSoftInput
으로 특정한 요소 클릭 시 키보드를 나오게 할 수 있다.
8. Data Binding
- DataBinding 초기설정
build.gradle(Module:app)
에buildFeatures { dataBinding true }
을 설정한다.
activity.xml
에 최외각에layout
으로 감싸준다.<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <LinearLayout>...</LinearLayout> </layout>
MainActivity
상단에private lateinit var binding: ActivityMainBinding
을 입력한다.binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
을 setContentView 대신 작성한다.- findViewById 대신 binding을 활용하여 사용할 수 있다.
private fun addNickName(view: View) {
binding.nicknameText.text = binding.nicknameEdit.text
binding.nicknameEdit.visibility = View.GONE
binding.nicknameText.visibility = View.VISIBLE
binding.doneButton.visibility = view.visibility
// binding.apply {
// nicknameText.text = nicknameEdit.text.toString()
// nicknameEdit.visibility = View.GONE
// doneButton.visibility = View.GONE
// nicknameText.visibility = View.VISIBLE
// }
}
binding.id
로도 사용할 수 있고 여러개를 사용할 때는 binding.apply
를 이용해 여러개의 요소에 적용할 수 있다.
장점
findViewById()
의 비효율성을 개선해 앱의 성능이 향상된다.- 코드가 간결해져 가독성이 좋아지고, 유지보수가 쉬워진다.
- binding된 변수들을 자동으로 업데이트 해준다.
- complie시 실행되기 때문에 error를 쉽게 알 수 있다.
- MVVM 아키텍쳐의 viewModel과 사용하기 좋다.
data Class 연결
<layout>
<data>
<variable
name="myName"
type="ko.cheonsohee.layoutapp.MyName" />
</data>
<LinearLayout>
variable안에는 name과 type이 존재하는데
name
은 해당 데이터를 부를 변수 이름이고
type
은 해당 데이터의 타입으로 Boolean
, String
, Float
도 가능하지만 유저가 설정한 data Class
로도 설정이 가능하다.
이때는 해당 클래스가 작성된 경로를 넣어주면 된다.
이렇게 작성후 xml
파일에서 @={변수이름}
의 형식으로 사용할 수 있다.
myName?.nickname = nicknameEdit.text.toString()
invalidateAll()
변경된 후에는 적용시켜주기 위해 invalidateAll()
을 사용해야된다.
이런식으로 사용하면 해당 요소의 값을 직접바꾸는게 아니라 연결된 데이터의 값을 바꾸기 때문에 여러개가 연결되있는 경우 편리하게 바꿀 수 있다.