公司的项目,需要适配新手机的虚拟按键
走了一些弯路,也积累了一些经验教训,分享给大家。
1、最终解决方案
1、在AndroidManifest.xml 文件中,加入如下代码,这段代码为谷歌官方的解决全面屏的方案,详细的可以百度。或者 参考 Android APP适配全面屏手机的技术要点
<meta-data
android:name="android.max_aspect"
android:value="2.1" />
2、使你的Activity使用如下的Theme
<style name="ActivityTheme" parent="Theme.AppCompat.Light.NoActionBar"></style>
此时就可以实现虚拟按键的适配了。
如果你还要有沉浸式等需求,可以在baseActivity中
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// //透明导航栏
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
如下图 序号1
image.png
2、较好的解决方案,此方案有瑕疵,但肯定是万能的。
就是用一个工具类,对屏幕对大小进行计算。使用方法如上图中对序号2.
工具类如下:
/**
* Created by zhangyushui on 2019/3/18.
*/
public class AndroidBottomSoftBar {
private View mViewObserved;//被监听的视图
private int usableHeightPrevious;//视图变化前的可用高度
private ViewGroup.LayoutParams frameLayoutParams;
private AndroidBottomSoftBar(View viewObserving, final Activity activity) {
mViewObserved = viewObserving;
//给View添加全局的布局监听器
mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
resetLayoutByUsableHeight(activity);
}
});
frameLayoutParams = mViewObserved.getLayoutParams();
}
/**
* 关联要监听的视图
*/
public static void assistActivity(View viewObserving, Activity activity) {
new AndroidBottomSoftBar(viewObserving, activity);
}
private void resetLayoutByUsableHeight(Activity activity) {
WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
// 计算视图可视高度
int usableHeightNow = height;
//比较布局变化前后的View的可用高度
if (usableHeightNow != usableHeightPrevious) {
//如果两次高度不一致
//将当前的View的可用高度设置成View的实际高度
// frameLayoutParams.height = usableHeightNow;
mViewObserved.setPadding(0, 0, 0, getHasVirtualKey(activity));
mViewObserved.requestLayout();//请求重新布局
usableHeightPrevious = usableHeightNow;
}
}
/**
* dpi 通过反射,获取包含虚拟键的整体屏幕高度
* height 获取屏幕尺寸,但是不包括虚拟功能高度
*
* @return
*/
public static int getHasVirtualKey(Activity activity) {
int dpi = 0;
Display display = activity.getWindowManager().getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
dpi = dm.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
int height = activity.getWindowManager().getDefaultDisplay().getHeight();
int h=dpi - height;
if (h>dpi*0.08){
h= (int) (dpi*0.06);
}
return h;
}
}
网友评论