Android 앱개발 공부/TIL(Today I Learned)

[Android] TIL 32일차 - 2

bunny code 2024. 7. 9. 19:47

뷰 바인딩(View Binding)


- 뷰 바인딩은 findViewById 기능을 대체

- 뷰 바인딩을 사용하기 위해선 시작 전에 셋팅을 미리 해둬야 함

 

* View Binding과 findViewById 차이

- NullSafe : 파인드뷰와 달리 참조되는 걸 자동으로 가져옴, 직접 ID를 치지 않아서 널 포인터 예외 발생 위험이 없음

- Type Safety : 타입도 선언하지 않아도 되어서 예외 발생 위험이 없음

 

* gradle(module : app) 셋팅 (android 내부에 작성)

buildFeatures{
        viewBinding = true
    }

 

* 뷰 바인딩을 사용하는 Activity 셋팅

class MainActivity : AppCompatActivity() {
	//1번
    	private lateinit var binding : ActivityMainBinding
...
	override fun onCreate(savedInstanceState: Bundle?) {
        ...
        //2, 3번
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
	//이건 작성되어있긴한데 아이디를 불러오는 형식으로 되어있음
        setContentView(view)
        }
}

 

 

 

어댑터 뷰(Adapter View)


- 어댑터 뷰는 여러 개의 항목을 다양한 형식으로 나열하고 선택 할 수 있는 기능을 제공

- 어댑터 뷰 종류로는 리스트 뷰와 그리드 뷰가 있음

- 어댑터 뷰들은 모두 setOnClickListener 사용이 가능함

 

* 어댑터 뷰의 구조

구조 : 어댑터 뷰 <-> 어댑터 -> 데이터 원본

-> 어댑터는 데이터 원본을 받아오고, 어댑터 뷰는 어댑터로부터 받아오는 방식

 

어댑터 종류 : BaseAdapter, ArrayAdapter, CursorAdapter, SimpleAdapter가 존재

 

* 리스트 뷰(ListView) : 항목을 수직으로 나열시키는 방식

* 그리드 뷰(GridView) : 항목을 격자 형태로 나열시키는 방식

 

* 그리드 뷰 주요 속성

  • android:columnWidth=“100dp” : 그리드 항목 하나의 폭을 100dp로 설정
  • android:numColumns=“auto_fit”: 열의 폭과 화면 폭을 바탕으로 자동 계산
  • android:verticalSpacing: 항목 간의 간격 설정
  • android:stretchMode=“columnWidth”: 열 내부의 여백을 폭에 맞게 채움

(리스트, 그리드 뷰 둘이 코드 자체는 비슷)

- 그리드 뷰에서 텍스트가 아닌 이미지를 사용할 경우 클래스를 따로 만든 후 BaseAdapter를 상속받아서 작성함

 

* ImageAdapter 코드 내용

class ImageAdapter : BaseAdapter() {
    override fun getCount(): Int {
        return mThumbIds.size
    }

    override fun getItem(position: Int): Any {
        return mThumbIds[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val imageView: ImageView
        if (convertView == null) {
            imageView = ImageView(parent!!.context)
            //레이아웃의 크기 지정
            imageView.layoutParams = AbsListView.LayoutParams(200, 200)
            imageView.scaleType = ImageView.ScaleType.CENTER_CROP
            imageView.setPadding(8, 8, 8, 8)
        } else {
            imageView = convertView as ImageView
        }
        //mThumbIds에 저장된 사진 리소스를 가져옴
        imageView.setImageResource(mThumbIds.get(position))
        return imageView
    }

    private val mThumbIds = arrayOf<Int>(
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7,
        R.drawable.sample_0, R.drawable.sample_1,
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7,
        R.drawable.sample_0, R.drawable.sample_1,
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7
    )
}

'Android 앱개발 공부 > TIL(Today I Learned)' 카테고리의 다른 글

[Android] TIL 34일차  (0) 2024.07.11
[Android] TIL 33일차  (0) 2024.07.10
[Android] TIL 32일차  (0) 2024.07.09
[Android] TIL 31일차  (0) 2024.07.08
[Android] TIL 30일차  (0) 2024.07.05