华为机屏幕高度适配-华为机等底部虚拟键盘遮挡布局内容
华为机等底部虚拟键盘遮挡布局内容
1、解决方案一:使用theme+RelativeLayout (无效)
2、解决方案二:自定义工具类(两种)
第一种 的确是顶上去了,但是顶上去的高度太多了 (未解决)
效果图:

/*** Created by : vince* Created at : 2019/12/20* Desc : 解决虚拟按键遮挡页面布局问题* Usage : 在需要重新布局的Activity的onCreate方法关联视图:AndroidVirtualKey.assistActivity(findViewById(android.R.id.xxx), this)*/import android.app.Activity;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;import java.lang.reflect.Method;
public class AndroidVirtualKey {private View mViewObserved;//被监听的视图private int usableHeightPrevious;//视图变化前的可用高度private ViewGroup.LayoutParams frameLayoutParams;private AndroidVirtualKey(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 AndroidVirtualKey(viewObserving, activity);}/*** 重新设置页面布局* @param activity*/private void resetLayoutByUsableHeight(Activity activity) {WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);//得到wm所管理屏幕(Display)的分辨率int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight();int usableHeightNow = height;/*** 比较布局变化前后的View的可用高度,如果两次高度不一致* 将当前的View的可用高度设置成View的实际高度;如一致* 则无需改变*/if (usableHeightNow != usableHeightPrevious) {mViewObserved.setPadding(0, 0, 0, getHasVirtualKey(activity)); //改变内边距padding-bottommViewObserved.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();return dpi - height;}
}
第二种:成功解决
效果图:

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;import java.lang.reflect.Method;public class AndroidBottomSoftBar {// 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 AndroidBottomSoftBar(viewObserving);}private View mViewObserved;//被监听的视图private int usableHeightPrevious;//视图变化前的可用高度private ViewGroup.LayoutParams frameLayoutParams;private AndroidBottomSoftBar(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);}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
