본문 바로가기

내일배움캠프

본 캠프 31일 차(ViewBinding)

ViewBinding

  • findviewbyid 를 대신하고 좀 더 쉽게 작성 할 수 있게 해주는 것
  • 모듈에 있는 각 xml 레이아웃 파일의 결합 클래스를 생성
  • findviewbyid 와 다르게 null과 타입에 안전성이 있다. 

ViewBinding 설정하는 방법

강의 영상만 보고

android {
	viewBinding {
    		enabled = true
    }
}

이게 왜 안되나 하고 계속 찾아봐도 못 찾겠고 저기서 그냥 enabled에서 d만 빼고 enable = true로 해보니 이제야 정상적으로 sync now가 되었다.

android {
	viewBinding{
        	enable = true
    }
}

근데 조금 뒤 강의에서 저거 대신 buildFeatures를 넣는게 보였다.

android {
	buildFeatures {
    		viewBinding = true
    }
}

이거도 똑같이 적용이 되었다.

이후에 바인딩을 적용할 액티비티에 코드를 이렇게 추가 하면 된다.

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding   // 지연초기화로 메인액티비티 바인딩 선언

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)   
        val view = binding.root            //onCreate 밑에 이렇게 두줄 생성 

        setContentView(view)         // 원래 R.layout.activity_main이었던것을 위에 만든 뷰 넣기 
    }
}

지연 초기화가 lateinit말고 by lazy{} 도 있으므로 이거도 사용가능했다. 

class MainActivity : AppCompatActivity() {
	//지연초기화를 이번엔 뷰가 변하지 않는다는 가정하에 이렇게 만드는것도 가능할거 같아서 해본것.
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }   

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState) 
    //위에 쓰던 binding =... 이부분을 뺄 수 있다.
	// 원래 R.layout.activity_main이었던 곳에 binding.root를 넣으면 된다. 
        setContentView(binding.root)         
    }
}

Listview와 Gridview

우선 간단한 리스트뷰 코드이다.

class MainActivity2 : AppCompatActivity() {

    private lateinit var biding : ActivityMain2Binding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

//      biding = ActivityMain2Binding.inflate(layoutInflater)
        setContentView(binding.root)

        //데이터 원본
        val items = arrayOf<String?>("item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6",  "item7", "item8")
        //어댑터
        val adapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,items)
        //simple_list들은 안드로이드 스튜디오에서 제공하는 리스트 샘플 양식이다.

        binding.listView.adapter = adapter
    }
}

따로 만들어 보면 좋겠지만 우선 안드로이드 스튜디오에서 제공하는 샘플 리스트를 사용해보았다.

아이템을 더 추가하면 스크롤도 된다.

 

다음은 그리드리스트뷰이다.

class MainActivity3 : AppCompatActivity() {

    private lateinit var binding : ActivityMain3Binding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMain3Binding.inflate(layoutInflater)
        setContentView(binding.root)

        //데이터 원본
        val items = arrayOf<String?>("item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6",  "item7", "item8")
        //어댑터
        val adapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,items)
        //어댑터를 gridview 객체에 연결
        binding.gridView.adapter = adapter


    }
}

리스트뷰는 리스트뷰 아이디(넣어도 되고 안넣어도 되고), 그리고 위치만 지정해 주면 되었는데 그리드뷰는 설정할 것들이 좀 있었다.

이렇게 칸칸이 나오게 되는 그리드 뷰에서 설정을 좀 바꾸어 보았다.

column width 라는 속성으로 칸 너비를 조절할 수 있었는데 위에는 100dp 아래는 150dp로 실행 시킨 모습이다.

다음 속성은 numColumns이다. 우선 auto fit으로 되어있는데 이는 사용 가능한 공간에 자동으로 칸의 갯수가 정해지는 것이다. 그래서 분명 칸의 너비가 150dp 일때 저렇게 행으로 2칸씩 나온 버튼들을 numColumns를 3으로 바꾸고 실행 시켜보았다.

칸 너비보다 행 마다 3개씩 놓는게 더 우선적으로 나오는걸 볼 수 있었다. 근데 아무리봐도 주로 auto fit을 주로 쓸 거 같다. 자동이 좋...

그리고 stretchMode는 위에 numColumns를 auto fit으로 했을 때 남는 좌우 공간을 어떻게 할지 정하는 거라고 한다.

spacingWidthUniform 은 칸 마다 가운데 정렬하는 느낌이다. columnWidth로 바꿔보니 칸마다 좌측으로 옮겨졌다.

다른거도 좀 있긴 했는데 좀 애매한거 같다.

verticalSpacing 과 horizontalSpacing 라는 속성으로 각각 수직과 수평으로 칸의 너비를 조절 할 수 있었다. 

gridview 속성

  • verticalSpacing 과 horizontalSpacing 라는 속성으로 각각 수직과 수평으로 칸의 너비를 조절 
  • stretchMode는 spacingWidthUniform로 했을 때 가운데 정렬, columnWidth로 바꾸면 칸마다 좌측으로 옮겨짐
  • column width 속성으로 칸 너비를 조절. 근데 보통 1~8 처럼 숫자로 쓰는거 보단 auto_fit 으로 설정하는게 좋아보임

 

저번 과제를 하면서 view 바인딩을 쓰지 말라고 했지만 우선 sync now 하는거에서 막히는 바람에 해보지 못했는데 이번 주 강의도 재밌을 거 같다.

'내일배움캠프' 카테고리의 다른 글

본 캠프 33일 차(Fragment,액티비티와 프래그먼트 데이터 전달)  (1) 2024.01.05
본 캠프 32일차  (0) 2024.01.04
본 캠프 30일 차  (1) 2024.01.02
본 캠프 29일 차  (1) 2023.12.29
본 캠프 28일 차  (1) 2023.12.28