2011-02-04 35 views
0

我對Android開發非常陌生,在這裏我遇到了一些小問題。 我想通過擴展TextView來創建一個自定義的TextView類,並在ListView中使用這個類(ListView的每一行都包含這個類的對象)。在Android中獲取充氣異常

我創建了我的自定義類這樣的

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

,併爲每一行ofmy的ListView我創建了一個XML結構,其中包括一個TextView的,我的自定義類,以及圖像

<?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的Adapter類中,我正在檢索像這樣的結構

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

越來越充氣例外。然而,如果不是我的自定義視圖,我在layout.xml添加了一個簡單的TextView(列表視圖中的每一行的佈局結構),那麼一切工作正常

我已經搜索論壇,但我沒有得到我做錯了什麼。

請幫我解決這個問題。

+1

請問您能顯示完整的錯誤信息嗎? – WarrenFaith 2011-02-04 10:24:46

回答

1

我不知道這是你的錯誤的原因,但你的構造函數調用init()函數,而init函數使用那個mPaint變量。

mPaint變量聲明爲Paint mPaint;,但它永遠不會實例化,所以它是空的。你會得到一個nullPointerException在那裏,我想

我不知道mPaint作品的構造,但如何你需要做這樣的事情之前,你可以使用它:

mPaint = new Paint mPaint(); 

編輯:啊:我看到你的onDraw()確實使用Paint paint = new Paint();。但那可能有點太晚了?

+0

非常感謝。這是唯一的問題。 thanx很多搞清楚 – nikki 2011-02-04 11:01:45