如果在Activity中的布局的下方有EditText,获取焦点弹出软键盘的时候,如果不做处理,软键盘可能会遮挡输入框,用户提现不好,网上也有很多人提出结局方案,这里就分析一下解决的效果.

需要用到EditText的布局大概分为两种,一种是页面显示的内容不希望有残缺,比如软键盘把标题挤出了屏幕,如登录注册搜索等,EditText多半在页面上半部分.另一种是页面的上半部分不重要,比如聊天窗口,软键盘弹出的时候,上半部分的聊天记录可以被基础屏幕外,EditText多半在最下方.其他的情况可以根据本文做出选择,结果在最下面.

开始:

网上针对这个问题解决的方法大概这么几种:

1.修改AndroidManifest.xml文件

2.在Activity中添加配置

3.在布局文件中添加ScrollView

4.在布局文件中添加ScrollView,并且在activity中加入一个方法

1.修改AndroidManifest.xml文件

在AndroidManifest.xml中对应的Activity配置:android:windowSoftInputMode="stateVisible|adjustResize"

<activity
android:name=".LoginActivity"
//显示软键盘,并让布局压缩
android:windowSoftInputMode="stateVisible|adjustResize"
android:screenOrientation="portrait">
</activity>

含义:该页面在弹出软键盘的同时屏幕内容被压缩,以腾出软键盘的空间.

解释它们的含义:

  • stateUnspecified:界面没有设置"android:windowSoftInputMode"时的状态.这个状态是弹出有EditText的界面时时不弹出软键盘的,当EditText获取焦点的时候弹出软件盘
  • stateUnchanged:状态不改变,意思就是和上一个界面相同,上一个界面弹出软键盘,跳转到这个界面时,软键盘也是弹出状态.
  • stateHidden:隐藏键盘,弹出这个界面的时候,不管上个界面是什么状态,这个界面的软键盘都是隐藏的.
  • stateAlwaysHidden:一直隐藏(跟上面的区别未知,试不出来).
  • stateVisible:强制弹出软键盘.跳转到界面后,没有EditText也弹出键盘.
  • stateAlwaysVisible:一直显示键盘(同上).

这里开始就是跟内容相关的了,也跟本文也相关

  • adjustUnspecified:算是默认方式.如果界面没有被ScrowView包裹,键盘会挡住一部分内容,如果界面被ScrowView包裹了,会让ScrowView中的内容滚动,以放下软键盘.
  • adjustResize:主界面会缩放,用来放置软键盘(见[图1][图2]).

图1

图2
  • adjustPan:主界面不会缩放,会向上移来放置软键盘(见[图3][图4]).

图3

图4

上面两个不同的地方在于,如果内容是listview,当现实最下面一个item后弹出软键盘,adjustResize会让listview下沿被软键盘挡住,adjustPan则还是现实最下面一个item.

2.在Activity中添加配置

在该Activity中的onCretae()的setContentView()方法前面添加:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)

含义:把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间.

解释他们的含义:

  • SOFT_INPUT_ADJUST_NOTHING: 不调整(输入法完全直接覆盖住,未开放此参数);
  • SOFT_INPUT_ADJUST_PAN:把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间
  • SOFT_INPUT_ADJUST_RESIZE: 整个Layout重新编排,重新分配多余空间;
  • SOFT_INPUT_ADJUST_UNSPECIFIED: 系统自己根据内容自行选择上两种方式的一种执行(默认配置).

这里SOFT_INPUT_ADJUST_RESIZE和SOFT_INPUT_ADJUST_PAN和上面中的adjustResize和adjustPan效果是一样的.

@Overrideprotected
void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//让布局向上移来显示软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
setContentView(R.layout.activity_login);
init();
}

3.在布局文件中添加ScrollView

ScrollView是能让弹出的软键盘添加到布局的下面,从而不挡住部分布局.这里往往需要跟上面的adjustResize和adjustPan两个状态一起用.
布局:

<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<EditText
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
</ScrollView>

向上移的方式 设置:

<activity
android:name=".SecondActivity"
android:windowSoftInputMode="adjustPan"></activity>

压缩的方式 设置:

 <activity
android:name=".SecondActivity"
android:windowSoftInputMode="adjustResize"></activity>

4.在布局文件中添加ScrollView

ScrollView是能让弹出的软键盘添加到布局的下面,从而不挡住部分布局.这里往往需要跟上面的adjustResize和adjustPan两个状态一起用.
布局:

<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<EditText
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
</ScrollView>

在activity中调用:

private void controlKeyboardLayout(final ScrollView root, final Activity context) {
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver
.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() { Rect rect = new Rect();
root.getWindowVisibleDisplayFrame(rect);
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
//若不可视区域高度大于100,则键盘显示
if (rootInvisibleHeight > 100) {
int[] location = new int[2];
View focus = context.getCurrentFocus();
if (focus != null) {
focus.getLocationInWindow(location);
int scrollHeight = (location[1] + focus.getHeight()) - rect.bottom;
if (rect.bottom < location[1] + focus.getHeight()) {
root.scrollTo(0, scrollHeight);
}
}
} else {
//键盘隐藏
root.scrollTo(0, 0);
}
}
});
}

