科特林 AddOnPageChangeListener 不工作
Kotlin AddOnPageChangeListener not working
我想连接一个 viewPager 和一个适配器(像这样:viewPager.addOnPageChangeListener()),但是 pageChangeListener 的字母变成了红色,好像它不是一个有效的代码...我是什么做错了??这是一个截图:
[1]: https://i.stack.imgur.com/IOYJY.png
上下文:我目前正在开发一款游戏,其中包含一些片段,您可以在其中选择游戏卡牌。我需要 pageChangeListener 来更改卡片的图片。也许还有另一种方法可以做到这一点,但我不知道如何...
package com.suffv1
import android.os.Bundle
import androidx.appcompat.app.ActionBar
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.example.suff_02.Adapter2
import com.example.suff_02.R
import com.example.suff_02.kartenmodell
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(){
private lateinit var actionbar: ActionBar
private lateinit var liste: ArrayList<kartenmodell>
private lateinit var myAdapter: Adapter2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.setContentView(R.layout.activity_main)
actionbar = this.supportActionBar!!
loadCards()
viewpager2.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
val title = liste[position].KartenImage
actionbar.title = title
}
})
}
private fun loadCards() {
liste = ArrayList()
liste.add(kartenmodell(R.drawable.bier_radler_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_hopfentrunk_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_butt_light_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_becks_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_tyskie_klein_level_1))
myAdapter = Adapter2(this, liste)
viewpager2.adapter = myAdapter
viewpager2.setPadding(100, 0, 100, 0)
}
}
要创建 AddOnPageChangeListener()
,您可以按以下方式进行操作:
//See how, you have to use object to create an Object of the interface OnPageChangeListener.
//This is how you do for other listeners/interfaces/class as well when you've to implement its member functions instead of new in java.
viewPager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
TODO("Not yet implemented")
}
override fun onPageSelected(position: Int) {
TODO("Not yet implemented")
}
override fun onPageScrollStateChanged(state: Int) {
TODO("Not yet implemented")
}
})
但是,进一步在 Kotlin 中,您可以将 Kotlin 函数用作
//This is for onPageSelected only.
viewPager.onPageChangeListener{ position: Int ->
//This position is the selected Page's position
}
看起来您使用的是 ViewPager2 而不是原始的 Viewpager,并且 Viewpager2 没有页面更改侦听器,而是具有页面更改回调
所以您使用错误的方法在页面更改时收到通知。
而是做类似
的事情
var myPageChangeCallback = object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
Toast.makeText(this@MainActivity, "Selected position: ${position}",
Toast.LENGTH_SHORT).show()
}
}
viewpager.registerOnPageChangeCallback(myPageChangeCallback)
尽管在架构上很多时候使用 OnPageChangeCallback
是一种糟糕的形式,因为您可能会破坏 Fragment 的封装思想,最好将生命周期状态更改为 Resumed
在选择页面(片段)时执行片段的操作。例如将代码放在 Fragments onResume
方法中。
尽管在这种设置操作栏标题的情况下,在架构上使用 OnPageChangeCallback
可能没问题
我想连接一个 viewPager 和一个适配器(像这样:viewPager.addOnPageChangeListener()),但是 pageChangeListener 的字母变成了红色,好像它不是一个有效的代码...我是什么做错了??这是一个截图: [1]: https://i.stack.imgur.com/IOYJY.png
上下文:我目前正在开发一款游戏,其中包含一些片段,您可以在其中选择游戏卡牌。我需要 pageChangeListener 来更改卡片的图片。也许还有另一种方法可以做到这一点,但我不知道如何...
package com.suffv1
import android.os.Bundle
import androidx.appcompat.app.ActionBar
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.example.suff_02.Adapter2
import com.example.suff_02.R
import com.example.suff_02.kartenmodell
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(){
private lateinit var actionbar: ActionBar
private lateinit var liste: ArrayList<kartenmodell>
private lateinit var myAdapter: Adapter2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.setContentView(R.layout.activity_main)
actionbar = this.supportActionBar!!
loadCards()
viewpager2.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
val title = liste[position].KartenImage
actionbar.title = title
}
})
}
private fun loadCards() {
liste = ArrayList()
liste.add(kartenmodell(R.drawable.bier_radler_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_hopfentrunk_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_butt_light_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_becks_klein_level_1))
liste.add(kartenmodell(R.drawable.bier_tyskie_klein_level_1))
myAdapter = Adapter2(this, liste)
viewpager2.adapter = myAdapter
viewpager2.setPadding(100, 0, 100, 0)
}
}
要创建 AddOnPageChangeListener()
,您可以按以下方式进行操作:
//See how, you have to use object to create an Object of the interface OnPageChangeListener.
//This is how you do for other listeners/interfaces/class as well when you've to implement its member functions instead of new in java.
viewPager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
TODO("Not yet implemented")
}
override fun onPageSelected(position: Int) {
TODO("Not yet implemented")
}
override fun onPageScrollStateChanged(state: Int) {
TODO("Not yet implemented")
}
})
但是,进一步在 Kotlin 中,您可以将 Kotlin 函数用作
//This is for onPageSelected only.
viewPager.onPageChangeListener{ position: Int ->
//This position is the selected Page's position
}
看起来您使用的是 ViewPager2 而不是原始的 Viewpager,并且 Viewpager2 没有页面更改侦听器,而是具有页面更改回调
所以您使用错误的方法在页面更改时收到通知。
而是做类似
的事情var myPageChangeCallback = object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
Toast.makeText(this@MainActivity, "Selected position: ${position}",
Toast.LENGTH_SHORT).show()
}
}
viewpager.registerOnPageChangeCallback(myPageChangeCallback)
尽管在架构上很多时候使用 OnPageChangeCallback
是一种糟糕的形式,因为您可能会破坏 Fragment 的封装思想,最好将生命周期状态更改为 Resumed
在选择页面(片段)时执行片段的操作。例如将代码放在 Fragments onResume
方法中。
尽管在这种设置操作栏标题的情况下,在架构上使用 OnPageChangeCallback