這是我的第一個問題,所以希望我不會出錯或寫錯細節。我最近開始使用 Android Studio,目前我正在做一個簡單的測驗。我按照教程使用了視圖尋呼機并創建了 ViewPagerAdapter Kotlin 檔案。視圖尋呼機有一個 ID 為“R.id.currentLvl”的 ImageButton。現在,每當我嘗試通過 findviewbyid 在 MainActivity 中訪問此 id 時,應用程式在啟動時崩潰并給出空指標錯誤。這是 MainActivity 的代碼:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val images = listOf(
R.drawable.coffee_placeholder,
R.drawable.coffee_placeholder,
R.drawable.coffee_placeholder
)
val adapter = ViewPagerAdapter(images)
findViewById<ViewPager2>(R.id.viewPager).adapter = adapter
findViewById<ImageButton>(R.id.currentLvl).setOnClickListener{
Toast.makeText(applicationContext, "hi", Toast.LENGTH_SHORT).show()
}
}
}
這是配接器:
class ViewPagerAdapter(
val images: List<Int>
) : RecyclerView.Adapter<ViewPagerAdapter.ViewPagerViewHolder>() { 內部類 ViewPagerViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewPagerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.viewpager_quizlvls, parent, false)
return ViewPagerViewHolder(view)
}
override fun onBindViewHolder(holder: ViewPagerViewHolder, position: Int) {
val currentImage = images[position]
holder.itemView.findViewById<ImageButton>(R.id.currentLvl).setImageResource(currentImage)
}
override fun getItemCount(): Int {
return images.size
}
}
如果我的問題措辭錯誤,簡短的版本是如何收聽這個 ImageButton?我在配接器或主要活動中有它的監聽器嗎?
uj5u.com熱心網友回復:
您應該在 ViewHolder 類中處理此問題。例如,假設您的 ViewHolder 是ViewPagerViewHolder在 init 中執行的重要操作,因此您無需在每個系結中設定 OnClickListener。
應該這樣定義:
class ViewPagerViewHolder(
private val itemView: View,
private val onImageButtonClicked: () -> Unit
) : RecyclerView.ViewHolder(itemView) {
val image = itemView.findViewById<ImageButton>(R.id.currentLvl)
init {
// Depending on what you want click on (can be itemView or image, choose regarding our needs)
image.setOnClickListener { onImageButtonClicked.invoke() }
}
fun bind(resource: Int) {
image.setImageResource(resource)
}
}
現在您必須更新您的配接器以傳遞點擊事件:
class ViewPagerAdapter(
val images: List<Int>,
val onImageButtonClicked: () -> Unit
) : RecyclerView.Adapter<ViewPagerAdapter.ViewPagerViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewPagerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.viewpager_quizlvls, parent, false)
return ViewPagerViewHolder(view) {
onImageButtonClicked.invoke()
}
}
override fun onBindViewHolder(holder: ViewPagerViewHolder, position: Int) {
val currentImage = images[position]
holder.itemView.findViewById<ImageButton>(R.id.currentLvl).setImageResource(currentImage)
}
override fun getItemCount(): Int {
return images.size
}
}
And finally in your MainActivity, you should do something like :
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val images = listOf(
R.drawable.coffee_placeholder,
R.drawable.coffee_placeholder,
R.drawable.coffee_placeholder
)
val adapter = ViewPagerAdapter(images, ::onImageButtonClicked)
findViewById<ViewPager2>(R.id.viewPager).adapter = adapter
}
private fun onImageButtonClicked() {
Toast.makeText(applicationContext, "hi", Toast.LENGTH_SHORT).show()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/454460.html
