解决listview item中有edittext时,弹出框覆盖edittext的问题,需求是软件盘弹出时,把edittext布局推上去

Android的输入法弹出问题,一直是困扰很多开发人员的问题,当输入法弹出时,布局会被压缩,某些控件被遮挡住,但是需求可能并不想让该控件遮挡住,在做输入法的时候,你一定要知道这个属性,android:windowSoftInputMode,他有三个属性,分别是adjustUnspecified,adjustResize,adjustPan。我建议最好不要用默认的,即adjustUnspecified。关于更多这三个属性的知识,我之前的一个博客写的很详细,地址是:http://blog.csdn.net/harryweasley/article/details/49124385

如下图所示: 
这里写图片描述

当输入法弹出来的时候,会遮盖住登录按钮,但是我现在并不想输入法遮盖住登录按钮,同时希望背景也不会被压缩。

现在的需求是,当输入法弹出后,登录以上的布局(包括登录)向上移动到输入法之上,并且,背景不会被压缩。

如下所示: 
这里写图片描述

如果想让弹出的输入法,保证界面背景图不被压缩,那么一定要使用adjustPan属性。

看如下图所示的分析: 
这里写图片描述

一个简单的模型,当输入法弹出的时候,可能登录按钮已经被遮盖住,那么我们只需要让登录按钮以上的布局通过scrollTo方式上移他被遮盖的距离就行了。

下面开始贴代码,代码很简单,先是布局文件:

<span style="color:#000000"><code><span style="color:#006666"><?xml version="1.0" encoding="utf-8"?></span>
<span style="color:#006666"><<span style="color:#4f4f4f">LinearLayout</span> <span style="color:#4f4f4f">xmlns:android</span>=<span style="color:#009900">"http://schemas.android.com/apk/res/android"</span>
    <span style="color:#4f4f4f">android:id</span>=<span style="color:#009900">"@+id/root"</span>
    <span style="color:#4f4f4f">android:layout_width</span>=<span style="color:#009900">"fill_parent"</span>
    <span style="color:#4f4f4f">android:layout_height</span>=<span style="color:#009900">"fill_parent"</span>
    <span style="color:#4f4f4f">android:orientation</span>=<span style="color:#009900">"vertical"</span>
    <span style="color:#4f4f4f">android:gravity</span>=<span style="color:#009900">"center_vertical"</span> 
    <span style="color:#4f4f4f">android:background</span>=<span style="color:#009900">"@drawable/update_empty"</span>></span>

    <span style="color:#006666"><<span style="color:#4f4f4f">EditText</span> <span style="color:#4f4f4f">android:layout_width</span>=<span style="color:#009900">"fill_parent"</span>
        <span style="color:#4f4f4f">android:layout_height</span>=<span style="color:#009900">"50dip"</span>
        <span style="color:#4f4f4f">android:hint</span>=<span style="color:#009900">"edit1"</span>/></span>
    <span style="color:#006666"><<span style="color:#4f4f4f">EditText</span> <span style="color:#4f4f4f">android:layout_width</span>=<span style="color:#009900">"fill_parent"</span>
        <span style="color:#4f4f4f">android:layout_height</span>=<span style="color:#009900">"50dip"</span>
        <span style="color:#4f4f4f">android:hint</span>=<span style="color:#009900">"edit2"</span>/></span>
    <span style="color:#006666"><<span style="color:#4f4f4f">EditText</span> <span style="color:#4f4f4f">android:layout_width</span>=<span style="color:#009900">"fill_parent"</span>
        <span style="color:#4f4f4f">android:layout_height</span>=<span style="color:#009900">"50dip"</span>
        <span style="color:#4f4f4f">android:hint</span>=<span style="color:#009900">"edit3"</span>/></span>
    <span style="color:#006666"><<span style="color:#4f4f4f">Button</span> <span style="color:#4f4f4f">android:id</span>=<span style="color:#009900">"@+id/submit"</span>
        <span style="color:#4f4f4f">android:layout_width</span>=<span style="color:#009900">"fill_parent"</span>
        <span style="color:#4f4f4f">android:layout_height</span>=<span style="color:#009900">"50dip"</span>
        <span style="color:#4f4f4f">android:text</span>=<span style="color:#009900">"submit"</span>/></span>

<span style="color:#006666"></<span style="color:#4f4f4f">LinearLayout</span>></span></code></span>

接下来就是ManiActivity里的代码了,里面写了很详尽的注释,上面也解释了一些:

<span style="color:#000000"><code><span style="color:#000088">package</span> com.example.myandrtest;

<span style="color:#000088">import</span> android.app.Activity;
<span style="color:#000088">import</span> android.graphics.Rect;
<span style="color:#000088">import</span> android.os.Bundle;
<span style="color:#000088">import</span> android.util.Log;
<span style="color:#000088">import</span> android.view.View;
<span style="color:#000088">import</span> android.view.ViewTreeObserver.OnGlobalLayoutListener;
<span style="color:#000088">import</span> android.widget.Button;
<span style="color:#000088">import</span> android.widget.LinearLayout;

