在 Android 电视上禁用默认焦点行为
Disable default focus behaviour on Android TV
我们已经在 Android 电视上构建了自定义焦点管理器,不幸的是,我们找不到禁用默认焦点行为的方法。
当我们将元素放入 ScrollView 时,问题就出现了。正在滚动视图以跟随默认焦点指针。问题是我们的 focusManager 以不同的方式工作,它与默认的不同步,导致视图从我们的焦点项上移开。
我们尝试了以下方法:
- 删除所有 Tocuahbles 并用自定义替换它们 class。
- 用 FlatList 替换 ScrollView
- 正在尝试设置
scrollEnabled={false}
- 正在尝试调用
preventDefault
onFocus/onScroll 个事件。
似乎没有任何效果。
我们正在使用 RN 0.59.10
我找到了一种方法。这有点老套,但效果很好。
我意识到默认焦点转到它可以找到的第一个 ScrollView 并且永远不会离开它。这给了我将焦点捕获在无尺寸组件中的想法,因此我创建了一个名为 FocusTrap 的组件并将其放置在我的根视图之上。
import React from "react";
import { View, ScrollView, StyleSheet, TouchableOpacity } from "react-native";
const styles = StyleSheet.create({
container: { flex: 1, width: 0, height: 0, flexShrink: 1, flexGrow: 0 },
});
export const FocusTrap = (props) => {
return (
<View style={styles.container}>
<ScrollView>
<TouchableOpacity />
</ScrollView>
</View>
);
};
它有效地将默认焦点捕获在内部,因此我可以自由接管焦点行为。
我们已经在 Android 电视上构建了自定义焦点管理器,不幸的是,我们找不到禁用默认焦点行为的方法。 当我们将元素放入 ScrollView 时,问题就出现了。正在滚动视图以跟随默认焦点指针。问题是我们的 focusManager 以不同的方式工作,它与默认的不同步,导致视图从我们的焦点项上移开。
我们尝试了以下方法:
- 删除所有 Tocuahbles 并用自定义替换它们 class。
- 用 FlatList 替换 ScrollView
- 正在尝试设置
scrollEnabled={false}
- 正在尝试调用
preventDefault
onFocus/onScroll 个事件。
似乎没有任何效果。
我们正在使用 RN 0.59.10
我找到了一种方法。这有点老套,但效果很好。 我意识到默认焦点转到它可以找到的第一个 ScrollView 并且永远不会离开它。这给了我将焦点捕获在无尺寸组件中的想法,因此我创建了一个名为 FocusTrap 的组件并将其放置在我的根视图之上。
import React from "react";
import { View, ScrollView, StyleSheet, TouchableOpacity } from "react-native";
const styles = StyleSheet.create({
container: { flex: 1, width: 0, height: 0, flexShrink: 1, flexGrow: 0 },
});
export const FocusTrap = (props) => {
return (
<View style={styles.container}>
<ScrollView>
<TouchableOpacity />
</ScrollView>
</View>
);
};
它有效地将默认焦点捕获在内部,因此我可以自由接管焦点行为。