저번 포스팅을 첨부한다. runOnUiThread에 대해서 다뤘다.
# 알게된 것
- LayoutInflater 이용하여 xml 적용
## LayoutInflater를 왜 사용했어야 했는가?
계산 할때마다 동적으로 연산식과 연산결과가 ScrollLayout에 하나씩 추가되야 했다. 기존에 존재하는 View를 사용한 것이 아니다. 내가 정의한 디자인이 계속해서 생겨야 한다는 것인데, 저렇게 빨간 네모를 친 곳이 하나의 xml파일이다. activity_main.xml와 같이 만든 건데 그게 view처럼 생성되어 ScrollLayout에 하나씩 부착이 되어야 했다.
정리해보자면, xml로 존재하는 res를 view로 만들어서 사용해야 했다.
## xml 만들기
그냥 평범하게 저 빨간 네모에 해당될 xml을 하나 만들었다. -> history_row
// history_row.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_margin="5dp"
xmlns:tools="http://schemas.android.com/tools">
주의 할점은 width나 height를 잘 생각하고 만들어야한다. 만약 둘다 match_parent했다면 history_row의 부모 layout에 가득차버리기 때문에 한개밖에 안보일 것이다.
inflate() 된 view의 layoutParams 속성은 실제 layout 에서 match_parent 라도, wrap_content 로 강제로 변경된다. (inflate 된 view는 parent 가 없어지기 때문에 강제로 wrap_content 시킨다.) 출처: https://yejinson97gaegul.tistory.com/entry/LayoutInflater란 |
라고 한다. 그래도 난 찝찝하니까 속성은 줬다.
## LayoutInflater사용하기
val historyView = LayoutInflater.from(this).inflate(R.layout.history_row,null,false)
// history_row 뷰에 대해서 findViewById로 접근
historyView.findViewById<TextView>(R.id.expressionTextView).text = it.expression
historyView.findViewById<TextView>(R.id.resultTextView).text = " = ${it.result}"
//ScrollLayout -> LinsearLayout에 추가해줌
historyLinearLayout.addView(historyView)
일단 최종 코드는 위와 같다.
val historyView = LayoutInflater.from(this).inflate(R.layout.history_row,null,false)
// LayoutInflater.from(this)을 만들어 준 후
// inflate(R.layout.history_row,null,false)로 VIEW를 생성한다고 생각하면 된다.
// inflate( "리소스(xml)" ,"root" ,"attachToRoot")
inflate()를 통해서 view를 만들어 내게 된다.
inflate( "리소스(xml)" ,"root" ,"attachToRoot")으 인자가 들어가게 되는데
- resource : xml의 파일을 정해줌
- root : 생성될 view의 부모를 명시해준다.
- true이면 root의 자식으로 추가 된다. root가 없기때문에 false로 지정했다.
이렇게하면 해당 xml에 대한 view가 생성되고, 동작에 의해 동적으로 추가해줄 수 있다.
👇 구글 공식문서
참고