2014-04-07 121 views
1

我有一個LinearLayout我需要動態地添加自定義視圖。自定義視圖被正確添加。但現在我想設置點擊該視圖。我已經厭倦了。OnClick自定義視圖不起作用

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不working.I不知道我要去的地方錯了。

幫我解決它!

+0

在這種情況下 – Prateek

+0

粘貼您的自定義視圖類即BlockView用來您在打印你的'日誌「或與」吐司「檢查? – Piyush

+0

是的。我也檢查過日誌和烤麪包。它不會進入click()。 – Dig

回答

0

首先,您需要在佈局上添加View(),之後需要註冊clickLisner。

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

localView.setOnClickListener(new OnClickListener() { 

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

我試過了。它仍然沒有工作。 – Dig

+0

請在onTouch()中添加以下代碼行:'super.onTouchEvent(event)'在第一行,在BlockView類中返回true之前; –

+1

謝謝。通過添加super.onTouchEvent(event);至少onclick已經開始工作。爲了使它工作,我必須評論OnTouchListener。但我想要的東西。 – Dig

0

是在onclickListener自動生成的,我的意思是你應該使用View.OnClickListener。如果不使用你不能覆蓋onClickListener

localView.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
    } 
}); 
layoutBox.addView(localView); 
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); 
      } 
     } 
    };