android - 在全屏横向模式下反应本机 TextInput 颜色问题
问题描述
我的 react-native Android 应用程序中有一个简单的 TextInput。当以横向模式聚焦时,它会以全屏方式打开。但是在全屏键盘模式下,背景和前景都是白色的,因此我看不到我正在输入的文本:
TextInput 在未聚焦时看起来很正常:
这是相关的代码:
<TextInput
onChangeText={this.changeText}
value={text}
disableFullscreenUI={false} />
我可以给它一个黑色的样式,但是在这种情况下,黑色将不可见,因为如上所示,TextInput 处于深色屏幕中。所以这需要一个解决方案,比如在焦点和模糊上改变两种颜色,但这真的不应该是使用 TextInput 的方式。
同样的问题已在此处和此处发布。有人提到,这是通过 react-native 的 0.50 以上版本修复的。但是我已经在使用 0.63.3 并且问题仍然存在。
有没有人遇到过这个问题?任何帮助将不胜感激,谢谢!
解决方案
经过一天的努力,我找到了解决方法。这实际上并没有修复错误,但它是一个隐藏错误的小“黑客”。但是,react-native 的最新版本仍然存在该错误。所以这里是对该错误的简要说明,为什么某些解决方案不起作用以及我是如何克服它的:
TextInput 在其本机全屏编辑器视图中继承应用的颜色样式,而它不应该。本机全屏始终以白色背景打开。想象一下,您的应用程序的黑屏中有一个 TextInput,那么您很可能有一个白色的字体颜色。在这种情况下,问题就发生了,全屏编辑器以白色背景上的白色字体打开。
- 首先想到的是应用黑色字体颜色。但是,这也会导致您的暗屏幕中出现黑色。所以很明显,两种颜色应该动态变化。
- 检测键盘事件,在显示键盘时应用深色,在隐藏键盘时应用浅色将是一个好主意。但是,当 TextInput 与 disableFullscreenUI 属性一起使用时,不会触发keyboardDidShow和keyboardDidHide事件。这很奇怪,但是是的,这是另一个错误,他们根本没有被解雇。我可以通过移除道具并看到它们再次被解雇来确认这一点。
- 在聚焦/模糊状态下应用不同的颜色是理论上的另一种解决方案。然而,这导致了更多的复杂性。使用返回按钮从编辑器返回,输入仍处于焦点状态,您必须使用 onTouch 事件,它将成为一个永无止境的循环。因此,这绝对不是实践中的解决方案。
注意: secureTextEntry TextInputs 上也不存在此错误。有趣的是,带有secureTextEntry 的TextInputs 不会在全屏模式下继承颜色样式。
解决方案
解决方法是有条件地在 TextInput 上放置一个 Text 组件,并隐藏 TextInput。这样,可以为全屏键盘编辑器和显示的文本提供不同的颜色。
因此,首先编写一个简单的方法来检测应用程序是否处于横向,disableFullscreenUI 为 false,并且它不是安全的文本输入。
const isFullscreenKeyboardEnabled = () =>
props.orientation === LANDSCAPE // Write your own logic of orientation
&& props.disableFullscreenUI === false
&& !props.secureTextEntry
在 TextInput 之前添加一个具有绝对位置和白色字体颜色的虚拟文本。它应该出现在 TextInput 之前,因为用户仍然应该能够通过单击它与 TextInput 进行交互。
{isFullscreenKeyboardEnabled() &&
<Text style={styles.textInputOverlay}>{text}</Text>}
修改 TextInput 的样式。在全屏模式下,它应该简单地具有零不透明度和黑色字体颜色。
<TextInput
value={text}
disableFullscreenUI={props.disableFullscreenUI}
style={[
styles.textInput, isFullscreenKeyboardEnabled() && styles.textInputFullscreen
]}/>
这样,用户将在屏幕上看到白色文本,单击它并打开带有黑色字体的全屏编辑器。诀窍是在上面的黑屏上隐藏带有黑色字体的 TextInput。所以我希望这个解决方案可以帮助任何遇到同样问题的人。
推荐阅读
- java - 如何从两个 hashMap 中检索公共键并将结果放入 ArrayList
- python - 带有 Plotly Dash 的日期滑块不起作用
- html - 在带有粘性列的表格上保留交替的行阴影
- swift - 渐变背景后 UI 消失
- ios - 在整个应用程序上设置日历类型
- javascript - rxjs switchmap observable,为final保存变量
- angularjs - 未捕获的类型错误:angular.module(...).info Ionic1
- android - SVG 中的非 HTTPS未显示在 Facebook Messenger webview 中
- angular - 如何在角度6中将数组元素的值打印为警报
- c++ - C++ 17:如何使用 if constexpr 调用不同的构造函数?