空指针异常呼吁充气布局测量时, [英] Null pointer exception when calling measure on inflated layout

查看:133
本文介绍了空指针异常呼吁充气布局测量时,的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个布局是一个单独的文件,所以我膨胀了。然后,我改变我的观点的文字和图像在我的布局,并呼吁的措施,但我得到一个空指针,当我试着来衡量的布局。我不能为我的生活弄清楚这是为什么。我试图布局最终转换为位图。

 查看inflatedView =((活动)的getContext())getLayoutInflater()膨胀(R.layout.my_layout,空)。

inflatedView.measure(的getWidth(),的getHeight());
inflatedView.layout(0,0,inflatedView.getMeasuredWidth(),inflatedView.getMeasuredHeight());
位图viewAsImage = Bitmap.createBitmap(inflatedView.getWidth(),inflatedView.getHeight(),Bitmap.Config.ARGB_8888);
帆布viewCanvas =新的Canvas(viewAsImage);
 

下面是XML

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =WRAP_CONTENT机器人:layout_gravity =底
    机器人:ID =@ + ID / my_layout
    机器人:背景=@色/ transparent_black>
    < ImageView的机器人:ID =@ + ID / image_left
        机器人:layout_width =48dip机器人:layout_height =48dip
        机器人:layout_centerVertical =真正的机器人:layout_alignParentLeft =真
        机器人:scaleType =fitXY机器人:=了maxWidth48dip机器人:=了maxHeight48dip
        机器人:填充=5dip/>
    < ImageView的机器人:ID =@ + ID / image_right
        机器人:layout_width =WRAP_CONTENT机器人:layout_height =WRAP_CONTENT
        机器人:layout_marginRight =20dip机器人:SRC =@可绘制/箭头
        机器人:layout_centerVertical =真正的机器人:scaleType =fitXY
        机器人:=了maxWidth48dip机器人:=了maxHeight48dip
        机器人:layout_alignParentRight =真/>
    < TextView的Andr​​oid版本:以下属性来=4dip机器人:paddingRight =1dip
        机器人:layout_width =WRAP_CONTENT机器人:layout_height =WRAP_CONTENT
        机器人:layout_toRightOf =@ ID / image_left
        机器人:layout_toLeftOf =@ ID / image_right机器人:ID =@ + ID / some_name
        机器人:MAXLINES =1机器人:ellipsize =结束机器人:TEXTSIZE =20SP
        机器人:文字颜色=@色/白
                    机器人:layout_centerVertical =真
        机器人:TEXTSTYLE =正常/>
< / RelativeLayout的>
 

目前的措施()线,它抛出一个空指针,而我已验证的getWidth和getHeight是给合法的值。

任何想法?

谢谢!

解决方案

措施()抛出空指针异常因为当你吹你的布局也不会读布局高度宽度属性。

就在调用 view.measure()这取决于您所使用的布局类型

添加此行
  

v.measure(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED),MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));

 公共位图getBitmapFromView(RelativeLayout的V){
        v.setLayoutParams(新的LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT));
        v.measure(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED),MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));
        v.layout(0,0,v.getMeasuredWidth(),v.getMeasuredHeight());
        位图B = Bitmap.createBitmap(v.getMeasuredWidth(),v.getMeasuredHeight(),Bitmap.Config.ARGB_8888);

        帆布C =新的Canvas(B);
        v.draw(C);
        返回b;
    }
 

So I have a layout that is a separate file, so I inflate it. Then I change my text views and image in my layout, and call measure, but I get a null pointer when I try to measure the layout. I cannot for the life of me figure out why this is. I'm trying to convert the layout to a bitmap eventually.

View inflatedView  = ((Activity)getContext()).getLayoutInflater().inflate(R.layout.my_layout, null);

inflatedView.measure(getWidth(), getHeight());
inflatedView.layout(0, 0, inflatedView.getMeasuredWidth(),inflatedView.getMeasuredHeight());
Bitmap viewAsImage = Bitmap.createBitmap(inflatedView.getWidth(), inflatedView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas viewCanvas = new Canvas(viewAsImage);

Here is the XML

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:layout_gravity="bottom"
    android:id="@+id/my_layout"
    android:background="@color/transparent_black">
    <ImageView android:id="@+id/image_left"
        android:layout_width="48dip" android:layout_height="48dip"
        android:layout_centerVertical="true" android:layout_alignParentLeft="true"
        android:scaleType="fitXY" android:maxWidth="48dip" android:maxHeight="48dip"
        android:padding="5dip" />
    <ImageView android:id="@+id/image_right"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_marginRight="20dip" android:src="@drawable/arrow"
        android:layout_centerVertical="true" android:scaleType="fitXY"
        android:maxWidth="48dip" android:maxHeight="48dip"
        android:layout_alignParentRight="true" />
    <TextView android:paddingLeft="4dip" android:paddingRight="1dip"
        android:layout_width="wrap_content"         android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image_left"
        android:layout_toLeftOf="@id/image_right"       android:id="@+id/some_name"
        android:maxLines="1" android:ellipsize="end" android:textSize="20sp"
        android:textColor="@color/white"
                    android:layout_centerVertical="true"
        android:textStyle="normal" />
</RelativeLayout>

At the measure() line, it throws a null pointer, and I have verified that getWidth and getHeight are giving legitimate values.

Any ideas?

Thanks!

解决方案

measure() throws Null Pointer Exception because when you inflate you layout it won't read layout height width properties.

Just add this line before calling view.measure() depending upon type of layout you are using

v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

public Bitmap getBitmapFromView(RelativeLayout v) {
        v.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
        v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(b);
        v.draw(c);
        return b;
    }

这篇关于空指针异常呼吁充气布局测量时,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