OnClick 自定义视图不起作用
Posted
技术标签:
【中文标题】OnClick 自定义视图不起作用【英文标题】:OnClick on custom view is not working 【发布时间】:2014-04-07 06:38:36 【问题描述】:我有一个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
不起作用。我不知道我哪里出错了。
帮我修一下!!
【问题讨论】:
粘贴您的自定义视图类,在这种情况下为 BlockView 您是否打印在您的Log
或检查Toast
????
是的。我也检查了日志和吐司。它不会在 click() 上进入。
在此处显示您的完整活动课程。
我认为你应该在 onTouchEvent()
方法中返回 false
。
【参考方案1】:
首先您需要在布局上添加视图(),然后需要注册 clickLisner。
layoutBox.addView(localView); // this line will become first.
localView.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
);
【讨论】:
请在 onTouch() 中添加这一行:super.onTouchEvent(event)
在第一行,在 BlockView 类中返回 true 之前;
谢谢。通过添加 super.onTouchEvent(event);,至少 onclick 已经开始工作了。为了让它工作,我必须评论 OnTouchListener。但我想要两样东西。
你为什么要这两样东西?我认为您可以在 setOnClickListner() 本身中编写逻辑?
在 onTouch 上,我必须对图像执行手势(缩放、旋转、翻译)。这就是为什么我需要两者。
好的,那么你可以在最后一行调用super.onTouchEvent(event)
,在你的gestures()函数之后它对两者都有效。【参考方案2】:
onclickListener 是自动生成的,我的意思是你应该使用 View.OnClickListener。如果不使用,则无法覆盖 onClickListener
localView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
);
layoutBox.addView(localView);
【讨论】:
【参考方案3】:试试这个希望对你有帮助
// 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);
;
【讨论】:
以上是关于OnClick 自定义视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Android:具有自定义视图的 AppWidget 不起作用
如果用自定义子类替换默认视图,cornerRadius 不起作用