问题描述
我一直在尝试在Kotlin中实现viewpager2,但是我不知道为什么我会收到错误消息,说没有适配器附加到回收视图 这是我的MainActivity.kt:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
binding.viewpager2.adapter = Viewpager2Adapter(this)
TabLayoutMediator(binding.tabLayout,binding.viewpager2){
tab,position ->
tab.text = "OBJECT ${(position + 1)}"
}.attach()
}
}
下面是viewpager2Adapter.kt ::
class Viewpager2Adapter(fa : FragmentActivity): FragmentStateAdapter(fa) {
override fun getItemCount(): Int = 3
override fun createFragment(position: Int): Fragment= Fragment2()
}
这是我的fragment2.kt ::
class Fragment2 : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_2,container,false)
}
}
有人能帮我弄清楚我做错了什么吗? 预先谢谢你:)
解决方法
问题是您要混合两种扩大活动视图的方法,因此该视图没有得到适当的扩大。要解决您的问题,请替换:
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
使用
binding = DataBindingUtil.setContentView<ActivityMainBinding>(this,R.layout.activity_main)
您的代码应该可以工作。上面是实现数据绑定时要应用的常规方法。如果您不使用数据绑定,则代码如下所示:
setContentView(R.layout.activity_main)
val viewpager2 = findViewById<ViewPager2>(R.id. viewpager2)
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)
viewpager2.adapter = Viewpager2Adapter(this)
TabLayoutMediator(tabLayout,viewpager2){
tab,position ->
tab.text = "OBJECT ${(position + 1)}"
}.attach()
即使您保留数据绑定,您的应用程序也可以使用上面的代码,但是与binding
相比,使用数据绑定和通过findViewById
实例访问视图当然更方便。
我认为您没有在MainActivity中正确使用视图绑定。 在setContentView中,您应该具有binding.root而不是R.layout.activity_main
这是MainActivity中onCreate函数的代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
viewpager2Adapter = Viewpager2Adapter(this)
viewPager2 = binding.viewpager2
tabLayout = binding.tabLayout
viewPager2.adapter = viewpager2Adapter
TabLayoutMediator(tabLayout,viewPager2){
tab,position ->
tab.text = "OBJECT ${(position + 1)}"
}.attach()
}