很遗憾,我们已经在Android TV上构建了自定义焦点管理器,我们找不到找到禁用默认焦点行为的方法。当我们将元素放在ScrollView中时,会出现问题。视图正在滚动以跟随默认焦点指针。问题在于我们的focusManager以不同的方式工作,并且与默认方式不同步,从而导致视图偏离了我们的焦点项目。
我们尝试了以下操作:
scrollEnabled={false}
preventDefault
onFocus / onScroll事件。似乎没有任何作用。
我们正在使用RN 0.59.10
我已经找到了一种方法。这有点hacky,但效果很好。我意识到,默认焦点放在它可以找到并且永远不会离开的第一个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>
);
};
它有效地将默认焦点捕获在内部,因此我可以自由地接管焦点行为。