ViewPager2 |未调用 View.ClickListener

Posted

技术标签:

【中文标题】ViewPager2 |未调用 View.ClickListener【英文标题】:ViewPager2 | View.ClickListener not called 【发布时间】:2019-09-16 17:19:47 【问题描述】:

我使用新的 android 小部件 ViewPager2 版本 1.0.0-alpha03,当我在其上设置点击侦听器时,未调用 onClick() 方法。

我的活动课:

class MainActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        supportFragmentManager.beginTransaction()
            .add(R.id.fragmentContent, SecondFragment.newInstance(), SecondFragment.TAG)
            .addToBackStack(SecondFragment.TAG)
            .commit()
    

我的片段:

class SecondFragment : Fragment() 

    companion object 
        val TAG = SecondFragment::class.java.canonicalName

        fun newInstance(): SecondFragment = SecondFragment()
    

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        return inflater.inflate(R.layout.fragment_second, container, false)
    

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        viewPager2.setOnClickListener 
            Log.d("logi", "click : ")
        
    

我的布局xml文件:

<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager2"
        android:layout_
        android:layout_/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

任何假设或解决方法?

【问题讨论】:

在我看来,我有两个想法:1)尝试分配背景颜色以查看元素是否实际布局为您认为的那样。 2) 尝试设置android:clickable=true 属性。 @LWChris 不工作 【参考方案1】:

我找到了解决办法! ViewPager2 包含 RecyclerView,我们必须以 RecyclerView 的形式使用它。我创建了 RecyclerView.Adapter 并将 itemView 上的 ClickListener 设置为构造函数 RecyclerView.ViewHolder 和 VOILA!!!

在片段中:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        viewPager2.adapter = ViewPager2Adapter 
            Log.d("logi", "clicked at : $it")
        
    

RecyclerView 适配器:

class ViewPager2Adapter(private val itemClickListener: (Int) -> (Unit)) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() 

    val items = mutableListOf<Any>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder =
        ItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false))

    override fun getItemCount(): Int = items.size 

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) 
        // bind your items
    

    private inner class ItemViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) 

        init 
            itemView.setOnClickListener 
                Log.d("logi", "Click!") // WORKS!!!
                itemClickListener(adapterPosition)
            
        
    

【讨论】:

以上是关于ViewPager2 |未调用 View.ClickListener的主要内容,如果未能解决你的问题,请参考以下文章

Android ViewPager2 setPageMargin 未解决

ViewPager2:setOnTouchListener() 不调用

ViewPager2嵌套RecyclerView滑动冲突解决办法

从 Viewpager2 片段访问父片段函数

如何更新 Tablayout 中的片段? (Viewpager2, FragmentStateAdapter)

由于 ViewPager2 导致 TabLayout 损坏