android - 停止 dpad 焦点超出 android 中的当前 fragment

标签 android android-fragments focus

我当前的应用需要使用方向键 Remote 进行控制。

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

我在选择 View 时以编程方式将焦点更改为新 fragment 。

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

最佳答案

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

详情:

假设您的 FrameLayout 包含两个 fragment ,一个在另一个之上,并且您希望将焦点导航限制在 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> 

首先在 FragmentManager 实例上调用 addOnBackStackChangedListener() 以提供后台监听器,您可以在其中使用方法 setDescendantFocusability 编写焦点控制代码。您可以使用 getFragmentManager().findFragmentBy* 找出现在使用的 fragment 、顶部的 fragment 等,并适本地设置后代可聚焦性标志。当您替换 top_fragment 容器时,使用 addToBackStack() 方法将事务添加到 backstack。这样您就可以在 backstack 发生变化时更改可聚焦性设置,不仅是在您添加 fragment 时,而且在您使用 BACK 弹出 fragment 时也是如此。

关于android - 停止 dpad 焦点超出 android 中的当前 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18438457/

相关文章:

python - 自动聚焦显示删除 QLineEdit 的占位符文本

java - 使用 Nimbus laf,我的 JOptionPane 在从组合框 ItemEvent 调用时不会获得焦点

java - 小程序未找到关键事件或获取焦点

android - 数据绑定(bind)不适用于选项卡项文本属性

android - 常见/典型 Android 设备上的触摸点数量

android - 在带有选取框的 TextView 中,不会开始循环

android - 如何诊断 Eclipse 中的 "Error executing aapt"错误?

应用程序最小化时的 Android Activity 和 fragment 生命周期问题

android - 动态更改 ViewPager 中的 fragment 内容

java - 如何像某些文件传输应用程序那样通过 WiFi 发布设备名称(变量)?