Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin으로 Android GridView 스크롤 비활성화하는 방법 완벽 가이드

이 튜토리얼에서는 Kotlin을 사용하여 Android 앱에서 GridView의 스크롤을 비활성화하는 방법을 단계별로 알아봅니다. 핵심 원리는 setOnTouchListener를 활용해 터치 이동(ACTION_MOVE) 이벤트를 가로채는 것입니다.

1단계: 새 프로젝트 생성

Android Studio를 열고 File → New Project 메뉴로 이동한 뒤, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다. 언어는 Kotlin으로 선택해 주세요.

2단계: 레이아웃 파일 작성 (activity_main.xml)

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="8dp"
    tools:context=".MainActivity">

    <GridView
        android:id="@+id/gridLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

3단계: MainActivity.kt 구현

src/MainActivity.kt 파일에 다음 코드를 작성합니다. 여기서 스크롤을 막는 핵심은 setOnTouchListener 부분입니다. 터치가 움직일 때(MotionEvent.ACTION_MOVE) true를 반환하여 이벤트를 소비함으로써 GridView가 스크롤되지 않도록 처리합니다.

import android.content.Context
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var gridView: GridView

    var imageIDs = arrayOf(
        R.drawable.ronaldo,
        R.drawable.andre,
        R.drawable.bernado,
        R.drawable.carvalho,
        R.drawable.bruno,
        R.drawable.patricio,
        R.drawable.pepe,
        R.drawable.felix,
        R.drawable.semedo,
        R.drawable.ronaldo
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        gridView = findViewById(R.id.gridLayout)
        gridView.numColumns = 3
        gridView.adapter = ImageAdapterGridView(this)

        // 터치 이동 이벤트를 가로채서 스크롤 비활성화
        gridView.setOnTouchListener { _, event ->
            Toast.makeText(
                this@MainActivity,
                "스크롤이 비활성화되었습니다",
                Toast.LENGTH_SHORT
            ).show()
            event.action === MotionEvent.ACTION_MOVE
        }
    }

    inner class ImageAdapterGridView internal constructor(c: Context) : BaseAdapter() {

        private val context: Context = c

        override fun getCount(): Int {
            return imageIDs.size
        }

        override fun getItem(position: Int): Any? {
            return null
        }

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

        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
            val imageView: ImageView
            if (convertView == null) {
                imageView = ImageView(context)
                imageView.layoutParams = AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT
                )
                imageView.scaleType = ImageView.ScaleType.CENTER_CROP
                imageView.setPadding(30, 30, 30, 30)
            } else {
                imageView = convertView as ImageView
            }
            imageView.setImageResource(imageIDs[position])
            return imageView
        }
    }
}

동작 원리 설명

setOnTouchListener 내부에서 event.action === MotionEvent.ACTION_MOVE 조건은 손가락이 화면 위에서 움직이는 동안 true를 반환합니다. 리스너가 true를 반환하면 해당 터치 이벤트가 소비(consume)되어 GridView의 기본 스크롤 동작이 실행되지 않습니다. 또한 터치할 때마다 토스트 메시지로 "스크롤이 비활성화되었습니다"라는 안내를 표시하므로, 사용자에게 현재 상태를 명확히 알려줄 수 있습니다.

4단계: AndroidManifest.xml 확인

androidManifest.xml에 아래와 같이 MainActivity가 정상적으로 등록되어 있는지 확인합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q11">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 상단 툴바의 Run(실행) 아이콘을 클릭합니다.

Kotlin으로 Android GridView 스크롤 비활성화하는 방법 완벽 가이드

실행 옵션 목록에서 연결된 모바일 기기를 선택하면, 기기 화면에 앱이 실행됩니다. GridView에 이미지들이 3열로 배치되어 나타나며, 화면을 드래그해도 스크롤되지 않고 토스트 메시지만 표시되는 것을 확인할 수 있습니다.

Kotlin으로 Android GridView 스크롤 비활성화하는 방법 완벽 가이드

마무리

이처럼 setOnTouchListener에서 ACTION_MOVE 이벤트를 가로채는 간단한 방법만으로도 GridView의 스크롤을 손쉽게 비활성화할 수 있습니다. ScrollView 안에 GridView를 넣어야 하는 상황이나, 고정된 그리드 화면을 만들어야 할 때 유용하게 활용할 수 있습니다.