5

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

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

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

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

4

1 回答 1

3

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

细节:

假设您FrameLayout包含两个片段,一个在另一个之上,并且您希望将焦点导航限制top_fragment在它就位时以及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()实例FragmentManager以提供 backstack 侦听器,您可以在其中使用 method 编写焦点控制代码setDescendantFocusability。您可以使用getFragmentManager().findFragmentBy*来找出现在使用的片段、顶部的内容等,并适当地设置后代的可聚焦性标志。替换top_fragment容器时,使用方法将事务添加到 backstack addToBackStack()。这样,您将能够在 backstack 更改时更改可聚焦性设置,不仅在您添加片段时,而且在您使用 BACK 弹出它时也是如此。

于 2015-09-30T12:03:04.777 回答