按钮上的 KeyboardAwareScrollView

2023-12-21

我在屏幕底部有一个按钮,在屏幕顶部有一个输入字段。什么时候<TextInput>已聚焦 - 键盘与按钮重叠,在单击返回按钮之前无法按下该按钮。我希望在键盘打开时将“提交”按钮向上推,并在键盘未激活时返回到屏幕底部。

KeyboardAwareScrollView 可以很好地配合<TextInput/>但似乎不适用于该按钮。我有什么想法可以实现这一目标吗?谢谢!

render() {
    return (
        <KeyboardAwareScrollView
            contentContainerStyle={{
                flex: 1,
                flexDirection: 'column',
                justifyContent: 'flex-end',
                alignItems: 'center',
                backgroundColor: 'skyblue'
            }}
        >

            <View>
                <TextInput placeholder='John'
                           autoFocus={true}/>
                <Button>
                    <Text>Submit</Text>
                </Button>
            </View>
        </KeyboardAwareScrollView>
    )
} 

KeyboardAwareScrollView 有一个名为extraScrollHeight可以用于此目的。

https://github.com/APSL/react-native-keyboard-aware-scroll-view#props https://github.com/APSL/react-native-keyboard-aware-scroll-view#props

额外的滚动高度- 为键盘添加额外的偏移量。如果你想坚持的话很有用 键盘上方的元素。

你可以将它与onFocus道具来设置extraScrollHeight使键盘保持在按钮下方。

<KeyboardAwareScrollView
  contentContainerStyle={{
      flex: 1,
      flexDirection: 'column',
      justifyContent: 'flex-end',
      alignItems: 'center',
      backgroundColor: 'skyblue'
  }}
  extraScrollHeight={this.state.extraScrollHeight}>
  <View>
    <TextInput 
      ref={ref => { this.textInput = ref; }}
      placeholder='John'
      onFocus={(event) => {
        this.setState({extraScrollHeight:30})
      }}
      autoFocus={true}
      />
    <Button> 
      <Text>Submit</Text>
    </Button>
  </View>
</KeyboardAwareScrollView>

这将允许您动态设置extraScrollHeight取决于TextInput你在看。您需要管理extraScrollHeight在每一个TextInput.

或者你可以设置一个extraScrollheight并留下它。


更新键盘上方的移动按钮

问题发布者更新了他们的问题,指出 TextInput 位于页面顶部,而按钮位于底部。按钮显示在键盘上方向上移动。

或者,您可以将侦听器添加到Keyboard,因为这将获取键盘的高度并允许您为按钮设置动画。

  1. import { Keyboard, Animated } from 'react-native'
  2. 设置一个新的Animated.Value处于按钮的初始位置的状态。
  3. 添加监听器keyboardDidShow and keyboardDidHide in the componentDidMount并将它们删除componentWillUnmount
  4. 将方法添加到 for_keyboardShow and _keyboardHide这将使 Button 的动画效果高于键盘的高度
  5. 将按钮包含在Animated.View位置由this.state.initialPosition

这是代码:

import * as React from 'react';
import { View, StyleSheet, Animated, Button, TextInput, Keyboard } from 'react-native';
import { Constants } from 'expo';

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      initialPosition: new Animated.Value(60)
    }
  }

  componentDidMount () {
    this.keyboardShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardShow);
    this.keyboardHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardHide);
  }

  componentWillUnmount() {
    this.keyboardShowListener.remove();
    this.keyboardHideListener.remove();
  }

  _keyboardHide = (e) => {
    Animated.timing(
      this.state.initialPosition,
      {
        toValue: 60
      }
    ).start();
  }

  _keyboardShow = (e) => {
    Animated.timing(
      this.state.initialPosition,
      {
        toValue: e.endCoordinates.height
      }
    ).start();
  }

  render() {
    return (
      <View style={styles.container}>
        <View style={styles.mainContainer}>
          <TextInput 
            placeholder='Enter first name'
            autoFocus
            style={{fontSize: 24}}
          />
          </View>

        <Animated.View style={{bottom: this.state.initialPosition}}>
          <Button 
            onPress={() => alert('submit')} title={'submit'} 
          />
        </Animated.View>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: Constants.statusBarHeight,
  },
  mainContainer: {
    flex: 1,
    alignItems: 'center'
  }
});

这里有一份小吃https://snack.expo.io/@andypandy/animated-button-above-keyboard https://snack.expo.io/@andypandy/animated-button-above-keyboard

值得注意的是

请注意,如果将 android:windowSoftInputMode 设置为 adjustmentResize 或 adjustNothing,只有keyboardDidShow和keyboardDidHide事件会被 在 Android 上可用。 KeyboardWillShow 和 KeyboardWillHide 是 通常在 Android 上不可用,因为没有原生的 对应事件

https://facebook.github.io/react-native/docs/keyboard#addlistener https://facebook.github.io/react-native/docs/keyboard#addlistener

否则我会用keyboardWillShow and keyboardWillHide因为它们将在键盘显示/隐藏之前被调用,从而使动画更加平滑。

最后的想法

显然,这是一个概念验证,但它应该让您了解如何实现您想要的目标。

为了提高性能,您可以做的一件事是,如果您在应用程序中之前的任何位置显示键盘,则捕获键盘的高度并保存它,以便您以后可以访问。你可以将其保存在redux, AsyncStorage,或者只是通过导航将其传递到此屏幕。然后你可以使用onFocus的财产TextInput移动按钮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按钮上的 KeyboardAwareScrollView 的相关文章

