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

Dem*_*tix 5 android focus android-fragments

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

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

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

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

vga*_*nin 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> 
Run Code Online (Sandbox Code Playgroud)

首先调用addOnBackStackChangedListener()的实例FragmentManager来提供 backstack 侦听器,您可以在其中使用方法 编写可聚焦性控制代码setDescendantFocusability。您可以用来getFragmentManager().findFragmentBy*找出现在使用的片段、顶部的片段等,并适当地设置后代可聚焦性标志。当你更换top_fragment容器时,使用addToBackStack()方法将事务添加到backstack。这样,您将能够在后退堆栈更改时更改可聚焦性设置,不仅在添加片段时,而且在使用 BACK 弹出它时也是如此。