Leanback 焦点问题

Leanback focus problems

大家好,我正在开发应用程序,我的布局结构如下:

  RelativeLayout:

   CompoundView: 

   CompoundView:
          RelativeLayout:
            Button
            Button
            RecyclerView

   BrowseFragment:
          Only rows

我的问题是,当我到达浏览片段的第一行和其中的第一项时,我想向上 (D-PAD-UP) 聚焦按钮只有当我向左推 ( D-PAD-LEFT) 时,它才起作用。有人对此有解决方案吗?

由于您使用的是 RelativeLayout,因此您应该按照您希望导航的顺序布置组件。

使用 RelativeLayout 参考文档中提供的 XML 属性,您也可以建立导航顺序:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp" >
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/reminder" />
    <Spinner
        android:id="@+id/dates"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/name"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/times" />
    <Spinner
        android:id="@id/times"
        android:layout_width="96dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/name"
        android:layout_alignParentRight="true" />
    <Button
        android:layout_width="96dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/times"
        android:layout_alignParentRight="true"
        android:text="@string/done" />
</RelativeLayout>

此处datesSpinnername下方EditTexttimes左侧Spinner,times 分量低于 namedone Button 低于 times。见下图:

有关电视的更多详细信息,请参阅 Build Basic TV Layouts 指南。

所以问题出在 BrowseFrameLayout 中,为了解决这个问题,我不得不重写 onFocusSearchListener 并自己管理焦点。

在我扩展的 BrowseFragment 中,我有这个方法:

public void workaroundFocus(){
    if(getView() != null) {
        View viewToFocus  = getActivity().findViewById(R.id.view_to_focus);
        BrowseFrameLayout browseFrameLayout = getView().findViewById(android.support.v17.leanback.R.id.browse_frame);
        browseFrameLayout.setOnFocusSearchListener((focused, direction) -> {
            if (direction == View.FOCUS_UP) {
                return viewToFocus;
            }
            else {
                return null;
            }
        });
    }
}

然后:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    workaroundFocus();
    /*
      Rest of the code
    */
}

瞧,它起作用了。