问题:
android高版本的手机,已经支持全面屏,还有虚拟导航栏,即取代了低版本的物理按键(例如:home,back,window history键)。由于虚拟导航栏占用了屏幕的高度,而鉴于各厂商的手机rom定制化,往往采用原生的方法无法应用。于是,界面出现了各种问题。
解决方案:
这其实也可认为是系统修复性的方案。
如下:
1.添加工具类AndroidBug54971Workaround
package com.xxxx.xxxx;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
/**
* Created by win7 on 2016/12/14.
*/
public class AndroidBug54971Workaround {
// 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.
/**
* 关联要监听的视图
*
* @param viewObserving
*/
public static void assistActivity(View viewObserving) {
new AndroidBug54971Workaround(viewObserving);
}
private View mViewObserved;//被监听的视图
private int usableHeightPrevious;//视图变化前的可用高度
private ViewGroup.LayoutParams frameLayoutParams;
private AndroidBug54971Workaround(View viewObserving) {
mViewObserved = viewObserving;
//给View添加全局的布局监听器
mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
resetLayoutByUsableHeight(computeUsableHeight());
}
});
frameLayoutParams = mViewObserved.getLayoutParams();
}
private void resetLayoutByUsableHeight(int usableHeightNow) {
//比较布局变化前后的View的可用高度
if (usableHeightNow != usableHeightPrevious) {
//如果两次高度不一致
//将当前的View的可用高度设置成View的实际高度
frameLayoutParams.height = usableHeightNow;
mViewObserved.requestLayout();//请求重新布局
usableHeightPrevious = usableHeightNow;
}
}
/**
* 计算视图可视高度
*
* @return
*/
private int computeUsableHeight() {
Rect r = new Rect();
mViewObserved.getWindowVisibleDisplayFrame(r);
return (r.bottom - r.top);
}
}
2.应用场景
setContentView(R.layout.content_frame);
AndroidBug54971Workaround.assistActivity(findViewById(android.R.id.content));