2016-02-23 3 views
0

У меня есть пользовательский ImageButton, и я хочу изменить его образ при нажатии. До сих пор я не мог получить метод onClick внутри кнопки, чтобы выполнить его действие.Пользовательский пользовательский кнопочный прослушиватель не получает вызов

public class FlashButtonView extends ImageButton{ 
private Drawable mFlashOffSrc, mFlashOnSrc, mFlashAutoSrc; 
private Drawable mCurrentFlashMode = mFlashAutoSrc; 

public FlashButtonView(Context context) { 
    super(context); 
} 

public FlashButtonView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context.getTheme().obtainStyledAttributes(attrs, R.styleable.FlashButtonView, 0, 0)); 
} 

public FlashButtonView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(context.getTheme().obtainStyledAttributes(attrs, R.styleable.FlashButtonView, 0, defStyleAttr)); 
} 

private void init(TypedArray typedArray) { 
    try { 
     mFlashAutoSrc = typedArray.getDrawable(R.styleable.FlashButtonView_autoSrcImage); 
     mFlashOnSrc = typedArray.getDrawable(R.styleable.FlashButtonView_onSrcImage); 
     mFlashOffSrc = typedArray.getDrawable(R.styleable.FlashButtonView_offSrcImage); 
    } finally { 
     typedArray.recycle(); 
    } 

    setImageDrawable(mFlashAutoSrc); 
    mCurrentFlashMode = mFlashAutoSrc; 

    setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(mCurrentFlashMode == mFlashAutoSrc) { 
       setImageDrawable(mFlashOnSrc); 
       mCurrentFlashMode = mFlashOnSrc; 
      } 
      else if(mCurrentFlashMode == mFlashOnSrc){ 
       setImageDrawable(mFlashOffSrc); 
       mCurrentFlashMode = mFlashOffSrc; 
      } 
      else{ 
       setImageDrawable(mFlashAutoSrc); 
       mCurrentFlashMode = mFlashAutoSrc; 
      } 
     } 
    }); 
} 

}

И это как мой XML выглядит следующим образом:

<!--.___ Flash on/off switcher __.--> 
<blablabla.FlashButtonView 
    custom:autoSrcImage="@drawable/button_autoflash" 
    custom:offSrcImage="@drawable/button_noflash" 
    custom:onSrcImage="@drawable/button_flash" 
    android:id="@+id/flash" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="@dimen/distance_20dp" 
    android:layout_marginStart="@dimen/distance_20dp" 
    android:layout_marginBottom="@dimen/distance_20dp" 
    android:background="@android:color/transparent" 
    android:clickable="true"/> 

Что я отсутствующей или делать неправильно?

+0

Вы уверены, что init вызван? –

+0

Я, кнопка показывает правильно. Метод onClick никогда не называется. –

ответ

1

Внедрение onTouchEvent() Метод. Что-то вроде этого:

float touched_x, touched_y; 
boolean touched = false; 

@Override public boolean onTouchEvent(MotionEvent event) { 
    touchCounter++; 
    touched_x = event.getX(); 
    touched_y = event.getY(); 
    int action = event.getAction(); 
    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      touched = true; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touched = true; 
      break; 
     case MotionEvent.ACTION_UP: 
      touched = false; 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      touched = false; 
      break; 
     case MotionEvent.ACTION_OUTSIDE: 
      touched = false; 
      break; default: 
    } 
    return true; 
}  
0

Минимальный пример с:

public class CustomButton extends ImageButton { 

    public CustomButton(Context context) { 
     super(context); 
     init(); 
    } 

    public CustomButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     this.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(getClass().getSimpleName(), "ButtonPressed"); 
      } 
     }); 
    } 
} 

и они макет:

<com.example.bossb.test.CustomButton 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

отлично работает для меня.

Смежные вопросы