2014-12-12 8 views
0

두 개의 Buttons이 내 Linear Layout에 있습니다. 내 ButtonsonTouch을 성공적으로 덮어 씁니다. 그래서 내가 그들 위에 뛰어 들면 뭔가가 일어납니다. 또한 을 클릭 할 수 있기를 바 랐으므로 onSingleTapUp을 덮어 씁니다.onSingleTapUp - 버튼을 누르는 경우에만

문제는 onSingleTapUp이 내 Buttons에있을뿐만 아니라 다른 곳에서도 사용할 수 있다는 것입니다. 그렇다면 onSingleTapUp을 화면의 아무 곳이나 두드리는 대신 Buttons의 탭핑 만 참조하도록 만드는 방법이 있습니까?

시도 : 나는 MotionEvent 부울 isButtonPressed(int button) 그래서 나는 다음과 같은 시도가 발견하지만 내 응용 프로그램 충돌 :

클래스 MainActivity :

public class MainActivity extends Activity { 

    protected Button bttn1, bttn2; 
    private GestureDetector mGestureDetector; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mGestureDetector = new GestureDetector(this, new GestureListener()); 

     bttn1 = (Button) findViewById(R.id.bttn1); 
     bttn2 = (Button) findViewById(R.id.bttn2); 

     bttn1.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.d("button1", "click event performed"); 
      } 
     }); 

     bttn1.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
        if(mGestureDetector.onTouchEvent(event)) { 

         return true; 
        } 
        return false; 

      } 
     }); 

     bttn2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.d("button2", "click event performed"); 
      } 
     }); 

     bttn2.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
        if(mGestureDetector.onTouchEvent(event)) { 

         return true; 
        } 
        return false; 

      } 
     }); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 

     boolean eventConsumed=mGestureDetector.onTouchEvent(event); 
      if (eventConsumed) 
      { 
       return true; 
      } 
      else 
       return false; 
    } 

} 

다음
@Override 
public boolean onSingleTapUp(MotionEvent ev) { 
    if (ev.isButtonPressed(1)) 
     Log.d("button", "override - click event performed"); 
    return true; 
} 

내 전체 코드입니다

클래스 제스처 수신기 :

package com.example.swipetest; 

public class GestureListener extends GestureDetector.SimpleOnGestureListener{ 

    @Override 
    public boolean onSingleTapUp(MotionEvent ev) { 
     Log.d("button", "override - click event performed"); 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent ev) { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Log.d("fling", "fling performed"); 
     return true; 
    } 
} 

답변

0

어쩌면 이것은 당신을 도울 것입니다 :

public class MyTouchListener implements OnTouchListener{ 

protected static final String TAG = "MyTouchListener"; 
protected static final boolean D = true; 

public interface MyListener{ 
    public void onTouch(); 
    public void onClick(); 
} 

private MyListener mListener; 
private GestureDetector mGestureDetector; 


private class MyClickListener extends SimpleOnGestureListener{ 

    @Override 
    public boolean onDown(MotionEvent e) { 
     if (D){ 
      Log.d(TAG, "onDown"); 
     } 
     return true; 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent ev) { 
     if (D){ 
      Log.d(TAG, "onSingleTapUp"); 
     } 
     mListener.onClick(); 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if (D){ 
      Log.d(TAG, "onFling"); 
     } 
     return true; 
    } 
} 

public MyTouchListener(Context context, MyListener listener){ 
    mGestureDetector = new GestureDetector(context, new MyClickListener()); 
    mListener = listener; 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    if (D){ 
     Log.d(TAG, "onTouch"); 
    } 
    mListener.onTouch(); 
    mGestureDetector.onTouchEvent(event); 
    return false; 
} 

} 

당신이처럼 사용할 수 있습니다

Button b = (Button) findViewById(R.id.button); 

    b.setOnTouchListener(new MyTouchListener(this, new MyListener() { 

     @Override 
     public void onTouch() { 
      if (D){ 
       Log.d(TAG, "onTouch"); 
      } 
     } 

     @Override 
     public void onClick() { 
      if (D){ 
       Log.d(TAG, "onClick"); 
      } 
     } 
    })); 
+0

이 모두 같은 클래스에? - 라인에서 오류가 발생합니다. b.setOnTouchListener (new MyTouchListener (this, new MyListener() {: 생성자 MyTouchListener (MainActivity, new MyListener() {})가 정의되지 않았습니다 – user2456977

+0

@ user2456977 별도의 클래스. –

+0

감사합니다. 이거 멋지 네요. 그냥 MyTouchListener의 @override onTouch 메서드와 혼동 스럽습니다. 왜 mListener.onTouch() 및 mGestureDetector.onTouchEvent (이벤트)가 필요한가요? 무엇이 필요합니까? – user2456977

관련 문제