Получение завышенного исключения в Android

Я очень новичок в разработке для Android и столкнулся с небольшой проблемой. Я хочу создать собственный класс TextView, расширив TextView и использовать этот класс в ListView(каждая строка ListView содержит объект этого класса).

Я создал свой собственный класс, как это

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);
}
}

и для каждой строки моего ListView я создал структуру xml, состоящую из TextView,My custom class и изображения

<?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>

В классе адаптера моего ListView я получаю структуру, как это

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);
}

Но я получаю завышенное исключение

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

Однако, если вместо моего собственного представления я добавлю простой textView в layout.xml(структура макета каждой строки списка), то все будет работать нормально.

Я искал форумы, но я не понимаю, что я делаю неправильно.

Пожалуйста, помогите мне в этом случае.

1 ответ

Решение

Я не знаю, является ли это причиной вашей ошибки, но ваши конструкторы вызывают init() функция, и функция init использует это mPaint переменная.

mPaint переменная объявлена ​​как Paint mPaint;, но оно никогда не создается, поэтому оно является нулевым. Вы получите nullPointerException там я думаю

Я не знаю, как конструктор mPaint работает, но вам нужно сделать что-то подобное, прежде чем вы сможете использовать это:

mPaint = new Paint mPaint();

редактировать: ах: я вижу, что ваш onDraw() действительно использует Paint paint = new Paint();, Но это может быть слишком поздно?

Другие вопросы по тегам