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.
I don't know if this is the cause of your error, but your constructors call the
init()
function, and the init function uses thatmPaint
variable.The
mPaint
variable is declared asPaint mPaint;
, but it is never instantiated, so it is null. You'll be getting anullPointerException
there i thinkI don't know how the constructor of
mPaint
works, but you need to do something like this before you can use it:edit: ah: i'm seeing that your
onDraw()
does usePaint paint = new Paint();
. But that might be a bit too late?