2011-02-04 2 views
0

Je suis très nouveau pour le développement Android et je suis confronté à un petit problème ici. Je souhaite créer une classe TextView personnalisée en étendant TextView et utiliser cette classe dans ListView (chaque ligne de ListView contient l'objet de cette classe).Obtenir gonfler l'exception dans Android

J'ai créé ma classe personnalisée comme celui-ci

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

et pour chaque ligne ofmy ListView J'ai créé une structure xml composée d'un TextView, Ma classe personnalisée, et une 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> 

Dans la classe Adapter de ma ListView je récupère la structure comme ceci

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

Mais je me fais exception ployer sur

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

Cependant, si au lieu de mon point de vue personnalisé, ajouter d'un simple textView dans layout.xml (structure de mise en page de chaque rangée de listview) alors tout fonctionne bien

I J'ai cherché des forums mais je ne comprends pas ce que je fais mal.

S'il vous plaît aidez-moi dans ce cas.

+1

pourriez-vous montrer le message d'erreur complet s'il vous plaît? – WarrenFaith

Répondre

1

Je ne sais pas si c'est la cause de votre erreur, mais vos constructeurs appellent la fonction init(), et la fonction init utilise cette variable mPaint.

La variable mPaint est déclarée Paint mPaint;, mais elle n'est jamais instanciée, elle est donc nulle. Vous allez recevoir un nullPointerException là, je pense

Je ne sais pas comment le constructeur de mPaint fonctionne, mais vous devez faire quelque chose comme ça avant de pouvoir l'utiliser:

mPaint = new Paint mPaint(); 

edit: ah : Je vois que votre onDraw() utilise Paint paint = new Paint();. Mais cela pourrait être un peu trop tard?

+0

Merci beaucoup. C'était le seul problème. merci de vous en rendre compte – nikki

+0

Vous n'êtes pas censé instancier des variables à l'intérieur de la méthode de retrait car elle est appelée à l'infini, elle va obstruer votre mémoire –

+0

Cela ressemble à un point solide. – Nanne

Questions connexes