停止dpad焦点在android中的当前片段之外

时间:2013-08-26 07:06:08

标签: android android-fragments focus

我当前的应用需要使用D-Pad遥控器进行控制。

使用焦点/选择,最近邻居的自动计算按预期工作但我想限制向上,向下,向左,向右移动仅发生在包含聚焦视图的当前片段中,并取消之前的焦点更改它移动到另一个片段。

我在选择视图时以编程方式将焦点更改为新片段。

这可能吗?我只能假设一个onFocusChange()事件允许我检查新焦点是否在片段之外并且返回但是没有运气...

1 个答案:

答案 0 :(得分:3)

简而言之,您可以在包含片段的容器上调用setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)来阻止所有片段后代的可聚焦性。为了提高可聚焦性,您可以致电setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

详细说明:

假设您有FrameLayout包含两个片段,一个在另一个片段之上,并且您希望将焦点导航限制在top_fragment到位,并{/ 1}}否则:

back_fragment

首先在<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/back_fragment" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/top_fragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> 的实例上调用addOnBackStackChangedListener()以提供backstack侦听器,您可以使用方法FragmentManager为您编写可聚焦控制代码。您可以使用setDescendantFocusability找出现在使用的片段,顶部的内容等,并适当设置后代可聚焦标记。当您替换getFragmentManager().findFragmentBy*容器时,使用top_fragment方法将事务添加到Backstack。通过这种方式,您可以在背板更改时更改可聚焦性设置,不仅可以在您添加片段时,还可以在使用BACK时弹出它。