当前位置: 首页 > 知识库问答 >
问题:

当TextInput有焦点时,如何从键盘后面自动滑出窗口?

有翰海
2023-03-14

我见过这种原生应用程序自动滚动窗口的方法,但我想知道在React native中最好的方法…当一个

您可以在示例UIExplorer的TextInputExample.js视图中看到此问题。

有人有好的解决方案吗?


共有3个答案

越琦
2023-03-14

我们将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;
庄高谊
2023-03-14

Facebook开源键盘避免查看在反应原生0.29中解决这个问题。文档和使用示例可以在这里找到。

满言
2023-03-14

2017 年回答

键盘避免查看可能是现在最好的方式。查看此处的文档。与Keyboard(键盘)模块相比,它确实很简单,它给开发者更多的控制来执行动画。斯宾塞·卡利在他的媒体博客上展示了所有可能的方式。

2015年回答

react-native 中执行此操作的正确方法不需要外部库,利用本机代码,并包含动画。

首先定义一个函数,该函数将处理每个TextInput(或您想滚动到的任何其他组件)的onFocusonFocus事件:

// 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上却没有。在这两种情况下,我都不会在页面加载时使用键盘。我不知道我还得做什么。