我见过这种原生应用程序自动滚动窗口的方法,但我想知道在React native中最好的方法…当一个
您可以在示例UIExplorer的
TextInputExample.js
视图中看到此问题。
有人有好的解决方案吗?
我们将react-native-keyboard-spacer的一些代码和@夏洛克的代码结合起来,创建了一个KeyboardHandler组件,可以用TextInput元素包装任何视图。非常管用!:-)
/**
* Handle resizing enclosed View and scrolling to input
* Usage:
* <KeyboardHandler ref='kh' offset={50}>
* <View>
* ...
* <TextInput ref='username'
* onFocus={()=>this.refs.kh.inputFocused(this,'username')}/>
* ...
* </View>
* </KeyboardHandler>
*
* offset is optional and defaults to 34
* Any other specified props will be passed on to ScrollView
*/
'use strict';
var React=require('react-native');
var {
ScrollView,
View,
DeviceEventEmitter,
}=React;
var myprops={
offset:34,
}
var KeyboardHandler=React.createClass({
propTypes:{
offset: React.PropTypes.number,
},
getDefaultProps(){
return myprops;
},
getInitialState(){
DeviceEventEmitter.addListener('keyboardDidShow',(frames)=>{
if (!frames.endCoordinates) return;
this.setState({keyboardSpace: frames.endCoordinates.height});
});
DeviceEventEmitter.addListener('keyboardWillHide',(frames)=>{
this.setState({keyboardSpace:0});
});
this.scrollviewProps={
automaticallyAdjustContentInsets:true,
scrollEventThrottle:200,
};
// pass on any props we don't own to ScrollView
Object.keys(this.props).filter((n)=>{return n!='children'})
.forEach((e)=>{if(!myprops[e])this.scrollviewProps[e]=this.props[e]});
return {
keyboardSpace:0,
};
},
render(){
return (
<ScrollView ref='scrollView' {...this.scrollviewProps}>
{this.props.children}
<View style={{height:this.state.keyboardSpace}}></View>
</ScrollView>
);
},
inputFocused(_this,refName){
setTimeout(()=>{
let scrollResponder=this.refs.scrollView.getScrollResponder();
scrollResponder.scrollResponderScrollNativeHandleToKeyboard(
React.findNodeHandle(_this.refs[refName]),
this.props.offset, //additionalOffset
true
);
}, 50);
}
}) // KeyboardHandler
module.exports=KeyboardHandler;
Facebook开源键盘避免查看
在反应原生0.29中解决这个问题。文档和使用示例可以在这里找到。
2017 年回答
键盘避免查看
可能是现在最好的方式。查看此处的文档。与Keyboard(键盘)
模块相比,它确实很简单,它给开发者更多的控制来执行动画。斯宾塞·卡利在他的媒体博客上展示了所有可能的方式。
2015年回答
在 react-native
中执行此操作的正确方法不需要外部库,利用本机代码,并包含动画。
首先定义一个函数,该函数将处理每个TextInput
(或您想滚动到的任何其他组件)的onFocus
onFocus事件:
// Scroll a component into view. Just pass the component ref string.
inputFocused (refName) {
setTimeout(() => {
let scrollResponder = this.refs.scrollView.getScrollResponder();
scrollResponder.scrollResponderScrollNativeHandleToKeyboard(
React.findNodeHandle(this.refs[refName]),
110, //additionalOffset
true
);
}, 50);
}
然后,在你的渲染函数中:
render () {
return (
<ScrollView ref='scrollView'>
<TextInput ref='username'
onFocus={this.inputFocused.bind(this, 'username')}
</ScrollView>
)
}
这将使用 RCT设备事件
事件和大小调整器,使用 RCTUIManager.measureLayout
测量组件的位置,并计算滚动响应输入测量和滚动到键盘板
所需的确切滚动移动。
您可能希望使用其他Offset
参数,以满足特定UI设计的需求。
问题内容: 我有几个在我的。我想知道当前哪个重点。我如何找到此信息? 问题答案: (从继承)应该返回对具有焦点的组件的引用。可能也很有趣。
嗨,我有javafx应用程序,它只有一个stage.On标签键按下文本字段的事件,一个弹出窗口显示在应用程序的主要阶段 我不点击弹出窗口,也不选择弹出窗口中的任何内容。我会点击它后面的舞台。我希望popup被关闭,但在执行popup的focusedProperty侦听器之前,它给了我IllegalArgumentException。 如果popup位于不同的阶段(应用程序的主阶段除外),根据阶段f
问题内容: 如前所述,我想更改内的默认TAB行为(以使其充当类似或类似的组件) 这是事件动作 这是听众 我也尝试过evt.KEY_TYPED,没有任何喜悦。 有任何想法吗? 快速编辑:我也尝试代替 问题答案: 根据此类: 请注意,可以更短,根据[约书亚·戈德堡的意见,因为我们的目标是获得通过重写回默认行为: 这用于问题“ 我如何修改标签中的Tab键的行为JTextArea? ” 在以前的实现确实是
本文向大家介绍Android 设置Edittext获取焦点并弹出软键盘,包括了Android 设置Edittext获取焦点并弹出软键盘的使用技巧和注意事项,需要的朋友参考一下 Android 设置Edittext获取焦点并弹出软键盘 ps:android页面进入edittext自动获取焦点,弹出软键盘解决方法 在edittext的父布局中加入上面2个属性 以上就是本文的全部内容,希望本文的内容对大
当EditText具有焦点并且出现软键盘并按下任何键时,我正在尝试清理EditText。我正在使用OnFocus usChangeListener方法来检测EditText何时具有焦点,但我不知道如何在相同的方法中实现键盘事件。 有人能帮我吗?非常感谢。亲切的问候
当页面加载Javascript事件时,我试图聚焦一个简单的输入文本,我的目标是聚焦并打开移动浏览器上的虚拟键盘,但我没有成功。 我的代码看起来很简单,比如: 我也试过jQuery... 在android上,输入得到了关注,但在iPhone上却没有。在这两种情况下,我都不会在页面加载时使用键盘。我不知道我还得做什么。