如何使用 Dpad/游戏控制器选择和单击 Android ViewPager2 的子视图

问题描述

我正在研究当前 Android 项目中的蓝牙 Dpad 和游戏控制器。

我可以在我的应用中成功选择并点击我所有的 UI 宽度。

但是我有一个 ViewPager2 包含多个片段,我无法选择或点击任何片段小部件。

我的 ViewPager2 在 XML 中定义如下:-

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/dashboard_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

<com.google.android.material.tabs.TabLayout
    android:id="@+id/dashboard_dots"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:padding="2dp"
    app:tabBackground="@drawable/dot_selector"
    app:tabGravity="center"
    app:tabIndicatorHeight="0dp" />

在我的主要活动中,我将 ViewPager2 配置如下:-

    viewPager = findViewById(R.id.dashboard_pager)

    val pagerAdapter = ScreenSlidePagerAdapter(this@DashboardActivity)
    viewPager.adapter = pagerAdapter

    val tabLayout = findViewById<TabLayout>(R.id.dashboard_dots)

    TabLayoutMediator(tabLayout,viewPager) { _,_ -> }.attach()

我的适配器是:-

private inner class ScreenSlidePagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
    override fun getItemCount(): Int = NUM_PAGES

    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> DashboardClockFragment()
            1 -> DashboardSpeedometerFragment()
            2 -> DashboardTimerFragment()
            else -> DashboardTimerFragment()
        }
    }
}

DashboardClockFragment 布局 XML 类似于:-

<FrameLayout
    android:id="@+id/dashboard_clock_wrapped"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_gravity="center_vertical"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?attr/selectableItemBackground">

    <TextClock
        android:id="@+id/dashboard_clock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        android:fontFamily="@font/lcd_digital"
        android:format12Hour="kk:mm:ss"
        android:format24Hour="kk:mm:ss"
        android:gravity="center"
        android:padding="10dp"
        android:textColor="?android:attr/textColorPrimary"
        android:textSize="@dimen/speed_limit_text_size" />

    <TextView
        android:id="@+id/dashboard_clock_paused"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        android:fontFamily="@font/lcd_digital"
        android:gravity="center"
        android:padding="10dp"
        android:text="@string/start_time"
        android:textColor="?android:attr/textColorPrimary"
        android:textSize="@dimen/speed_limit_text_size"
        android:textStyle="bold"
        android:visibility="gone" />

</FrameLayout>

我无法使用 Dpad 控制器在布局中选择 TextClock 或 TextView。

在触摸模式下,我可以点击子视图,一切都按预期工作。

在配置布局以响应 Dpad 和/或游戏控制器时,我错过了什么?

解决方法

尝试将 android:focusableInTouchMode="true"android:focusable="true" 添加到您希望在页面上可选择的视图。

要捕捉点击,请将 onClickListener 添加到所需的视图中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...