Android:View.setClickable消耗点击事件

时间:2012-04-14 11:44:01

标签: android ontouchlistener clickable

我有一个用于水平滚动的自定义图库视图和几个都可以点击的子视图。

设置childview.setOnClickListener()不起作用,因为它总是消耗触摸事件。

因此,我使用childview.setOnTouchListener()并让其onTouch方法返回false,以便Gallery可以滚动。

这一切都很好。

现在的问题是,childView的onTouch方法只会触发 ACTION_DOWN 事件。 除非我通过设置childview.setClickable()使视图可点击,否则它不会传递 MotionEvent ACTION_UP 。 但是,设置View clickable本身似乎会消耗onTouch事件,以便库视图变为不可滚动。

好像我在这里围成一圈。我会感激任何帮助。

这是我的代码

图库视图:

public class myGallery extends Gallery {

    public myGallery(Context ctx, AttributeSet attrSet) {
        super(ctx, attrSet);
        // TODO Auto-generated constructor stub
    }

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
           return e2.getX() > e1.getX(); 
        }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
      int kEvent;
      if(isScrollingLeft(e1, e2)){ //Check if scrolling left
        kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
      }else{ //Otherwise scrolling right
        kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
      }
      onKeyDown(kEvent, null);
      return true;  
    }
}

在我的活动中:

gallery.setOnItemSelectedListener(new OnItemSelectedListener(){
     public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {


         //  childView.setClickable(true);   // can't use this
                                             // click event would get consumed
                                            // and gallery would not scroll 

         // therefore, I can only use the ACTION_DOWN event below:

         childView.setOnTouchListener(new OnTouchListener() {
              public boolean onTouch(View v, MotionEvent event) {

              switch (event.getAction()) {
                  case MotionEvent.ACTION_DOWN:
                       //doStuff();
              }

              return false;
              }
         });
    }

    public void onNothingSelected(AdapterView<?> arg0) {}
     });
}

2 个答案:

答案 0 :(得分:4)

如果我是你,我会尝试覆盖ViewGroup.onInterceptTouchEvent(...)方法,而不是设置OnTouchListener。这样你就可以拦截触摸事件而不会实际消耗它们。

Check out javadoc

答案 1 :(得分:0)

OnTouch需要返回true表示您想要其他事件。这是一个摘要:

•onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。

From the android dev guid