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 自定义视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS swift中的自定义视图出口在视图控制器中不起作用

Android:具有自定义视图的 AppWidget 不起作用

如果用自定义子类替换默认视图,cornerRadius 不起作用

具有自定义视图的 UIButton - addTarget:action:forControlEvents: 不起作用

Android自定义视图不起作用

getView() 在我的自定义列表视图中不起作用