(记录学习android遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题
来源:互联网 发布:吸烟罚款 知乎 编辑:程序博客网 时间:2024/06/09 16:10
今天写小程序 我遇到这样的问题,我在代码中有很多画要出的控件,需要根据一个被权重weight分配的TextView的高度,计算后得到控件的高度。
然后就在 如何完美得到这个TextView的高度并画上其他控件 让我这个小白做了好久 。
没兴趣看小白摸爬滚打的可以直接看最后。
首先 getHeight() 是初始化屏幕图像时得到的高度数据 ,最多只是你屏幕的高度,
并且你花的控件和这个TextView都在onCreate时出现在屏幕上时,getHeight()得到的值是0,
也就是在用weigth时 android:layout-height=“0dp” 的0。
另外有个getMeasuredHeight() ,可以得到一个控件的全部高度,这个高度包括控件在屏幕的视线外的高度
通过询问我培训班的老师,告诉我正确的百度姿势,百度 再oncreate里得到控件的高度
于是我得到第一个方法
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
imageView.measure(w, h);
//他说这个就是需要得到的控件的高
int height =imageView.getMeasuredHeight();
然而我Log出来的值是55 (后面做正确后得到的是135) 成像比预计的小点
原谅小白我第一次见到getMeasuredHeight() ,我以为他返回的是dp值(其实int a=getMeasuredHight()得到的是px)
就百度了dp转px的代码
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */
public int dip2px(Context context, float dpValue) {
//他说scale 是当前设备的分辨率 我的魅族4和模拟机三星Gs5这个值都是3.0f
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
然而最后成像反而大了一些,小白这时都像我手足无措,尝试修改代码找哪出bug了。
百度所有不认识的方法都无果后(很多难的方法都是代码一大堆,不说主要作用是什么,让小白怎么学)
在询问老师的过程中对找的获取控件的 高的代码 准确性产生怀疑。接着老师建议我使用ViewTreeObserver的OnGlobalLayoutListener()
ViewTreeObserver是用来帮助我们监听某些View的某些变化的。OnGlobalLayoutListener()说是监听控件发生变化时调用
...OnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//移除该监听器
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());
}
});
然而值得注意的是
1.该监听器是在整个页面画完后调用 也就是如果画控件的代码直接写在类似这段代码的屁股后面。
那么你那些要得到这个高度进行画的控件将会把高度设为0画完后再调用到这个监听器,
2.该监听器会一直调用,需要移除这个监听器。
于是我吧我画控件的代码写在了public void onGlobalLayout() 里 由于第一次我没有移除这个监听器 他就拼命的画。
就移除了这个监听器。话说我原先也是用匿名内部类移除时却说OnGlobalLayoutListener抽象的不能实例化。
可能当时我哪打错了吧 反正小白不怕累,吧监听器写成声明对象。搞定
ViewTreeObserver.OnGlobalLayoutListener m=null;
m = new ViewTreeObserver.OnGlobalLayoutListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onGlobalLayout() {
//得到高度 我所有的控件都在屏幕里所以就不用getMeasuredHeight() 了
height = aa.getHeight();
Log.e("ssh", "TextView控件高height" + height);
itemHeight = height;
//如果得到了要的高度
if (itemHeight!=0)
{
//移除这个监听器removeOnGlobalLayoutListener是16以上用的 removeGlobalLayoutListener是16以下用的
//反正我自己写着玩就用16以上的api了
aa.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//这是我画控件的常量数据
marTop = getResources().getDimensionPixelSize(R.dimen.weekItemMarTop);
marLeft = getResources().getDimensionPixelSize(R.dimen.weekItemMarLeft);
// 数据
getData();
//循环画控件
for (int i = 0; i < weekPanels.length; i++) {
weekPanels[i] = (LinearLayout) findViewById(R.id.weekPanel_1 + i);
initWeekPanel(weekPanels[i], courseData[i]);
}
}
}
};
//添加监听器 aa是我的TextView
aa.getViewTreeObserver().addOnGlobalLayoutListener(m);
- (记录学习android遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题
- Android之使用weight属性实现控件的按比例分配空间
- 自定义控件里面获取控件的高度遇到的问题。
- "SurfaceView控件"-出现的问题记录
- Combox控件的高度问题
- Android使用自定义控件遇到的问题及解决
- Android 拖拉控件遇到的问题
- 使用Recyclerview控件遇到的一些问题
- Android开发中使用Spinner控件出现的问题
- 关于布局中控件的优先加载(Weight)问题
- 关于.ocx和.dll控件注册遇到的问题记录
- Android控件拖动后控件回到原点的问题
- datagrid控件在排序后出现问题的解决方法
- ASP.NET验证控件出现问题后的解决方案
- [问题记录] win7 32位 使用Android studio 新建工程后遇到的几个小问题
- android LinearLayout的weight问题
- android的xml控件遇到的问题(1)
- android遇到的问题记录
- 2013 高斯日记
- opencv 3.1模块+扩展模块 解析
- 10.Smarty3:缓存控制
- Java大数之大数比大小compareTo()和equals()的用法
- 全站编码过滤器EncodingFilter
- (记录学习android遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题
- 并查集
- hibernate映射详解:一对一映射的两种实现方式
- 关于Android studio 2.0beta5最近提示的Plugin is too old
- 十分钟搭建 Neural Style 服务
- Python进阶学习小结-1.md
- Sphinx中通过mysql客户端访问Sphinx,实现实时索引,需要注意的要点
- jquery-ajax-php(内容点赞并进行cookie限制实现)
- Objective_C系统自带生成二维码