2012-04-14 10 views
5

私は水平スクロールのためのカスタムギャラリービューと、すべてがクリック可能ないくつかの子ビューを持っています。Android:View.setClickableはクリックイベントを消費する

設定childview.setOnClickListener()は、常にタッチイベントを消費するため動作しません。

したがって、childview.setOnTouchListener()を使用し、そのonTouchメソッドがfalseを返すようにして、ギャラリーがスクロール可能になるようにしました。

これはすべて問題ありません。

問題は今、childViewのonTouchメソッドは、ACTION_DOWNイベントを発生させるだけです。 childview.setClickable()を設定してViewをクリック可能にしない限り、MotionEvent ACTION_UPは渡されません。 しかし、Viewのclickableを設定すると、onTouchイベントが消費されるようになり、ギャラリーViewはスクロールできなくなります。

ここでは円のように見えます。私はどんな助けにも感謝しています。私の活動で

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

答えて

2

私があなただったら、私が代わりにOnTouchListenerを設定するViewGroup.onInterceptTouchEvent(...)メソッドをオーバーライドしようとするだろう。この方法では、実際にそれらを消費することなくタッチイベントを傍受することができるはずです。

Check out javadoc

0

OnTouchはあなたがイベントの残りの部分を望んを示すためにtrueを返す必要があり

は、ここに私のコード

ギャラリーを見るのです。

•onTouch() - これは、リスナーがこのイベントを消費するかどうかを示すブール値を返します。重要なことは、このイベントが互いに続く複数のアクションを持つことができることです。したがって、ダウンアクションイベントが受信されたときにfalseを返すと、そのイベントを消費していないことを示し、このイベントからの後続のアクションにも関心がないことを示します。したがって、指のジェスチャーや最終的な行動イベントなど、イベント内の他のアクションは呼び出されません。

From the android dev guid

+0

ありがとう、私は理解しています。問題は、onTouch()をtrueに設定すると、タッチイベントが消費され、親ビュー(ギャラリー)がイベントを受信しなくなり、ギャラリーがスクロールできなくなるという問題です。 –

+0

このセクションの後半をご覧ください。私はあなたが必要なものを見つけると思う:[http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers] – cstrutton

+0

私は後半に答えを見つけることを試みたが、できなかった任意の迅速な修正があります。 – Prateek

関連する問題