Android: NullPointerException when using RelativeLayout with measure()

使用measure()方法计算view的高度时,如果view中含有RelativeLayout布局,就有可能出现这样的错误:

07-13 13:18:34.330: E/AndroidRuntime(12098): java.lang.NullPointerException

07-13 13:18:34.330: E/AndroidRuntime(12098): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:465)

07-13 13:18:34.330: E/AndroidRuntime(12098):at android.view.View.measure(View.java:15297)

……

大概算是Android的一个BUG了,Android4.4.4版本以后就不会有这个问题了。



解决方法是——

判断一下系统版本,如果大于等于4.4.4就无视,否则的话:

  1. 在这个view中不要用RelativeLayout布局了,改成LinerLayout或者FrameLayout啥的……
  2. 在调用measure()方法之前,判断一下view.getLayoutParams()的值,如果为null,就给丫随便设置一个layoutParams。

    view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,desiredHeight));

    当然这样你measure计算的值有可能会不准确,不过起码不会crash了呀……

    呵呵呵呵呵……

推荐用第一个方法。



同步在:http://www.barryzhang.com/archives/423

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-29 10:43:18

Android: NullPointerException when using RelativeLayout with measure()的相关文章

分析java.lang.NullPointerException thrown in RelativeLayout measure()

典型重现环境 机型: Sony Ericsson Android version: 2.3.4 StackTrace: E/AndroidRuntime( 3579): FATAL EXCEPTION: main E/AndroidRuntime( 3579): java.lang.NullPointerException E/AndroidRuntime( 3579): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java

Android 界面布局之RelativeLayout

Android 的 RelaliveLayout 布局的参数定义: android:layout_above="@id/xxx"  --将控件置于给定ID控件之上android:layout_below="@id/xxx"  --将控件置于给定ID控件之下 android:layout_toLeftOf="@id/xxx"  --将控件的右边缘和给定ID控件的左边缘对齐android:layout_toRightOf="@id/xxx&

Android View的绘制流程三部曲 —— Measure

在刚开始学习Java的时候,我看的是Mars老师的视频.Mars老师说过的一句话让我印象很深刻:要有一颗面向对象的心. 如果我们用面向对象的思维方式来思考,就会觉的View的绘制机制是很合理,很科学的.我们要在一张纸上画一幅画,首先要测量一下这幅画有多大吧,然后确定在这张纸的哪个地方画会显得比较美观,最后才是用画笔工具将画绘制在纸上. 在Android中也是一样的.View的绘制流程主要是指measure,layout,draw这三步,即测量,布局,绘制.首先是要测量View的宽高,然后布局确定

Android - NullPointerException

Android中的空指针,感觉出现率,比普通的java出现的概率多得多,今天我无意中发现的NullPointerException,还是想记录下来. 我们知道, 我们的控件一般定义在layout.xml中,所以我们使用findViewById方法去寻找控件的时候,虽然不是通过 R.layout.activity,一般默认生成的代码会在Activity中的onCreate方法中: setContentView(R.layout.activity); 不小心将该行注释了,发现Android报Null

android基础知识复习——RelativeLayout布局属性、背景、半透明设置(XML设置)

转自:http://blog.csdn.net/fansongy/article/details/6817968 复习布局与XML,写了一个空的登录界面.XML的注释我写在当行的后面了.程序运行图: 主函数没有改动,不贴了.背景图片名为:background.jpg .看看main.xml吧. [html] view plaincopyprint? <?xml version="1.0" encoding="utf-8"?> <LinearLayo

Android应用程序窗口View的measure过程

Android应用程序的界面是View组成的,这些View以树形结构组织,它们存在着父子关系,其中,子view位于父view里面,因此,在绘制一个Android应用程序窗口的View之前,我们首先要确定它里面的各个子view在父view里面的大小以及位置.确定各个子view在父view里面的大小以及位置的过程又称为测量过程和布局过程.测量和布局完后,就可以绘制view了. 参考上一篇文章Android应用程序窗口View的创建过程,可以知道Android应用程序窗口的根View是DecorVie

源码分析篇 - Android绘制流程(二)measure、layout、draw流程

performTraversals方法会经过measure.layout和draw三个流程才能将一帧View需要显示的内容绘制到屏幕上,用最简化的方式看ViewRootImpl.performTraversals()方法,如下. private void performTraversals() { ... performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); ... performLayout(lp, mWidth, mHe

Android 如何把一个 RelativeLayout或ImageView背景设为透明

在项目中,需要把RelativeLayout 和  ImageView背景设置为透明,怎么实现呢?这里主要通过代码,请参阅以下关键代码: public ImageView imgDetail; private RelativeLayout rlMain; rlMain= (RelativeLayout) findViewById(R.id.rlMain);//布局 imgDetail = (ImageView)findViewById(R.id.imgDetail); // 图片 //设置背景

Android应用层View绘制流程之measure,layout,draw三步曲

概述 上一篇博文对DecorView和ViewRootImpl的关系进行了剖析,这篇文章主要是来剖析View绘制的三个基本流程:measure,layout,draw,只有把这三个基本流程搞清楚了,平时在自定义View的时候才会有清晰的思路!开始进入正题. View的measure过程 三个流程均是从ViewRootImpl的performTraversals方法开始的,如下所示: private void performTraversals() { ...... int childWidthM