Получение завышенного исключения в Android - PullRequest
0 голосов
/ 04 февраля 2011

Я очень плохо знаком с разработкой для 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 и 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>

В классе Adapter моего 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 Ответ

1 голос
/ 04 февраля 2011

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

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

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

mPaint = new Paint mPaint();

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

...