OnClick自定义视图无效

时间:2014-04-07 06:38:36

标签: android dynamic view onclick

我有LinearLayout我需要动态添加自定义视图。自定义视图已正确添加。但现在我想点击该视图。我累了。

BlockView localView = new BlockView(getApplicationContext(),
                BitmapFactory.decodeFile(imagePath);

localView.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    }
});
layoutBox.addView(localView);

BlockView.java

public class BlockView extends View{

    Bitmap mBitmap;

    Drawable mDrawable;
    private int drawableWidth, drawableHeight;
    private int viewWidth, viewHeight, layoutHeight, layoutWidth;
    private Matrix matrix = new Matrix();
    private Paint mBorderPaint;

    public BlockView(Context c) {
        super(c);
        setFocusable(true);
    }

    public BlockView(Context c, AttributeSet attrs) {
        super(c, attrs);
        setDrawingCacheEnabled(true);
    }

    public BlockView(Context paramContext, Bitmap bmp, int layoutHeight,
            int layoutWidth) {
        super(paramContext);
        this.mBitmap = bmp;
        this.layoutHeight = layoutHeight;
        this.layoutWidth = layoutWidth;
        mBorderPaint = new Paint();
        // mBorderPaint.setAntiAlias(true);
        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setColor(Color.GREEN);
        mBorderPaint.setStrokeWidth(10);
        setDrawingCacheEnabled(true);
        buildDrawingCache(true);

        mDrawable = new BitmapDrawable(getResources(), mBitmap);
    }

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

        drawableWidth = mDrawable.getIntrinsicWidth();
        drawableHeight = mDrawable.getIntrinsicHeight();

        viewWidth = layoutWidth;
        viewHeight = layoutHeight;

        setMeasuredDimension(viewWidth, viewHeight);
    }

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

            int saveCount = canvas.save();

            float scale;
            float dx;
            float dy;

            if (drawableWidth <= viewWidth && drawableHeight <= viewHeight) {
                scale = 1.0f;
            } else {
                scale = Math.min((float) viewWidth / (float) drawableWidth,
                        (float) viewHeight / (float) drawableHeight);
            }

            dx = (int) ((viewWidth - drawableWidth * scale) * 0.5f + 0.5f);
            dy = (int) ((viewHeight - drawableHeight * scale) * 0.5f + 0.5f);

            matrix.setScale(scale, scale);
            matrix.postTranslate(dx, dy);

            canvas.concat(matrix);

            mDrawable.setBounds(0, 0, drawableWidth, drawableHeight);
            mDrawable.draw(canvas);

            canvas.restoreToCount(saveCount);
        } catch (Exception ex) {
            Log.e("onDraw: ", ex.getMessage());
            ex.printStackTrace();
        }       
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return true;
    }

}

但是onClick没有用。我不知道我哪里出错了。

帮我解决一下!!

3 个答案:

答案 0 :(得分:0)

首先你需要在布局上添加View(),之后需要注册clickLisner。

layoutBox.addView(localView);  // this line will become first.

localView.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    }
});

答案 1 :(得分:0)

是否自动生成了onclickListener,我的意思是你应该使用View.OnClickListener。如果未使用,则无法覆盖onClickListener

localView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
    }
});
layoutBox.addView(localView);

答案 2 :(得分:0)

试试这个希望它会帮助你

//   viewHolder is your View Custom view    

    @Override
    public void setOnClickListener(OnClickListener l) {
        if (l == null) {
            viewHolder.setOnClickListener(null);
            mParentOnClickListener = null;
        } else {
            viewHolder.setOnClickListener(mOnClickListener);
            mParentOnClickListener = l;
        }
    }

    private View.OnClickListener mParentOnClickListener;
    private View.OnClickListener mOnClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mParentOnClickListener != null) {
                mParentOnClickListener.onClick(YourCustomView.this);
            }
        }
    };