显示软键盘,并让布局压缩

2018-12-09 18:12:45

如果在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);

                }

            }

        });

    }



  • 2018-12-02 10:54:14

    HTTP长连接、短连接究竟是什么?

    HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

  • 2018-12-04 15:30:01

    如何在Mac OS X上安装 Ruby运行环境

    ​ 对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境。 此安装方法同样适用于产品环境!

  • 2018-12-04 15:31:15

    iOS--Pod install && Pod update

    许多人在最初接触CocoaPods时认为pod install只是在第一次为项目设置CocoaPods时使用,之后都应该使用pod update.看起来是这样,但也不是(But that's not the case at all.)。 这篇文章的目的就是教你啥时候用pod install,啥时候用pod update

  • 2018-12-04 15:33:19

    CocoaPods安装和使用教程

    当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。总之小编的意思就是,手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能解决这些恼人的问题,那将“善莫大焉”。所以,你需要 CocoaPods。

  • 2018-12-04 23:37:37

    pod install 和 pod update

    当我们新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件,Podfile.lock文件里存储着我们已经安装的依赖库(pods)的版本。 当我们第一次运行Podfile时,如果对依赖库不指定版本的话,cocoapods会安装最新的版本,同时将pods的版本记录在Podfile.lock文件中。这个文件会保持对每个pod已安装版本的跟踪,并且锁定这些版本。

  • 2018-12-04 23:40:26

    pod删除已导入的第三方库和移除项目中的cocoapods

    CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。在我们有了CocoaPods这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数. 但是如果我们导入的某个第三方不适用,或者我们又不想使用该第三方,那我们又该如何将这些相关的东西从我们的项目中清理出去呢?

  • 2018-12-04 23:41:47

    制作自己的Pod库(公有/私有)

    目的:1.管理自己常用的类;2.组件化开发步骤:1.想一个比较酷的名字,在桌面简历文件夹。2.打开terminal,cd到这个文件夹下面,执行pod lib create  xxx(这里我们以JJCategoryKit为例子,下同)命令,如下图。这个过程会问几个问题,根据实际情况输入回答即可。这里我们选择添加demo,结束的时候会自动Lanuch这个app. 作者:深水日月 链接:https://www.jianshu.com/p/ece0b5721461 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。