<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">MainActivity</span> <span style="color:#000088">extends</span> <span style="color:#4f4f4f">Activity</span> {

    <span style="color:#000088">private</span> LinearLayout linearLayout;
    <span style="color:#000088">private</span> Button mSubmit;

    <span style="color:#9b859d">@Override</span>
    <span style="color:#000088">protected</span> <span style="color:#000088">void</span> <span style="color:#009900">onCreate</span>(Bundle savedInstanceState) {
        <span style="color:#000088">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        linearLayout = (LinearLayout) findViewById(R.id.root);
        mSubmit = (Button) findViewById(R.id.submit);
        controlKeyboardLayout(linearLayout, mSubmit);

    }

    <span style="color:#880000">/**
     *<span style="color:#4f4f4f"> @param</span> root
     *            最外层布局,需要调整的布局
     *<span style="color:#4f4f4f"> @param</span> scrollToView
     *            被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
     */</span>
    <span style="color:#000088">private</span> <span style="color:#000088">void</span> <span style="color:#009900">controlKeyboardLayout</span>(<span style="color:#000088">final</span> View root, <span style="color:#000088">final</span> View scrollToView) {
        <span style="color:#880000">// 注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。</span>
        root.getViewTreeObserver().addOnGlobalLayoutListener(
                <span style="color:#000088">new</span> OnGlobalLayoutListener() {
                    <span style="color:#9b859d">@Override</span>
                    <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">onGlobalLayout</span>() {
                        Rect rect = <span style="color:#000088">new</span> Rect();
                        <span style="color:#880000">// 获取root在窗体的可视区域</span>
                        root.getWindowVisibleDisplayFrame(rect);
                        <span style="color:#880000">// 当前视图最外层的高度减去现在所看到的视图的最底部的y坐标</span>
                        <span style="color:#000088">int</span> rootInvisibleHeight = root.getRootView()
                                .getHeight() - rect.bottom;
                        Log.i(<span style="color:#009900">"tag"</span>, <span style="color:#009900">"最外层的高度"</span> + root.getRootView().getHeight());
                        <span style="color:#880000">// 若rootInvisibleHeight高度大于100,则说明当前视图上移了,说明软键盘弹出了</span>
                        <span style="color:#000088">if</span> (rootInvisibleHeight > <span style="color:#006666">100</span>) {
                            <span style="color:#880000">//软键盘弹出来的时候</span>
                            <span style="color:#000088">int</span>[] location = <span style="color:#000088">new</span> <span style="color:#000088">int</span>[<span style="color:#006666">2</span>];
                            <span style="color:#880000">// 获取scrollToView在窗体的坐标</span>
                            scrollToView.getLocationInWindow(location);
                            <span style="color:#880000">// 计算root滚动高度,使scrollToView在可见区域的底部</span>
                            <span style="color:#000088">int</span> srollHeight = (location[<span style="color:#006666">1</span>] + scrollToView
                                    .getHeight()) - rect.bottom;
                            root.scrollTo(<span style="color:#006666">0</span>, srollHeight);
                        } <span style="color:#000088">else</span> {
                            <span style="color:#880000">// 软键盘没有弹出来的时候</span>
                            root.scrollTo(<span style="color:#006666">0</span>, <span style="color:#006666">0</span>);
                        }
                    }
                });
    }
}
</code></span>

同时,Manifest里面的activity里,一定要是 android:windowSoftInputMode=”adjustPan”

<span style="color:#000000"><code><span style="color:#006666"><?xml version="1.0" encoding="utf-8"?></span>
<span style="color:#006666"><<span style="color:#4f4f4f">manifest</span> <span style="color:#4f4f4f">xmlns:android</span>=<span style="color:#009900">"http://schemas.android.com/apk/res/android"</span>
    <span style="color:#4f4f4f">package</span>=<span style="color:#009900">"com.example.myandrtest"</span>
    <span style="color:#4f4f4f">android:versionCode</span>=<span style="color:#009900">"1"</span>
    <span style="color:#4f4f4f">android:versionName</span>=<span style="color:#009900">"1.0"</span> ></span>

    <span style="color:#006666"><<span style="color:#4f4f4f">uses-sdk
</span>        <span style="color:#4f4f4f">android:minSdkVersion</span>=<span style="color:#009900">"15"</span>
        <span style="color:#4f4f4f">android:targetSdkVersion</span>=<span style="color:#009900">"15"</span> /></span>

    <span style="color:#006666"><<span style="color:#4f4f4f">application
</span>        <span style="color:#4f4f4f">android:allowBackup</span>=<span style="color:#009900">"true"</span>
        <span style="color:#4f4f4f">android:icon</span>=<span style="color:#009900">"@drawable/ic_launcher"</span>
        <span style="color:#4f4f4f">android:label</span>=<span style="color:#009900">"@string/app_name"</span>
        <span style="color:#4f4f4f">android:theme</span>=<span style="color:#009900">"@style/AppTheme"</span> ></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">activity
</span>            <span style="color:#4f4f4f">android:name</span>=<span style="color:#009900">".MainActivity"</span>
            <span style="color:#4f4f4f">android:label</span>=<span style="color:#009900">"@string/app_name"</span>
            <span style="color:#4f4f4f">android:windowSoftInputMode</span>=<span style="color:#009900">"adjustPan"</span>
             ></span>
            <span style="color:#006666"><<span style="color:#4f4f4f">intent-filter</span>></span>
                <span style="color:#006666"><<span style="color:#4f4f4f">action</span> <span style="color:#4f4f4f">android:name</span>=<span style="color:#009900">"android.intent.action.MAIN"</span> /></span>

                <span style="color:#006666"><<span style="color:#4f4f4f">category</span> <span style="color:#4f4f4f">android:name</span>=<span style="color:#009900">"android.intent.category.LAUNCHER"</span> /></span>
            <span style="color:#006666"></<span style="color:#4f4f4f">intent-filter</span>></span>
        <span style="color:#006666"></<span style="color:#4f4f4f">activity</span>></span>
    <span style="color:#006666"></<span style="color:#4f4f4f">application</span>></span>

<span style="color:#006666"></<span style="color:#4f4f4f">manifest</span>></span>
</code></span>

本文章参考文章地址为:http://www.cnblogs.com/kobe8/p/4030412.html

文章标签: android输入法布局输入法弹出压缩

猜你喜欢

转载自blog.csdn.net/u014644594/article/details/81182731