美文网首页Android之界面android技术Android开发经验谈
EditText弹出软键盘遮住输入框问题

EditText弹出软键盘遮住输入框问题

作者: 张老梦 | 来源:发表于2016-07-18 01:36 被阅读13625次

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

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

    开始:

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

    1.修改AndroidManifest.xml文件.

    2.在Activity中添加配置.

    3.在布局文件中添加ScrollVie.

    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>
    

    结果:
    只要弹出软键盘会影响到布局的情况,都用ScrollView把布局包裹起来,被包裹的内容就是可能被缩放或挤出屏幕外的内容.然后根据EditText的位置判断用adjustResize还是用adjustPan.
    adjustResize是收缩adjustPan是向上挤
    个人推荐,登录注册用adjustResize,聊天窗口用adjustPan

    相关文章

      网友评论

        本文标题:EditText弹出软键盘遮住输入框问题

        本文链接:https://www.haomeiwen.com/subject/nijyjttx.html