Android中有个Bug,在设置getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);为全屏状态下点击输入框显示键盘时,界面并不会重新渲染调整位置,android:windowSoftInputMode="adjustResize"在FullScreen下没有作用。

       找了很久才找到解决方法,该方法是在Activity onCreate时通过ViewTreeObserver注册GlobalLayoutListener监听,当全局布局改变时会触发该监听。下面是代码部分:

package com.maituo.sdk.util;import android.app.Activity;import android.graphics.Rect;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.view.ViewTreeObserver;import android.widget.FrameLayout;public class AndroidBug5497Workaround {    // 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.//    public static void assistActivity (Activity activity) {//        new AndroidBug5497Workaround(activity);//    }    private View mContent;    private int usableHeightPrevious;    private LayoutParams layoutParams;    public static void assistView(View v){    new AndroidBug5497Workaround(v);    }        public static void assistActivity (Activity activity) {        new AndroidBug5497Workaround(activity);    }        private AndroidBug5497Workaround(Activity activity){     FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);     mContent = content.getChildAt(0);     addGlobalLayoutListener(mContent);           }    //有时通过Activity获取view并不能满足,所以我加了直接传view的一个构造方法满足用到Fragment的情况    private AndroidBug5497Workaround(View v) {        //FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);       // mChildOfContent = content.getChildAt(0);    addGlobalLayoutListener(v);        }        private void addGlobalLayoutListener(View v){    mContent = v;    mContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            public void onGlobalLayout() {                possiblyResizeChildOfContent();            }        });    //  LayoutParams放在这里有可能得到的为空    //  LayoutParams =  mContent.getLayoutParams();    }    private void possiblyResizeChildOfContent() {        int usableHeightNow = computeUsableHeight();        if (usableHeightNow != usableHeightPrevious) {        layoutParams = mContent.getLayoutParams();            int usableHeightSansKeyboard = mContent.getRootView().getHeight();            int heightDifference = usableHeightSansKeyboard - usableHeightNow;            if (heightDifference > (usableHeightSansKeyboard/4)) {                // keyboard probably just became visible             layoutParams.height = usableHeightSansKeyboard - heightDifference;            } else {                // keyboard probably just became hidden            layoutParams.height = usableHeightSansKeyboard;            }            mContent.requestLayout();            usableHeightPrevious = usableHeightNow;        }    }    private int computeUsableHeight() {        Rect r = new Rect();        mContent.getWindowVisibleDisplayFrame(r);        return (r.bottom - r.top);    }}

只要调用AndroidBug5497Workaround.assistActivity(activity)或AndroidBug5497Workaround.assistView(view)就可以了


更多相关文章

  1. Android SDK4.0 离线安装方法
  2. Android 全屏显示的两种方法
  3. Android中设置文本颜色的三种方法
  4. Android P(api28) 不支持 http 协议解决方法
  5. 三步搞定:Vue.js调用Android原生方法
  6. android 防止键盘弹出的简单方法
  7. Android高手进阶教程(十七)之---Android中Intent传递对象的两种
  8. Android的消息机制,用Android线程间通信的Message机制,Android中Ha

随机推荐

  1. cocos2d-x eclipse android 配置注意项(
  2. Android作为CXF客户端调用服务端。
  3. [置顶] 近百android开源项目贡献
  4. Android(安卓)创建,验证和删除桌面快捷方
  5. Android(安卓)Audio代码分析13 - AudioTr
  6. Android中build target,minSdkVersion,targ
  7. Android小技巧&Android(安卓)Studio快捷
  8. Android(安卓)与H5交互心得(Base64图片)
  9. Android(安卓)SystemUI状态栏添加图标
  10. Android设置背景图像重复【整理自网络】