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>
此处dates
Spinner
在name
下方EditText
times
左侧Spinner
,times
分量低于 name
,done
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
*/
}
瞧,它起作用了。
大家好,我正在开发应用程序,我的布局结构如下:
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>
此处dates
Spinner
在name
下方EditText
times
左侧Spinner
,times
分量低于 name
,done
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
*/
}
瞧,它起作用了。