view的宽高的获取和如何有效的取消软键盘
2016-11-16 22:10
323 查看
在android开发中,我们经常会需要去获取一个view的宽度和高度,如果activity页面已经绘制完毕,我们可以利用view.getWidth()或是view.getHeiht()来获取view的宽和高,但如果是在activity的oncreate()和onResume()方法中用这两个方法,它们获取到的结果都是0,因为在oncreate()时,界面处于不可见状态,内存加载组件还没有绘制出来,而在onResume()中,界面还没有显示出来,所以获取不到值。那么如何在这两个activity的生命周期中获取宽和高呢,有以下几种方法
一、测量法 最早的用法
int width =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int height =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
view.measure(width,height);
int height=view.getMeasuredHeight();
int width=view.getMeasuredWidth();
如此即可
二、组件绘制之前的监听
ViewTreeObserver vto =view.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public booleanonPreDraw() {
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
}
三、增加整体布局监听,xlistView中用的就是这种方式
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this); // 记得移出监听,避免内存泄漏
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
}
});
四、延迟加载 后来想到的
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
// int height =view.getWidth(); // 两种获取宽高的方式都行
// int width =view.getHeight();
}
},10);
或者 现在用的最多的
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
// int height =view.getWidth(); / 两种获取宽高的方式都行
// int width =view.getHeight();
}
});
方法四种的两种方法,都是等页面绘制完毕后,然后再调用获取宽高的方法,可以获得数值,最下面的是获取layout中的根节点,一旦UI绘制完成,马上就触发了,延迟的还需要10毫秒,比getWindow().getDecorView()这种方法要慢那么 一点,getWindow().getDecorView()可以看成是new Handler().postDelayed()方法中的延迟0毫秒。
今天遇到一个问题,当页面返回时,有软键盘弹出,为了解这个问题,试了各种常规方法,如配置清单配置软键盘的模式,EditText取消焦点,让其他空间获取焦点等,代码控制让软键盘 消失,都不行。突然想到了延迟加载,在延迟加载加载中执行代码控制软键盘消失,试了试,可以了。
private void hideKeyboard() {
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
InputMethodManager manager = ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE));
manager.hideSoftInputFromWindow(NewsSearchActivity.this.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
});
}
一、测量法 最早的用法
int width =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int height =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
view.measure(width,height);
int height=view.getMeasuredHeight();
int width=view.getMeasuredWidth();
如此即可
二、组件绘制之前的监听
ViewTreeObserver vto =view.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public booleanonPreDraw() {
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
}
三、增加整体布局监听,xlistView中用的就是这种方式
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this); // 记得移出监听,避免内存泄漏
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
}
});
四、延迟加载 后来想到的
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
// int height =view.getWidth(); // 两种获取宽高的方式都行
// int width =view.getHeight();
}
},10);
或者 现在用的最多的
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
int height =view.getMeasuredHeight();
int width =view.getMeasuredWidth();
// int height =view.getWidth(); / 两种获取宽高的方式都行
// int width =view.getHeight();
}
});
方法四种的两种方法,都是等页面绘制完毕后,然后再调用获取宽高的方法,可以获得数值,最下面的是获取layout中的根节点,一旦UI绘制完成,马上就触发了,延迟的还需要10毫秒,比getWindow().getDecorView()这种方法要慢那么 一点,getWindow().getDecorView()可以看成是new Handler().postDelayed()方法中的延迟0毫秒。
今天遇到一个问题,当页面返回时,有软键盘弹出,为了解这个问题,试了各种常规方法,如配置清单配置软键盘的模式,EditText取消焦点,让其他空间获取焦点等,代码控制让软键盘 消失,都不行。突然想到了延迟加载,在延迟加载加载中执行代码控制软键盘消失,试了试,可以了。
private void hideKeyboard() {
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
InputMethodManager manager = ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE));
manager.hideSoftInputFromWindow(NewsSearchActivity.this.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
});
}
相关文章推荐
- Android 如何让EditText不自动获取焦点 在项目中,一进入一个页面, EditText默认就会自动获取焦点。 那么如何取消这个默认行为呢? 在网上找了好久,有点 监听软键盘事件
- Android中的EditView如何不默认获取焦点弹出软键盘,点击EditView后会弹出?
- 带切分的窗口中如何获取某块view的指针
- 获取View的有效屏幕大小
- 如何使用代码动态的获取和设置ImageView的宽度和高度?
- 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题
- 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题
- DataList checkbox status,checkbox入在datalist的itemtemplte,并且这个datalist放在formview中,我该如何获取checkbox的状态?
- 如何在onCreate中获取TextView的宽度
- 如何获取当前视图中成为第一响应者的组件,并取消注册
- 如何动态的获取和设置ImageView的宽度和高度?
- android LinearLayout等view如何获取button效果
- 如何获取当前视图中成为第一响应者的组件,并取消注册
- Android View如何获取焦点
- 如何动态的获取和设置ImageView的宽度和高度?
- 如何在activity的onCreate方法中获取某个view的高度或宽度
- 获取View的有效屏幕大小
- MVC架构下,如何在View中获取ViewName
- ccTouchesBegan 中如何让获取的坐标是相对整个屏幕的坐标,而不是在当前view的坐标
- uitableview如何取消分割线