[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 |