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 apache HTTP demo 互联网访问
  2. Android(安卓)P SystemUI之StatusBar Wifi图标更新逻辑
  3. Android(安卓)SDK4.0 离线安装方法
  4. android 嵌入服务端页面二 之WebView与页面互调
  5. Android(安卓)全屏显示的两种方法
  6. Android中设置文本颜色的三种方法
  7. React Native與Android交互
  8. android的ImageSwitcher和TextSwitcher
  9. 监听Bluetooth

随机推荐

  1. 一网打尽__Android(安卓)开源代码合集(Web
  2. 【MTK】修改开机重启概率性BUG——无法正
  3. Android(安卓)Studio 之 对话框开发(Dial
  4. Android(安卓)Bluetooth opp package 学
  5. Android在onCreate或者在Fragment的onCre
  6. Android(安卓)加载等待控件 ZFProgressHU
  7. 解决-Android: 跨应用AIDL调用时报错 jav
  8. Android(安卓)获取系统时间
  9. Android(安卓)动态显示和隐藏状态栏详解
  10. Android(安卓)众多优秀的下拉刷新