2014-04-07 3 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 (이벤트);를 추가하여 atclast 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); 
      } 
     } 
    }; 
관련 문제