如何解决软键盘弹出引起的各种不适

Android打开软键盘将按钮或布局顶在软键盘的上方 在日常开发过程中经常会遇到提交保存等需求,例如在相对布局中上方有若干个输入框,提交保存按钮在布局的最下方,我们在输入完全部信息后,想要点击提交必须手动关闭软键盘,此时按钮是被遮挡状态,交互很不友好。以上就是今天要讲的内容,本文简单介绍了如何将在打开软键盘的时候将按钮顶在软键盘的上方。 阅读详情

原文链接:http://unicorn25.iteye.com/blog/916504

在做登录和注册页面的时候,经常会遇到诸如软键盘挡住输入框的情况,android为此提供了一系列的的配置参数供选择,你可以在androidmanufist.xml的对应Activity的windowSoftInputMode属性中选择如下4者之一进行配置(紫色字):



       <activity android:name=".LoginAc"
 
                  android:label="@string/app_name"
                  android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

四个参数意思如下:

SOFT_INPUT_ADJUST_NOTHING:         不调整(输入法完全直接覆盖住,未开放此参数)

SOFT_INPUT_ADJUST_PAN:                 把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间,见图1

SOFT_INPUT_ADJUST_RESIZE:            整个Layout重新编排,重新分配多余空间,见图2

SOFT_INPUT_ADJUST_UNSPECIFIED:  系统自己根据内容自行选择上两种方式的一种执行(默认配置)


这里的多余空间指的是控件们通过weight分配机制得到的额外空间。


图1


图2


图3

代码实现方式为:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

但是,这样的配置方法一般都很难完全满足需要,有得应用会做得比较好,让顶上去的Layout能够通过scrollbar滚动。这种解决方法网上有各种介绍,本人也是第一时间从网上找解决方法参考,但最终发现都并未把原理说清,而且大多数有错误,或者有多余配置,于是,我从android系统中源码中找参考案例,在Email应用中,找到了我想要的。效果如图4,5。


图4


图5

其对应的Activity是AccountSetupBasics.java,对应的xml文件为account_setup_basics.xml。

来学习下它的xml写法


<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:scrollbarStyle="outsideInset" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical" >
            <TextView
                android:id="@+id/instructions"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dip"
                android:textSize="20sp"
                android:text="@string/accounts_welcome"
                android:textColor="?android:attr/textColorPrimary" />
            <View
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1" />
            <EditText
                android:id="@+id/account_email"
                android:hint="@string/account_setup_basics_email_hint"
                android:inputType="textEmailAddress"
                android:imeOptions="actionNext"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" />
            <EditText
                android:id="@+id/account_password"
                android:hint="@string/account_setup_basics_password_hint"
                android:inputType="textPassword"
                android:imeOptions="actionDone"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:nextFocusDown="@+id/next" />
            <CheckBox
                android:id="@+id/account_default"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:text="@string/account_setup_basics_default_label"
                android:visibility="gone" />
            <View
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1" />
        </LinearLayout>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="54dip"
            android:background="@android:drawable/bottom_bar" >
            <Button
                android:id="@+id/manual_setup"
                android:text="@string/account_setup_basics_manual_setup_action"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:minWidth="@dimen/button_minWidth"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true" />
            <Button
                android:id="@+id/next"
                android:text="@string/next_action"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:minWidth="@dimen/button_minWidth"
                android:drawableRight="@drawable/button_indicator_next"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true" />
        </RelativeLayout>
    </LinearLayout>
</ScrollView>

1  它完全把ScrollView作为了一个根Layout,而不是网上好多文章写的在一个Linearlayout里面嵌入一个ScrollView(貌似这种是行不通的)。

然后把我们原来的根Layout搬入ScrollView(ScrollView只能有一个子控件),我查了下androidmanifist.xml和代码,未做任何以上2种方法的配置。

2  它定义了2个0dip的View帮助分配空间(设置其weight吃掉剩余空间,保证输入框处于界面中心位置),可以猜测出这里系统调用的是SOFT_INPUT_ADJUST_RESIZE参数,当所有有实际内容的控件空间总和超出特定范围时,ScrollView开始发挥作用。

 

如此,完美的解决我们遇到的问题。

另外,网上有人说想用SOFT_INPUT_ADJUST_RESIZE ,但又不希望背景图片被压缩,只要按如上方法把Linearlayout的背景图片设置好即可。



ScrollView内部嵌套EditText ScrollView内部嵌套EditText正常滑动 立即下载

相关推荐

Android键盘面板冲突 布局闪动处理方案(聊天界面键盘冲突)

Android键盘面板冲突 布局闪动处理方案(聊天界面键盘冲突),解决切换冲突、解决全屏切换冲突

android代码禁用软键盘,Android 禁用软键盘

