Getting inflate exception in Android

3.3k views Asked by At

I am very new to Android development and I am facing a little problem here. I want to create a custom TextView class by extending TextView and use this class in ListView(every row of ListView contains this class' object).

I have created my custom class like this

public class CustomTextView extends TextView{

Context context;
Paint mPaint;
String text;

public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public CustomTextView(Context context) {
    super(context);
    init();
}


private void init(){
    setPadding(3, 3, 3, 3);
    mPaint.setTextSize(16);
    mPaint.setColor(Color.GREEN);
    mPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
}

@Override
public void setText(CharSequence text, BufferType type) {

    this.text = (String) text;
    super.setText(text, type);
}


@Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Rect rect = new Rect();
    Paint paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.WHITE);
    paint.setStrokeWidth(3);
    getLocalVisibleRect(rect);
    canvas.drawRect(rect, paint);       
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int reqWidth;
    int reqHeight;

    // width & height mode
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    // specified width & height
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);

    // find out Width based on widthMode
    if(widthMode == MeasureSpec.EXACTLY)
        // set user specified Width
        reqWidth = widthSize;
    else
        // find out the total pixel size required for first and last text
        reqWidth = (int)(mPaint.measureText(text)) ;

    // find out Height based on heightMode
    if(heightMode == MeasureSpec.EXACTLY)
        // set user specified Height
        reqHeight = heightSize;
    else
        // get the default height of the Font
        reqHeight = (int) mPaint.getTextSize();

    // set the calculated width and height of your drawing area
    setMeasuredDimension(reqWidth, reqHeight);
}
}

and for each row ofmy ListView I have created a xml structure consisting of a TextView,My custom class, and an image

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_height="wrap_content" 
 android:gravity="left|center"
 android:layout_width="wrap_content" 
 android:paddingBottom="5px"
 android:paddingTop="5px" 
 android:paddingLeft="5px">
 <TextView android:id="@+id/TextView01" 
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" 
 android:layout_marginRight="5dip"
 android:gravity="center"
 android:background="@drawable/bg" 
 android:textColor="#FFFF00"
 android:text="hi"/>

<!--<TextView android:id="@+id/TextView02" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"
android:layout_marginLeft="10px" 
android:text="hi"/>

-->
<com.example.CustomTextView  
    android:id="@+id/TextView02"
    android:layout_width="fill_parent" 
    android:layout_height="50px"

/>   


<ImageView android:id = "@+id/image"
android:src="@drawable/icon"
android:layout_width = "50dip"
android:layout_height = "50dip"

/>
</AbsoluteLayout>

In the Adapter class of my ListView I am retrieving the structure like this

public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
         convertView =  mInflator.inflate(R.layout.listview, null);

         convertView.setMinimumHeight(80);

         holder = new ViewHolder();
         holder.text = (TextView) convertView
         .findViewById(R.id.TextView01);


         holder.text2 = (CustomTextView) convertView
         .findViewById(R.id.TextView02);
}

But I am getting inflate exception on

 convertView =  mInflator.inflate(R.layout.listview, null);

However, if instead of my custom view , I add a simple textView in layout.xml(layout structure of each row of listview) then everything works fine

I have searched forums but I am not getting what i am doing wrong.

Please help me in this case.

1

There are 1 answers

2
Nanne On BEST ANSWER

I don't know if this is the cause of your error, but your constructors call the init() function, and the init function uses that mPaint variable.

The mPaint variable is declared as Paint mPaint;, but it is never instantiated, so it is null. You'll be getting a nullPointerException there i think

I don't know how the constructor of mPaint works, but you need to do something like this before you can use it:

mPaint = new Paint mPaint();

edit: ah: i'm seeing that your onDraw() does use Paint paint = new Paint();. But that might be a bit too late?