目前很多手机去掉了物理按键,使用在屏幕中悬浮虚拟键盘来取代,这样在项目开发时经常会遇到一些问题。由于虚拟键盘占据了屏幕的空间,使得屏幕的实际高度减小,而屏幕的宽度没有发生改变,这样的话,屏幕的适配很困难,我们需要将虚拟键盘隐藏掉:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// main = getLayoutInflater().from(this).inflate(R.layout.main, null);
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
<span style="color:#ffff66;"><span style="background-color: rgb(255, 0, 0);">params.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE; </span> </span>
window.setAttributes(params);
setContentView(R.layout.main);
}
}
红色显示的这一行中View可以选择三个参数:
SYSTEM_UI_FLAG_VISIBLE 导航栏显示
SYSTEM_UI_FLAG_HIDE_NAVIGATION
要求导航栏完全隐藏-->但这对部分硬件设备有效。
隐藏导航栏的效果是只隐藏掉导航栏上面的图标,导航栏依然存在。完全隐藏导航栏可以将导航栏和图标全部隐藏掉,但是当手指接触屏幕的时候,导航栏又会显示出来。
如果页面中显示的是图片的话,那么由于导航栏的影响,图片距离两边的尺寸会发生改变,不符合设计要求。只能将图片的scaletype属性设置为fitXY,让图片充满,这样图片距离边框以及图片之间的尺寸可以符合要求,但是图片显示有点压缩,图片变得又点胖了。
如果导航栏遮挡了布局,导致一些操作无法执行的时候,就不能使用上述方式来进行处理了,在适配的时候就要先获取两次高度,然后对两次的高度进行比较,如果两次的高度不同,那就说明有虚拟键盘,通过两次高度之间的差值来获取虚拟键盘的高度,然后控件的底部添加一个和虚拟键盘等高的view,将被虚拟键盘遮盖住控件顶出来。
private String getDpi() {
WindowManager manager = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm1 = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm1);
int width3 = dm1.widthPixels;
int height3 = dm1.heightPixels;
System.out.println(width3 + "*-----*" + height3);
// 获取刨去虚拟按键高度的
Display defaultDisplay = getWindowManager().getDefaultDisplay();
int width2 = defaultDisplay.getWidth();
int height2 = defaultDisplay.getHeight();
System.out.println(width2 + "*-----" + height2);
// 全部大小
String dpi = null;
Display display = 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.widthPixels + "*" + dm.heightPixels;
System.out.println(dpi);
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
(用全部高度 - 没有虚拟键盘的高度 )/2 就是 下面遮挡的高度