InputMethodManagerimm=(InputMethodManager)getActivity().getSystemService(Context.);imm.hideSoftInputFromWindow(xx.getWindowToken(),);xx为EditText控件getWindow().setSoftInputMode(WindowManager.LayoutP...

weixin_34226447的博客 1809

Windows10检查Cuda和cuDNN是否安装成功?

简介:根据上篇博客已经完成了CUDA和cuDNN的安装步骤,完成对其的安装。下面将来检查它们是否安装成功。 1 .首先win+R进入CMD,在命令行输入nvcc -V,如下图所示,则表示cuda已经安装成功。 2 .进入到cuda的安装路径,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite,找到如下两个.exe文件: 首先执行:deviceQuery.exe,查看是否出现如下界面: 然后执行bandwid

jhsignal的博客 14万+

Android软键盘windowSoftInputMode的使用与原理(原理篇)

上一篇文章介绍了windowSoftInputMode各个属性的具体作用,下面我们在源码层面来分析一下各个属性的实现原理(基于Android9)。

一只特立独行的猪 6197

华为海思2026届数字IC秋招笔试真题解析与实战技巧(2025最新版)

本文深度解析华为海思2026届数字IC秋招笔试真题,涵盖高频考点如后端设计、低功耗设计、SystemVerilog语法等核心内容。提供时序违例修复、时钟树综合等实战技巧,帮助考生高效备考。特别关注UPF低功耗设计规范等最新考点,助力考生在秋招笔试中脱颖而出。

lg888的博客 1088

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 294

键盘弹出迟钝

在开发中遇到键盘弹出时反应迟钝一般是因为使用了第三方键盘,像搜狗输入法这种第三方键盘,比系统键盘耗时,原因是:因为第三方键盘或者是在键盘加个toolbar会导致执行三次,可以使用代码去判断 CGRect begin = [[[note userInfo] objectForKey:@"UIKeyboardFrameBeginUserInfoKey"] CGRectValue];

H个MJ的博客 1105

ADS124S08配置避坑指南:从SPI时序到寄存器设置,手把手教你调通24位ADC

本文详细解析了ADS124S08 24位ADC的SPI时序配置、寄存器设置及外围电路设计中的关键细节,帮助工程师避开常见陷阱。从SPI通信模式选择到DRDY引脚读取优化,再到基准电压启动时间调整,提供了实战验证的解决方案,确保高精度数据采集的稳定性。

weixin_29192365的博客 285

Android软键盘弹出引起的各种不适终极解决方案

很多写登录界面的开发者都会遇到一个问题:那就是在登录界面时,当你点击输入框时,下边的按钮有时会被输入框挡住,这个不利于用户的体验,所以很多人希望软键盘弹出时,也能把按钮挤上去。很多开发者想要监听键盘的状态,这无疑是一个很麻烦的做法。        我们可以在AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjust

Android进阶三部曲 - 刘望舒 8万+

Bresenham画圆算法在嵌入式屏幕(如ILI9806G)上的实战:从C代码到单片机显示

本文详细介绍了Bresenham画圆算法在嵌入式屏幕(如ILI9806G)上的高效实现与优化方法。通过整数化改造和针对STM32等微控制器的特殊优化,显著提升了图形显示性能,适用于资源受限的嵌入式系统开发。文章还分享了实心圆与空心圆的实现策略及实战经验。

weixin_33712987的博客 390

【Python3教程】Python3高级篇之uWSGI 安装配置

本文介绍了在Python 3环境中安装和配置uWSGI的完整流程,涵盖基本安装、Flask/Django应用部署、Nginx集成以及systemd管理等关键环节。主要内容包括:uWSGI的安装前提条件,创建简单WSGI应用,编写uWSGI配置文件(.ini格式),与Nginx配合实现生产环境部署,以及使用systemd实现服务管理。文章还提供了常见Web框架(Flask、Django)的部署示例和高级配置建议,如负载均衡、HTTPS设置等。最后列出了权限、端口占用等常见问题的解决方案,为开发者提供了一套完整

No8g攻城狮的博客 437

android软键盘弹出引起的各种不适终极解决方案

很多写登录界面的开发者都会遇到一个问题:那就是在登录界面时,当你点击输入框时,下边的按钮有时会被输入框挡住,这个不利于用户的体验,所以很多人希望软键盘弹出时,也能把按钮挤上去。很多开发者想要监听键盘的状态,这无疑是一个很麻烦的做法。        我们可以在AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adju

pClass的专栏 1257

《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第3章数据同步

我们将数据釆集分为日志采集和数据库数据同步两 部分。数据同步技术更通用的含义是不同系统间的数据流转,有多种不 同的应用场景。主数据库与备份数据库之间的数据备份,以及主系统与 子系统之间的数据更新,属于同类型不同集群数据库之间的数据同步。 另外,还有不同地域、不同数据库类型之间的数据传输交换,比如分布 式业务系统与数据仓库系统之间的数据同步。对于大数据系统来说,包 含数据从业务系统同步进入数据仓库和数据从数据仓库同步进入数据 服务或数据应用两个方面。本章侧重讲解数据从业务系统同步进入数据 仓库这个环节,但其适

m0_54252387的博客 961

解决Android软键盘弹出引起的各种不适

在做输入信息页面的时候,经常会遇到键盘挡住输入框或者将一些控件顶起的情况,android为此提供了一系列的的配置参数供选择,可以在androidmanufist.xml的对应Activity的windowSoftInputMode属性中进行配置: 详细说明这四个参数:   int SOFT_INPUT_ADJUST_NOTHING

MapleShao 3769

Linux安装Docker(图文解说详细版)

第一步,下载docker 下载地址: https://download.docker.com/linux/static/stable/x86_64/ 这次的演示我们使用docker-18.06.3-ce.tgz 这个版本 第二步,上传到云服务器上面 使用rz命令上传或者fltp工具进行上传 第三步,解压文件 第四步,将解压出来的docker文件复制到 /usr/bin/ 目录下 这么做的目的是将docker交给linux自己去管理,类似spring中的ioc(猜测,非正经知识) cp docker

编码人生 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

android软键盘弹出引起的各种不适终极解决方案,android软键盘弹出引起的各种不适终极解决方案...

以下描述如何解决ListView高度小于0时出现的UI问题。创建RelativeLayout的子类TxrjRelativeLayoutpublic class TxrjRelativeLayout extends RelativeLayout {private int count = 0;public TxrjRelativeLayout(Context context, AttributeSet...

weixin_29864813的博客 513

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 陈跃峰博客总结
下一篇: Android 根据屏幕大小设置字体
coding_or_coded
博客等级 码龄16年 216粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值