EditText被键盘遮得住的更多相关文章

  1. android 弹出的软键盘遮挡住EditText文本框的解决方案

    1.android 弹出的软键盘遮挡住EditText文本框的解决方案: 把Activit对应的布局文件filename.xml文件里的控件用比重设置布局.(例如:android:layout_wei ...

  2. EditText 软键盘

    EditText 软键盘 package brother.eighteen.demoedittext; import android.content.Context; import android.t ...

  3. android中edittext被键盘挡住问题

    最近开始新项目,做注册页时候由于ui布局问题,edittext被键盘挡住了. 在stackoverflow上找了一遍,有提到在对应activity中设置windowSoftInputMode, 例如: ...

  4. 安卓全屏状态下键盘充满屏幕留不出ui控件的解决办法附edittext和键盘的属性

    1.我们先看看常用和不常用的属性值(Edittext) android:inputType参数类型说明 android:inputType="none"--输入普通字符 andro ...

  5. css3软键盘不盖住输入框的方法

    css3软键盘不盖住输入框的方法 弹出软键盘的时候 最外面的容器高度就发生了变化 要减去软键盘高度了<pre>var bodyheight bodyheight = $('body').h ...

  6. listview点击控件显示EditText,键盘弹出消失的解决方法:

    1.软键盘弹出后消失解决方法 AndoridManifet 在activity中添加: android:windowSoftInputMode="adjustPan" 2.使用方式 ...

  7. Android开发之EditText利用键盘跳转到下一个输入框

    以前做项目的时候,从来没考虑过这些.这段时间公司内部用的一款APP,就出现了这个问题,在登录或者注册的时候,点击键盘的回车按钮,可以跳到下一个输入框的功能,这个属性一直也没记住,今天就把自己一直没记过 ...

  8. 安卓手机 HTML5 手机页面 输入表单被键盘遮挡住了

    TML5 手机页面 输入表单被键盘遮挡住了 请问 大神 怎么 js 或者 JQ 判断安卓手机软键盘的键盘隐藏键按下去了? 有使用 uexWindow 方法 能判断到确定键 是 13 但是不知道这个键的 ...

  9. Android EditText软键盘显示隐藏以及“监听”

    一.写此文章的起因 本人在做类似于微信.易信等这样的聊天软件时,遇到了一个问题.聊天界面最下面一般类似于如图1这样(这里只是显示了最下面部分,可以参考微信等),有输入文字的EditText和表情按钮等 ...

随机推荐

  1. WIN10 网速问题,边下载 边逛论坛 电脑 有点卡

    引用:https://www.chiphell.com/forum.php?mod=viewthread&tid=1961836&extra=page%3D1&mobile=2 ...

  2. windebug 与 office Home

    https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeStudentRetai ...

  3. 项目出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法

    1. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path ①项 ...

  4. IDEA运行tomcat8.5.35源代码

    前提环境,安装和配置好java1.8+环境,maven,IDEA 1.下载Tomcat源代码:https://tomcat.apache.org/download-80.cgi#8.5.35 2.创建 ...

  5. 国外的开源项目Shopizer部署问题

    版本:shopizer-2.2.0 项目地址:https://github.com/shopizer-ecommerce/shopizer 使用IDEA时遇到和修改的问题 1.修改数据库类型为MYSQ ...

  6. ALGO-39_蓝桥杯_算法训练_数组排序去重

    问题描述 输入10个整数组成的序列,要求对其进行升序排序,并去掉重复元素. 输入格式 10个整数. 输出格式 多行输出,每行一个元素. 样例输入 样例输出 解题思路: 若输入的数字存在数组中,剔除,否 ...

  7. 发现TCP的一种错误----客户端连接失败(10055错误号)

    在客户端连接7302TCP端口失败,关闭程序,启动sockettool也不行,出现错误号为 10055(发现队列满了或者空间不足).通过查网上资料,发现有两个方法:设置 ( TcpTimedWaitD ...

  8. OpenSSH多路复用Multiplexing配置

    设置 Session Multiplexing 在客户端节点如下配置/etc/ssh/ssh_config 或~/.ssh/config 就可以直接开启 Session Multiplexing 功能 ...

  9. Ring3创建事件Ring0设置事件

    应用程序中创建的事件和在内核中创建的事件对象,本质上是同一个东西,在用户模式中,他用句柄表示,在内核模式下,他用KEVENT表示数据结构表示.在应用程序中,所有的内核对象都不会被用户看到,用户看到的知 ...

  10. Oracle 非归档--归档操作流程

    转载自链接  https://blog.csdn.net/u013611461/article/details/53558077 SQL> shutdown immediate; Databas ...