Android关于adjustResize无效,监听软键盘的隐藏显的解决方案

原创 2015年07月10日 23:54:55

Hi,大家好。

本人第一次写Blog,先输出个Hello World。得意欢迎老鸟指点哦


点进这个链接的朋友相信大部分都想第一时间看到解决方案吧,就不废话了。进入正题


<activity
    android:name=".MainActivity"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="adjustResize|stateVisible" android:screenOrientation="portrait" />
设置了 adjustResize 在Activity中却没有任何作用,不会出现想象中的结果。
adjustResize 软键盘出来时,挤压布局


为什么会无效呢?

其实这个原因是属于Android系统的一个Bug,Google到了现在还没解决。既然是系统的,具体原因就需要了问Google大笑

这个问题会在设置 Activity 为全屏时出现。
注意:
1、Android 版本 >= 18时,并且配置 <item name="android:windowTranslucentStatus">true</item>
2、Android 版本 >= 21时,使用了Material主题。
以上2个原因会变相的导致Activity为全屏,所以也会出现布局没有任何反应的情况。


既然它不给我们改变布局,那我们就自己去改变布局。
里面还带了键盘 显示与隐藏的监听,亲测可靠。

解决方案

在Activity.setContentView()调用assistActivity方法即可,如下:

	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_main);
	    AndroidBugsSolution.assistActivity(this, this);
	}

代码:
import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;

/**
 * Created by husj1 on 2015/7/7.
 */
public class AndroidBugsSolution {

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    /**
     * 关于 全屏Activity adjustResize属性无效解决方案
     * 在Activity setContentView 之后调用
     *
     * @param activity
     * @param listener 软键盘显示隐藏监听, 可以为空
     */
    public static void assistActivity(Activity activity, OnKeyboardListener listener) {
        boolean subOffset = false;
        if (Build.VERSION.SDK_INT < 18) {
            subOffset = true;
        }
        new AndroidBugsSolution(activity, subOffset, listener);
    }

    private boolean mSubOffset;
    private int mCurrHeight;
    private Rect mRootRect;
    private View mContentView;
    private LayoutParams mLayoutParams;
    private OnKeyboardListener mListener;

    /**
     *
     * @param activity
     * @param isSubOffset 是否需要偏移
     * @param listener 软键盘监听 监听隐藏,显示
     */
    private AndroidBugsSolution(final Activity activity, boolean isSubOffset, OnKeyboardListener listener) {
        this.mSubOffset = isSubOffset;
        this.mListener = listener;
        this.mContentView = ((FrameLayout) activity.findViewById(android.R.id.content)).getChildAt(0);
        this.mLayoutParams = (LayoutParams) mContentView.getLayoutParams();
        this.mContentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        activity.getWindow().getDecorView().getRootView().getWindowVisibleDisplayFrame(mRootRect = new Rect());
    }

    private void possiblyResizeChildOfContent() {
        Rect r = new Rect();
        mContentView.getWindowVisibleDisplayFrame(r);
        int usableHeightNow = r.height();
        // Log.i("III", "usableHeightNow " + usableHeightNow + ", r " + r.toString());
        if (usableHeightNow != mCurrHeight) {
            int usableHeightSansKeyboard = r.bottom;
            if(mSubOffset) {
                usableHeightSansKeyboard -= r.top;
            }
            // android.util.Log.i("III", "usableHeightSansKeyboard " + usableHeightSansKeyboard + ", r " + r.toString());
            // keyboard probably just became hidden
            mLayoutParams.height = usableHeightSansKeyboard;
            if (mListener != null) {
                if (mRootRect.bottom != r.bottom) {
                    mListener.onKeyboardChanged(OnKeyboardListener.SHOW);
                } else {
                    mListener.onKeyboardChanged(OnKeyboardListener.HIDE);
                }
            }

            mContentView.requestLayout();
            mCurrHeight = usableHeightNow;
        }
    }

    public interface OnKeyboardListener {
        int SHOW = 1;
        int HIDE = 0;

        void onKeyboardChanged(int state);
    }
}

