2017-03-14 40 views
1

目標:我有一個已經包含的功能onTouch,我想保留,但在上添加功能的自定義按鈕。Android:添加setOnTouchListener而不覆蓋現有的?

問題:像這樣添加onTouch將覆蓋原始的自定義按鈕功能,從而不再執行原始的所需行爲。具有註釋「@Override」與否並不能改變什麼:

myButton.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       MainActivity.super.onTouchEvent(event); 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        //Extra behavior needed 
        return true; 
       } 
       return false; 
      } 
     }); 

自定義按鈕本身:

public class CustomButton extends Button implements View.OnTouchListener { 
    ... 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     switch (motionEvent.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       //Original needed behavior. Need to keep. 
       break; 
      ... 
     } 
     return false; 
    } 
    ... 
} 

任何解決方案可以考慮?謝謝!

+0

@Override將只檢查方法是否可用於超類 –

回答

1

你需要調用公共方法的CustomButton類

myButton.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       //try adding this line 
       boolean touchResult = myButton.onTouch(v, event); 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        //Extra behavior needed 
        return true; 
       } 
       return (false||touchResult); 
      } 
     }); 

添加觸摸結果變量可以確保您在兩個地方操作觸摸。

+0

如果我沒有弄錯,這將導致'StackOverFlowException',因爲你在觸摸監聽器中調用'myButton.onTouch()',這將會導致無限再次調用該回調。 – azizbekian

+0

我不確定這種行爲,我猜這裏有兩個獨立的觸摸項。試試這個代碼,還有一個解決方案,我要交叉檢查,雖然 –

+0

我覺得你只是調用函數中相同的功能(遞歸)。看到,你在'CustomButton'類的'onTouch()'函數中。你正在調用'onTouch()'函數。爲什麼它不會導致無窮的遞歸? – azizbekian

1

如果您已經有自定義按鈕實現(CustomButton),你可能需要重寫其setOnTouchListener方法的樣子:

@Override 
public void setOnTouchListener(final OnTouchListener l) { 
    OnTouchListener wrapperListener = new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      boolean myButtonTouchListenerResult = CustomButton.this.onTouch(v, event); 
      boolean wrappedTouchListenerResult = l.onTouch(v, event); 
      return myButtonTouchListenerResult || wrappedTouchListenerResult; 
     } 
    } 
    super.setOnTouchListener(wrapperListener); 
} 

這將確保原始onTouchListener仍然時從外面有人分配另一個實例吧。