2012-04-14 59 views
5

我有一個自定義的畫廊視圖水平滾動和幾個子視圖,所有應該是可點擊的。Android:View.setClickable消耗點擊事件

設置childview.setOnClickListener()不起作用,因爲它總是消耗觸摸事件。

因此,我使用了childview.setOnTouchListener()並讓它的onTouch方法返回false,以便圖庫變爲可滾動。

這很好。

現在的問題是,childView的onTouch方法只觸發事件的ACTION_DOWN事件。 它不會通過MotionEvent ACTION_UP,除非我通過設置childview.setClickable()使該視圖可點擊。 但是,設置視圖可點擊本身似乎消耗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) {} 
    }); 
} 
+0

你在下半場得到了答案。 – Prateek 2013-01-24 09:54:28

回答

2

如果我是你,我會嘗試重寫ViewGroup.onInterceptTouchEvent(...)方法,而不是設置OnTouchListener。這樣,您應該能夠在觸摸事件中進行攔截,而無需實際使用它們。

Check out javadoc

0

OnTouch需要返回true,表示你想要的事件的其餘部分。這是一個execerpt:

•onTouch() - 這將返回一個布爾值來指示您的偵聽器是否使用此事件。重要的是,這個事件可以有多個相互關聯的動作。因此,如果您在收到向下操作事件時返回false,則表示您沒有使用該事件,並且對此事件的後續操作也不感興趣。因此,您不會被要求在事件中執行任何其他操作,例如手指手勢或最終上行動作事件。

From the android dev guid

+0

謝謝,我明白了。問題是,如果我將onTouch()設置爲true,那麼觸摸事件就會消耗掉,並且父視圖(圖庫)不再接收事件,即圖庫變得不可滾動。 – 2012-04-14 12:36:35

+0

查看本節的後半部分。我想你會找到你所需要的:[http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers] – cstrutton 2012-04-14 13:10:04

+0

我試着在下半場找到答案,但不能,你呢有任何快速修復。 – Prateek 2013-01-24 09:54:54