[Android/Kotlin] 자동으로 넘어가는 배너 만들기

2023. 1. 29. 09:57교내활동/Programming GURU2

반응형

Viewpager2를 이용해 여기저기 서치해서 자동으로 넘어가는 배너를 만들었다.

 

이 배너는 Fragment에서 작동하는 배너이다.

이놈의 배너 만들려고 2~3일을 서치를 하면서 해봤는데 제대로 작동된게 하나도 없었다..

근데 막판에 가서 만들었다가 제대로 돌아갔다.

 

<ViewPager2 Adpater>

import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView

class ViewpagerAdapter (var adImgArray : ArrayList<Int>):
        RecyclerView.Adapter<ViewpagerAdapter.PagerViewHolder>() {

	// 배너 넣을 자리
    inner class PagerViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder
        (LayoutInflater.from(parent.context).inflate(R.layout.viewpager_adbanner, parent, false)) {
            val adBanner = itemView.findViewById<ImageView>(R.id.ad_img)
        }
	
    // 근데 이 함수는 무슨역할일까
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PagerViewHolder((parent))
	
    // 돌릴 배너 array의 사이즈를 가지고 오는 함수
    override fun getItemCount(): Int = adImgArray.size
	
    // 어떤 이미지가 들어가있을지 결정해주는 함수?
    override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
        holder.adBanner.setImageResource(adImgArray[position])
    }
}

<fragment_home.xml>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:visibility="visible">
    
    <androidx.viewpager2.widget.ViewPager2
                    android:id="@+id/adView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />


</LinearLayout>

<viewpager.xml>

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ImageView
        android:id="@+id/ad_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ad_banner1"/>


</androidx.constraintlayout.widget.ConstraintLayout>

<배너가 돌아갈 Fagment>

class HomeFragment : Fragment() {

    // 자동 배너를 위한 변수들
    lateinit var viewPagerAd : ViewPager2  // viewpager2이용할 예정 -> 배너 이미지들 삽입
    var currentPosition = 0  // page 수 확인을 통해 다시 처음으로 돌아가도록 함
    
    // 페이지를 확인하고 계속해서 돌아갈 수 있도록 확인해주는 handler ...?
    val handler = Handler(Looper.getMainLooper()) {
        setPage()
        true
    }


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
		
        // activity에서만 사용 가능한 메소드를 사용하기 위해 액티비티를 불러옴
        val view = inflater.inflate(R.layout.fragment_home, container, false)
        val hActivity = activity as HomeActivity


        // 배너광고
        // fragment 전환 후 다시 돌아오는 경우 슬라이드 배너가 좀더 빠르게 혹은 랜덤으로 넘어가버림
        // thread가 제대로 적용되지 않는 것으로 보임
        // 어떻게 해결해야할까?
        viewPagerAd = view.findViewById(R.id.adView)
        viewPagerAd.adapter = ViewpagerAdapter(getAdBanners())
        viewPagerAd.orientation = ViewPager2.ORIENTATION_HORIZONTAL
        var thread = Thread(PagerRunnable())
        thread.start()
        
   }

    // 배너 이미지가 들어간 array를 만드는 함수
    private fun getAdBanners() : ArrayList<Int> {
        return arrayListOf<Int> (
            R.drawable.ad_banner1,
            R.drawable.ad_banner2
                )
    }
    // 페이지가 2페이지가 되면 다시 처음으로 돌아가서 배너를 돌리도록 함
    fun setPage() {
        if(currentPosition == 2) currentPosition = 0
        viewPagerAd.setCurrentItem(currentPosition, true)
        currentPosition += 1
    }
    // 자동으로 배너 넘기기
    inner class PagerRunnable : Runnable {
        override fun run() {
            while (true) {
                try {
                    Thread.sleep(3000)
                    handler.sendEmptyMessage(0)
                } catch (e: InterruptedException) {
                    Log.d("interupt", "interupt발생")
                }
            }
        }
    }

}

 

다만 문제는 첫번째에서 두번째 페이지로 넘어가고 두번째에서 다시 첫번째로 넘어올 때 똑같이 2초를 쉬어야 하는데 쉬지를 않는다. 왤까? 이 부분을 해결하지 못한 점이 좀 아쉽다.

 

반응형

'교내활동 > Programming GURU2' 카테고리의 다른 글

[Android/Kotlin] DB 정보 가져오기  (1) 2023.01.29
[Android/Kotlin] 버튼누르면 뜨는 Dialog 만들기  (0) 2023.01.29
Android Kotlin Fragment  (0) 2023.01.17
Android Kotlin Service  (0) 2023.01.17
Android DB 기초  (0) 2023.01.17