我对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的每一行,我创建了一个由TextView,我的自定义类和图像组成的xml结构
<?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(listview的每一行的布局结构),那么一切正常
我搜索了论坛,但我没有得到我做错的事。
请在这种情况下帮助我。
答案 0 :(得分:1)
我不知道这是否是导致错误的原因,但构造函数调用init()
函数,init函数使用mPaint
变量。
mPaint
变量声明为Paint mPaint;
,但它从未实例化,因此它为null。你会在那里得到一个nullPointerException
我不知道mPaint
的构造函数是如何工作的,但是在使用之前你需要做这样的事情:
mPaint = new Paint mPaint();
编辑:啊:我看到你的onDraw()
使用Paint paint = new Paint();
。但那可能有点太晚了?