即使调用setWillNotDraw(false),也不会在自定义视图中调用onDraw

时间:2012-11-13 15:08:49

标签: android android-view

所以我有一个名为Square的自定义视图,我想在表格中添加。 当我用文本视图替换正方形时,它可以很好地工作。

我在线搜索了很多,发现我应该在构造函数中调用setWillNotDraw(false)。我这样做没有结果。

这是我的班级广场:

public class Square extends View
{
    private String courseName;
    private String className;
    private String place;
    private Weekdays weekday;
    private int hour;
    private Paint paint;

    public Square(Context context, AttributeSet attrs){
        super(context,attrs);
        setWillNotDraw(false);
    }
    public Square(Context context, String courseName, String className, String place, Weekdays weekday, int hour)
    {
        super(context);

        this.courseName = courseName;
        this.className = className;
        this.place = place;
        this.weekday = weekday;
        this.hour = hour;

        setWillNotDraw(false);

        paint = new Paint();
    }

    public Square(Context context,Weekdays weekdays, int i) {
        super(context);
        this.weekday = weekdays;
        this.hour = i;

        setWillNotDraw(false);

        paint = new Paint();
        paint.setColor(Color.BLACK);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {       
        super.onDraw(canvas);

        canvas.drawText("Hello I'm a test", 1, 30, paint);

    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);


    }

我已经尝试将onMeasure()方法设置为使用10,10或其他任何东西,但没有显示任何内容。我不知道这是否与我的问题有关。

该表是动态制作的:

public class MainActivity extends Activity {

private Controller controller;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    controller = new Controller(this);

    createTable();

}


private void createTable() {

     // get a reference for the TableLayout
    TableLayout table = (TableLayout) findViewById(R.id.tableLayout1);

    /**Create 8 rows*/
    for(int i=0;i<Controller.TABLE_ROW_COUNT;i++){
        // create a new TableRow
        TableRow row = new TableRow(this);

         /** create 5 columns*/
        for(int j=0;j<Controller.TABLE_COLUMN_COUNT;j++){
            Square sq = controller.tableModel.getSquare(Weekdays.values()[j], i);
            row.addView(sq, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        }
        // add the TableRow to the TableLayout
        table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    }

}

谢谢!

3 个答案:

答案 0 :(得分:2)

您的目标SDK版本是什么?如果它是&gt; = 11,硬件加速使GPU缓存您的视图。尝试在构造函数中调用setLayerType(View.LAYER_TYPE_SOFTWARE, null)

答案 1 :(得分:1)

onMeasure替换为以下内容:

public void onMeasure(int wms, int hms){
    setMeasuredDimension(MeasureSpec.getSize(wms), MeasureSpec.getSize(hms));
}

View中的默认(超级)实现将其大小设置为0x0。

您可能需要根据父级调整值以获得不错的大小。

答案 2 :(得分:0)

如果您的活动的硬件加速为TRUE。 然后尝试禁用该ImageView的硬件加速。

imageview.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

为我工作。