随机推荐

  • 从intel到arm交叉编译库

    我正在使用开源 C 库 DCMTKhttp dicom offis de dcmtk php en http dicom offis de dcmtk php en 我已经使用 VC IDE MacOS Xcode Mac iOS 模拟器在
  • jQuery 显示/隐藏 Div

    我将其用于显示 隐藏 div 扩展器 它工作正常 但是 HTML 实体没有被输出 document ready function slickbox hide slick toggle toggle function this text 96
  • ZADD 或 HMGET 等 Redis 命令可以处理的参数数量是否有限制?

    我想使用单个 ZADD 或 HMGET 命令而不是 MULTI EXEC ZADD 可以处理的 分数 成员 元组的数量有限制吗 HMGET 可以处理的字段数量有限制吗 理论上的限制相当高 但你应该以不会达到它的方式设计你的读数 保持读取大小
  • OpenThread() 返回 NULL Win32

    我觉得这个问题有一个明显的答案 但它一直在逃避我 我这里有一些 C 遗留代码 当它尝试调用 OpenThread 时 这些代码会中断 我在 Visual C 2008 Express Edition 中运行它 程序首先获取调用线程的 Thr
  • 过程没有参数并且提供了参数 3

    存储过程返回一个值 ALTER PROCEDURE dbo spCaller AS BEGIN DECLARE URL nvarchar 255 EXECUTE spBuscarUrl MIREX 2017 00001 url URL OU
  • Jenkins + Git:仅当 PR 在子目录中引入更改时才构建

    我们有一个大型 monorepo 其中包含多个项目 A 和 B 我目前将 Jenkins 设置为多分支管道项目 用于监视 monorepo 的 PR 如果创建了 PR Jenkins 会同时构建 A 和 B 现在 我希望 Jenkins 变
  • 解析if-else if语句算法

    我正在尝试为 if else 类型结构创建一个非常简单的解析器 它将构建并执行 SQL 语句 我不会测试执行语句的条件 而是测试构建字符串的条件 声明的一个例子是 select column1 from if VariableA Case1
  • 方法内部的 self 有什么意义?

    我正在七周内阅读七种编程语言 其中一个问题指出 你会如何改变 回来0如果分母为零 我首先尝试定义自己的 并将其实现代理到原始的 像这样的方法 Number oldSlash Number getSlot Number method x Nu
  • 如何在 Swift 4 中连接 Socket

    我想将我的应用程序连接到套接字 这里是代码 import UIKit import SocketIO class SocketIOManager NSObject static let manager SocketManager socke
  • 地理编码 API 有多少请求是免费的?

    我想使用 Google Geocoding API 从纬度 经度获取地址 为此 我想知道 使用免费帐户可以完成多少次点击 下面的链接显示了每 24 小时内 2 500 个免费请求 Google 地理编码 API 免费吗 https stac
  • 在专有软件中使用 Glassfish 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在 CDDL GPLv2 许可证下的专有软件中使用 Glassfish 的某些部分 我可以这样做吗 我没有修改这些库的代码中的任何内容
  • 如何在我的 ASP.NET 菜单中使用 Bootstrap 风格的 BreadCrumb?

    我是一名新的 ASP NET 开发人员 也是 Twitter Bootstrap 的新用户 我试图在我的 ASP NET 应用程序中添加面包屑导航 我已经开发了它 但我正在尝试在其上应用 Twitter Breadcrumb 的风格 将特定
  • WebAPI POST [FromBody] 未绑定

    我将 JSON 发布到 WebAPI 控制器 但模型上的属性未绑定 public void Post FromBody Models Users User model throw new Exception model Id ToStrin
  • 如何指示 GCC 在出现 5 个错误后停止?

    是否可以指示 GNU c 编译器在发现 5 个错误后停止 在文档中找不到这个 命令行选项 fmax errors N https gcc gnu org onlinedocs gcc 4 6 0 gcc Warning Options ht
  • 在 MATLAB 中将 ASCII 代码转换为字符串

    如果我在 matlab 中有一个字符串 我可以使用以下命令将其转换为 ASCII 代码向量double gt gt my string asd gt gt double my string ans 97 115 100 我怎样才能从另一条路
  • 如何找到张量对象中每一行的最大索引?

    因此 我正在创建一个 pytorch 模型 对于前向传递 我应用前向传递方法来获取包含每个类别的预测分数的分数张量 该张量的形状为 100 10 现在 我想通过将其与包含实际分数的 y 进行比较来获得准确性 该张量的形状为 100 为了比较
  • 玩2.5 Ebean和JPA:NoSuchMethodError

    我在将项目迁移到 Play 2 5 时遇到了另一个问题 其中一个项目同时使用 Ebean 和 JPA 这是build sbt name Project version 1 0 SNAPSHOT lazy val root project i
  • getParcelable() 由于 AGP 8 中的 ifTable 为空而崩溃

    我最近更新到了 AGP 8 并在 Play 商店上发布了更新 我收到一些最近未更改的代码区域发生崩溃的报告 我相当有信心这是由 AGP 8 升级引起的崩溃 特别是在 R8 全模式周围 崩溃周围的代码正在恢复布局管理器的状态 恢复代码 if
  • 如何使用 SQL 命令在 C# 中实现此计划?

    我有两张桌子 表 1 带栏name markaz nvarchar 100 code markaz nchar 20 表 2 带栏name markaz nvarchar 100 code markaz nchar 20 我想实现这个计划
  • 按钮上的 KeyboardAwareScrollView

    我在屏幕底部有一个按钮 在屏幕顶部有一个输入字段 什么时候