适配问题,一直是android 开发的一个头疼的事情,常用的方法其实有几种,
1,、在xml 中定义dimen,定义几种分辨率的尺寸,以适应不同分辨率的手机。
2,在代码中oncreate 时候进行对尺寸再次设定,根据屏幕的实际高度宽度等进行二次设定。
3,最近流行的一个新的,在xml中按照比例的设定,不过个人感觉好不算完善,复杂的布局,不太好用。
对于这几种适配,暂时不展开,以后有时间可以展开聊聊。
工作中,在适配时候,发现了一个棘手的问题,那就是魅族的smart bar,smart bar 说白了就是一个虚拟的按键,不过奇怪的是,这个smart bar 在acivity创建的时候,竟然是不包括在屏幕尺寸中的,到时一个问题就是,创建了activity 的时候,如果在屏幕的最底部有显示的话,会被这个smart bar 给盖住,虽然我们很少把控件放在最下面,但是又些时候还是要把一些东西放最下面。但是smart bar盖住了最下面,这些在最下面的显示可能看不到了,控件不能点击了,这是个问题。虽然这个使用的受众不算多,不过也不可忽视。
说多了,其实有办法可以解决这个问题,不过使用的是上面中2提到的适配办法。
解决办法,就是在创建完成屏幕的View的时候,对activity的整体尺寸重新设定,来解决这个适配问题,虽然这个是魅族本身的问题,但是作为开发者,要对这些不能改变的情况进行必要的自我修复。
好,下面来一段相关适配的代码:
private void layoutListener() {
final LinearLayout layout = (LinearLayout) findViewById(R.id.lly_login_layout);
ViewTreeObserver viewTreeObserver = layout.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
layout.getWindowVisibleDisplayFrame(r);
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
if (height > r.bottom) {
widthPixels = width;
heightPixels = r.bottom;
initSize();
}
//防止多次触发
layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
在 onCreate时候添加这段监听,监听整个布局的布局变化,这个时候可以得到布局的尺寸,是真实的尺寸,如果这个尺寸大于了 你布局的尺寸,需要重新对布局的尺寸进行设置,以防smar bar 遮住屏幕的显示。
这样亡羊补牢,也实在是没办法,而原配的android系统的虚拟键,是不需要多此一举的。希望魅族能优化改变