以上代码基本可以解决问题,如果有问题,可以留言哦。

这个问题会在 Activity 为全屏时出现。
注意:
1、Android 版本 >= 18时,并且配置 <item name="android:windowTranslucentStatus">true</item>。 时,
其实这个时候,Activity可以说是也全屏的,所以也会出现这个问题。

2、Android版本 >= 21时,使用了Material主题。

android 软键盘挡住输入内容,adjustResize设置了也无效

键盘弹出时,会将布局底部的导航条顶上去。 先给出很多文章中给出的解决办法如下: 在mainfest.xml中,在和导航栏相关的activity中加: ? ...
  • zhuawalibai
  • zhuawalibai
  • 2017年08月04日 10:43
  • 278

如何监听软键盘的弹出、隐藏(亲测可用)

看了N多文章,终于找到了答案第一步这篇文章解决了在不是全屏模式下,监听软键盘弹出隐藏,但是在全屏模式下,无效 注意:必须设置 android:windowSoftInputMode="adj...
  • Android_Study_OK
  • Android_Study_OK
  • 2016年09月24日 00:55
  • 4901

关于全屏模式adjustResize不起作用解决办法(特别是有虚拟键盘的)

关于全屏模式adjustResize不起作用解决办法, 本来借用官方的AndroidBug5497Workaround 就能解决问题,可是可恨的国产机 华为荣耀就是有问题,会导致底部的TabBar经常...
  • lovexjyong
  • lovexjyong
  • 2016年05月24日 14:37
  • 2492

解决android 软键盘在全屏下设置adjustResize无效的问题

全屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize,在键盘显示时它未将Activity的Screen向上推动,所以你Activity的vi...
  • xiechengfa
  • xiechengfa
  • 2016年04月11日 16:30
  • 5639

Android 监听软键盘显示隐藏

开发过程页面中需要监听软键盘的显示和隐藏,无可奈何Android并没有提供这样的监听。 于是乎尝试各种方法,但是结果总是令人蛋疼。 但是功夫不负有心人,最后还是找到了解决的方法: 当显示的高度大...
  • wangguangbin123
  • wangguangbin123
  • 2016年05月04日 18:57
  • 410

Android 设置状态栏后adjustResize属性无效

这两天被这个问题搞得很焦灼,今天终于解决了,在这里把自己解决的办法分享一下; 这是之前碰到的问题 如截图所示,输入框被遮住了 之前试过AndroidBug5497Workarou...
  • qq_24737357
  • qq_24737357
  • 2016年06月12日 11:44
  • 2203

Android windowSoftInputMode软键盘显示和隐藏的监听和实现

现在在公司,其实今天不用加班,但留下来写篇博客。今天做了一个关于聊天输入框和表情框的Demo,主要是为了使用软件盘的显示和隐藏。下面是效果图,(只是为了弄清原理,界面比较丑)             ...
  • u010852801
  • u010852801
  • 2015年01月27日 18:52
  • 1989

android中监听软键盘的弹出与隐藏,并获取软键盘的高度

最近项目中有一个需求上弹出软键盘的时候,输入框位移至输入框上方,但是Activity中其他的VIew都不动。这个需求需要监听软软键盘的弹出与隐藏,并获取键盘的高度。上网找了一下发现,Android竟然...
  • l448288137
  • l448288137
  • 2015年10月25日 15:17
  • 1660

android 解决沉浸式状态栏下adjustResize失效

在沉浸式状态栏下adjustResize会失效,这时候只需要在需要弹起布局的根布局中添加android:fitsSystemWindows="true"即可...
  • s13488941815
  • s13488941815
  • 2016年02月19日 17:01
  • 1607

Android判断软键盘弹出并隐藏的简单完美解决方案

最近项目中有一个编辑框,下面是个ListView。在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击。这样的体验效果很不好。于是便想在滑动或单击item时判...
  • Thare_Lam
  • Thare_Lam
  • 2015年10月14日 19:06
  • 4076
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android关于adjustResize无效,监听软键盘的隐藏显的解决方案
举报原因:
原因补充:

(最多只允许输入30个字)