如何使安卓电视应用程序可由DPAD访问



我已经为安卓电视创建了一个安卓应用程序,我想知道如何在菜单中启用D键导航。我是安卓电视应用程序的新手,找不到其他方法来做同样的事情。对于菜单,我添加了4个文本视图,但D-Pad无法访问它们,有没有其他方法可以让DPAD访问它们,或者我应该使用任何其他视图。

这是布局文件:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/mainframe"
android:layout_width="810dp"
android:layout_height="538dp"
android:layout_marginStart="1dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="1dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/linearLayout"
app:layout_constraintTop_toTopOf="parent">
</FrameLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="148dp"
android:layout_height="0dp"
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
android:background="@color/colorPrimaryDark"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0">
<TextView
android:id="@+id/NIYA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:fontFamily="cursive"
android:nextFocusDown="@+id/livePreview"
android:text="NIYA"
android:textColor="@color/colorPrimary"
android:textSize="30sp" />
<TextView
android:id="@+id/livePreview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:fontFamily="@font/montserrat"
android:gravity="center_horizontal"
android:nextFocusDown="@+id/AddDevice"
android:text="Live Preview"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
<TextView
android:id="@+id/AddDevice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:fontFamily="@font/montserrat"
android:gravity="center_horizontal"
android:nextFocusDown="@+id/deviceManager"
android:text="Add A Device"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
<TextView
android:id="@+id/deviceManager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:fontFamily="@font/montserrat"
android:gravity="center_horizontal"
android:nextFocusDown="@+id/chooseStorage"
android:text="Device Manager"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
<TextView
android:id="@+id/chooseStorage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:fontFamily="@font/montserrat"
android:gravity="center_horizontal"
android:text="Choose Storage"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

一般情况下,您不希望将TextView用于此类操作。在我看来,这些视图应该是Button,因为您希望用户与它们交互。使用Button也更便于访问,并且您可以随时根据需要对按钮进行样式设置。

布局不起作用的原因是TextView默认情况下不可聚焦。尽管我强烈建议在这种情况下使用Button,但您可以通过添加android:focusable="true"或在运行时使用setFocusablesetter方法将focusable设置为true,使TextView在XML中可聚焦。只需注意,您需要确保View本身有一种方式来显示它是聚焦的(例如,StateListDrawable(。

实现键监听器来实现这一点,就像点击监听器一样。例如:

yourTextview.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
//TODO Auto-generated method stub
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
return true;
}  if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
return true;
}  if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
return true;
}
else if (keyCode == KeyEvent.KEYCODE_ENTER) {
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
return true;
}
}
return false;
}
}); 

在if语句中对每个操作执行任何您想执行的操作。如果你的控件没有响应关键事件,你可以在你的xml android中添加这些:focusable="真";或者安卓:点击是真的,但这不是必要的,它应该在没有这些的情况下工作

最新更新